quodlibet-3.5.3/0000755000175000017500000000000012646427760013756 5ustar lazkalazka00000000000000quodlibet-3.5.3/docs/0000755000175000017500000000000012646427760014706 5ustar lazkalazka00000000000000quodlibet-3.5.3/docs/features.rst0000644000175000017500000000551212501341560017240 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.5.3/docs/translation/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017244� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/translation/index.rst����������������������������������������������������������0000644�0001750�0001750�00000000126�12607265240�021072� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Translation Guide ================= .. toctree:: :titlesonly: howto faq ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/translation/howto.rst����������������������������������������������������������0000644�0001750�0001750�00000005231�12607265240�021125� 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 <http://www.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.5.3/docs/translation/faq.rst������������������������������������������������������������0000644�0001750�0001750�00000010550�12607265240�020534� 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 <http://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 <http://developer.gnome.org/gtk/2.24/GtkLabel.html#id727933>`_ - 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.5.3/docs/guide/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016003� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/config_files.rst���������������������������������������������������������0000644�0001750�0001750�00000004027�12501341560�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.5.3/docs/guide/renaming_files.rst�������������������������������������������������������0000644�0001750�0001750�00000012007�12501341560�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.5.3/docs/guide/stats_rating.rst���������������������������������������������������������0000644�0001750�0001750�00000002344�12501341560�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.5.3/docs/guide/tags/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016741� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/tags/index.rst�����������������������������������������������������������0000644�0001750�0001750�00000000141�12501341560�020555� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tags ==== .. toctree:: :titlesonly: tags internal_tags tied_tags patterns �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/tags/internal_tags.rst���������������������������������������������������0000644�0001750�0001750�00000011341�12646426641�022322� 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, including :ref:`roles <PerformerRoles>` * ``~people``: A list of all people involved in the song * ``~rating``: A string representation of the song's rating (e.g. ★★★☆) * ``~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. Note there is a ``~people:real`` specialisation `added in #1034 <https://github.com/quodlibet/quodlibet/issues/1034>`_ which excludes *Various Artists*, commonly used as a placeholder for album artists on compilations, etc. 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) * ``~#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 * ``~#filesize``: The total filesize of all songs 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``) * ``min``: Returns the smallest value (``~#year``) * ``max``: Returns the largest value (``~#added``, ``~#lastplayed``, ``~#laststarted``, ``~#mtime``) * ``bav``: Returns the `Bayesian average <http://en.wikipedia .org/wiki/Bayesian_average>`_ value (``~#rating``) Being most appropriate for ratings, it is adjusted globally under the preferences for ratings. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/tags/patterns.rst��������������������������������������������������������0000644�0001750�0001750�00000006677�12607265240�021341� 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 sonething 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.5.3/docs/guide/tags/tags.rst������������������������������������������������������������0000644�0001750�0001750�00000006032�12646426641�020427� 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. 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`` (since 3.1.0) 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) are the same (remove 'CD1/2' etc.). In case you used the musicbrainz plugin and each disc got a different ``musicbrainz_albumid``, add a nonempty ``labelid`` to all songs. ''Two albums have the same name and are merged.'' Add a nonempty labelid to one of the albums, or use the musicbrainz plugin to get a `musicbrainz_albumid` 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.5.3/docs/guide/tags/tied_tags.rst�������������������������������������������������������0000644�0001750�0001750�00000002362�12501341560�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.5.3/docs/guide/overview.rst�������������������������������������������������������������0000644�0001750�0001750�00000011402�12501341560�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 the option to add a bookmark for the current song position. * 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. The queue takes precedence whenever it has songs, but 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 *Music* > *Browse Library* or in the tray icon plugin context menu. In an 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 *Music* > *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. You may also check the *watch this folder for new songs*. If you want to change folder settings later, you can in the preferences window. 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.5.3/docs/guide/searching.rst������������������������������������������������������������0000644�0001750�0001750�00000013626�12604031045�020465� 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 <http://en.wikipedia.org/wiki/Neutral_Milk_Hotel>`_ including the solo performances of `Jeff Mangum <http://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 <http://en.wikipedia.org/wiki/The_Smiths>`_:: !|(classical, smiths) While these searches are easy to type in, they depend on the visible colums and the active browser, also the last one might exclude some songs wich happen to contain "smiths" in their album title. 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. 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 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 <http://www.thewho.net/>`_ or guitarist `Pete Townshend <http://www.petetownshend.co.uk/>`_ . 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. 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://regexpal .com/>`_) Some examples: * ``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! ����������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/index.rst����������������������������������������������������������������0000644�0001750�0001750�00000000407�12607265240�017633� 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.5.3/docs/guide/interacting.rst����������������������������������������������������������0000644�0001750�0001750�00000007506�12607265240�021042� 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 <http://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.5.3/docs/guide/commands/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017604� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/commands/exfalso.rst�����������������������������������������������������0000644�0001750�0001750�00000003540�12607265240�021767� 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.org/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.org/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.org/en/latest/guide, | https://quodlibet.readthedocs.org/en/latest/guide/faq.html ����������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/commands/index.rst�������������������������������������������������������0000644�0001750�0001750�00000000145�12607265240�021433� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Command Manuals =============== .. toctree:: :titlesonly: quodlibet exfalso operon ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/commands/Makefile��������������������������������������������������������0000644�0001750�0001750�00000000176�12607265240�021236� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MANDIR=../../../data all: $(MANDIR)/exfalso.1 $(MANDIR)/quodlibet.1 $(MANDIR)/operon.1 $(MANDIR)/%.1:%.rst rst2man $< > $@ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/commands/operon.rst������������������������������������������������������0000644�0001750�0001750�00000014365�12607265240�021637� 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 COMMANDS ======== help ---- operon help [<command>] Example: operon help list SEE ALSO ======== | ``regex``\(7) | ``exfalso``\(1) | ``quodlibet``\(1) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/commands/quodlibet.rst���������������������������������������������������0000644�0001750�0001750�00000014110�12607265240�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.org/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 or restart if near the beginning --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 --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-playing Begin playing immediately --status Print playing status --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.org/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.org/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.org/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.org/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.org/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.org/en/latest/guide, | https://quodlibet.readthedocs.org/en/latest/guide/faq.html, | ``regex``\(7), ``gst-launch``\(1) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/images/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017250� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/images/main_overview.png�������������������������������������������������0000644�0001750�0001750�00000130766�12501341560�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.5.3/docs/guide/images/queue.png���������������������������������������������������������0000644�0001750�0001750�00000027425�12501341560�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.5.3/docs/guide/images/plugins.png�������������������������������������������������������0000644�0001750�0001750�00000115306�12501341560�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.5.3/docs/guide/images/PlaylistBrowser.png�����������������������������������������������0000644�0001750�0001750�00000335273�12501341560�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.5.3/docs/guide/images/browser_window.png������������������������������������������������0000644�0001750�0001750�00000111372�12501341560�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.5.3/docs/guide/browse/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017304� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/browse/iradio.rst��������������������������������������������������������0000644�0001750�0001750�00000001356�12501341560�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.5.3/docs/guide/browse/paned.rst���������������������������������������������������������0000644�0001750�0001750�00000007054�12607265240�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 <http://www.apple.com/uk/itunes/what-is/player.html>`_. 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. Besides normal tags, each pane also supports tied tags, tag patterns, and a per-entry display pattern. Example ------- ==================================== ================================ Pattern Result ==================================== ================================ ``~~year~album`` 2011 - This is an album title ``<~year|<~year>. <album>|<album>>`` 2011\. This is an album title ==================================== ================================ Unlike when using patterns for renaming files, songs with multiple values per tag will be split up in multiple entries. For a song with two performers, the pattern ================================================= ====================== Pattern Result ================================================= ====================== ``<~year|<~performers> - <~year>|<~performers>>`` Performer 1 - 2011 .. Performer 2 - 2011 ================================================= ====================== Using Markup ^^^^^^^^^^^^ Also it's possible to change text emphasis using the `Pango markup language <http://library.gnome.org/devel/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.5.3/docs/guide/browse/overview.rst������������������������������������������������������0000644�0001750�0001750�00000003443�12515146372�021700� 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 (primary) browser active. Depending on which browser you're using, different options will be available in the *Filters* menu and context menus. For example, the Search Bar can filter by anything, but there's no way to get a "top 40" in the Album List. 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 *Music* → *Browse Library*. You can have multiple of these open at once, and they will all react to changes to your library underneath. No Browser ---------- If you select *Disable Browser*, whatever browser you were using just disappears. You can still browse your library with the *Filters* menu, but you can't search manually. 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 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`) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/browse/playlists.rst�����������������������������������������������������0000644�0001750�0001750�00000012241�12501341560�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.5.3/docs/guide/browse/search.rst��������������������������������������������������������0000644�0001750�0001750�00000001242�12501341560�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.5.3/docs/guide/browse/index.rst���������������������������������������������������������0000644�0001750�0001750�00000000274�12501341560�021127� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Browse: Browsing Your Library ===================== .. toctree:: :titlesonly: overview playlists search album paned filesystem iradio audiofeeds ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/browse/filesystem.rst����������������������������������������������������0000644�0001750�0001750�00000001077�12501341560�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.5.3/docs/guide/browse/audiofeeds.rst����������������������������������������������������0000644�0001750�0001750�00000001005�12501341560�022121� 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 bolded 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.5.3/docs/guide/browse/album.rst���������������������������������������������������������0000644�0001750�0001750�00000005412�12501341560�021117� 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 identifcation 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 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.5.3/docs/guide/editing_tags.rst���������������������������������������������������������0000644�0001750�0001750�00000007701�12501341560�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.5.3/docs/guide/faq.rst������������������������������������������������������������������0000644�0001750�0001750�00000026463�12646426641�017314� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Frequently Asked Questions ========================== Installation ------------ Does Quod Libet require GNOME? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ No, but we recommend you install the GNOME libraries and Python bindings when using Quod Libet. If they are installed, Quod Libet will use your default GNOME audio options. I'm running Gentoo / Arch, and... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We are not the first line of support for `Gentoo Linux <http://gentoo.org/>`_. If you are running Gentoo and experience problems, file a bug on the `Gentoo bug tracking system <http://bugs.gentoo.org>`_. The same goes for Arch... and any other distribution-specific problems. General ------- 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 *Music* → *Preferences*. Why can't I double-click a song in GNOME to play in Quod Libet? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can! File association is more to do with the file manager you're using. If you're using GNOME, right-click on the audio file in Nautilus and select 'Properties'. Go to the 'Open with' tab, then select the 'Add' button. In the 'Use custom command' text field add the following: ``quodlibet --play-file %F`` and then click 'add'. Now you can select 'quodlibet' from the list of programs to open that file. Double-click the file and Quod Libet will start to play it. Note this will *only work is Quod Libet is currently running*, though a workaround is to make a script that starts ``quodlibet`` first (only one instance is ever loaded unless in dev mode). My filenames with special characters (ú, ç, はあ, etc.) don't appear properly ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Unless told otherwise Quod Libet assumes your filesystem is using UTF-8 filenames (this is a standard assumption for GTK+ applications). To tell it otherwise, ``export G_FILENAME_ENCODING="iso-8859-1"` (or whatever value you need) in your ``~/.bashrc`` or other appropriate place. You can also use the magic value `@locale` to use the default character encoding for your locale. 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 I want keyboard shortcuts to change browsers (or anything else) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Put ``gtk-can-change-accels = 1`` in ``~/.gtkrc-2.0`` (and restart Quod Libet). Then hover the mouse over the menu item you want to set an accelerator for, and press that key. When using GNOME this setting can be toggled in *Menus and Toolbars* in the GNOME settings. 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. Player ------ 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 ``labelid`` tags (it's best if you use the actual label catalog ID, but if you can't find it you can also just use any different values). You can also use ``musicbrainz_albumid`` tags, which several other taggers 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 `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 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). Tag Editing ----------- 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. Other stuff ----------- 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>`. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/shortcuts.rst������������������������������������������������������������0000644�0001750�0001750�00000003337�12607265240�020567� 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:`0`/:kbd:`1`/:kbd:`2`/:kbd:`4` - Rate the selected song(s) with 0-4 stars * :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.5.3/docs/guide/playback/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017571� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/playback/index.rst�������������������������������������������������������0000644�0001750�0001750�00000000116�12501341560�021407� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Playback ======== .. toctree:: :titlesonly: backends replaygain ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/playback/replaygain.rst��������������������������������������������������0000644�0001750�0001750�00000007140�12501341560�022437� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _replaygain: Replay Gain =========== `Replay Gain <http://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 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.hydrogenaudio.org/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 a 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.5.3/docs/guide/playback/backends.rst����������������������������������������������������0000644�0001750�0001750�00000005714�12607265240�022072� 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. There is also an experimental `Mac OS X NSSound backend (macbe) <https://github.com/quodlibet/quodlibet/issues/509>`_ available in the issue tracker. GStreamer Backend ----------------- Custom Pipelines ^^^^^^^^^^^^^^^^ It's possible to attach a custom GStreamer pipeline to the player backend under *Music* → *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 *Music* → *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 <http://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 alsa you can get a list of available devices by executing:: python -c 'import gst; sink = gst.element_factory_make("alsasink");sink.probe_property_name("device"); print "\n".join(sink.probe_get_values_name("device"))' which should give you something like:: hw:0,0 hw:0,1 hw:2,0 and a pipeline using hw:2,0 looks like:: alsasink device=hw:2,0 And similar for pulseaudio:: python -c 'import gst; sink = gst.element_factory_make("pulsesink");sink.probe_property_name("device"); print "\n".join(sink.probe_get_values_name("device"))' which outputs something like:: alsa_output.pci-0000_00_1b.0.analog-stereo and the pipeline should look like:: pulsesink device=alsa_output.pci-0000_00_1b.0.analog-stereo 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.5.3/docs/guide/playback/images/���������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�021036� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/guide/playback/images/replaygain_plugin.png������������������������������������0000644�0001750�0001750�00000043130�12501341560�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.5.3/docs/guide/playback/images/replaygain_pref.png��������������������������������������0000644�0001750�0001750�00000011172�12501341560�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.5.3/docs/guide/playback/images/replaygain_force.png�������������������������������������0000644�0001750�0001750�00000027423�12501341560�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.5.3/docs/contact.rst��������������������������������������������������������������������0000644�0001750�0001750�00000002256�12607265240�017066� 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. Reporting Bugs -------------- The best way to report bugs is using the GitHub issue tracker. * `Add a new bug <https://github.com/quodlibet/quodlibet/issues/new>`_ * `Show current bugs <https://github.com/quodlibet/quodlibet/issues>`_ For tips on how to report bugs see :ref:`the Contributing Guide <BugReports>` Mailing List ------------ If you're not sure if the behavior is a bug, or if you have other questions, the best way to contact us is through the `quod-libet-devel Google group <http://groups.google.com/group/quod-libet-development>`_. IRC --- Quod Libet has an IRC channel on `OFTC <http://www.oftc.net/>`_ , *#quodlibet*. IRC is not a good place to report bugs; we'll just refer you to the mailing list if you try. It is a good place to ask for help with installation and configuration, or discuss development (assuming people there are paying attention). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/packaging.rst������������������������������������������������������������������0000644�0001750�0001750�00000012077�12646426641�017370� 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/lazka/quodlibet-ppa .. _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.2) * **pycairo** * **mutagen** (>= 1.27) * **GTK+** (>= 3.2) * On Windows only: **pywin32** * On OS X only: **PyObjC** 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 **pyhook** (Windows only): * Multimedia key support under Windows **libkeybinder-3.0** + **typelib**: * Multimedia key support under non Gnome setups **libgpod4** (the shared library, no Python bindings): * iPod support **libgtksourceview-3** + **typelib**: * Undo/Redo support for multiline text fields **media-player-info**: * For detection of DAPs **udisks** or **udisks2**: * For detection of DAPs **python-feedparser**: * For the feed browser **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-musicbrainz2**: * For the musicbrainz plugin **GStreamer Plugins Good**: * For the replaygain plugin **GStreamer Plugins Bad**: * For the acoustid plugin **python-cddb**: * For the CDDB plugin **python-dbus**: * "Browse Folders" * Screensaver plugins * uPnP server * Gnome search provider * gajim status updater * MPRIS * ... **rygel**: * The uPnP media server **Zeitgeist Python bindings**: * For the zeitgeist plugin **pynotify**: * For the auto library update plugin **webkitgtk** (== 3.0) + **typelibs**: * For the Lyrics Window plugin Build Dependencies ------------------ * **Python** 2.7 (stdlib only) * **gettext** >= 0.15 and **intltool** for translations. 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**. Changes ------- 3.4 → 3.5 ^^^^^^^^^ * **Mutagen 1.27** required 3.3 → 3.4 ^^^^^^^^^ * 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. 3.2 → 3.3 ^^^^^^^^^ * New optional plugin dependency: **webkitgtk-3.0 + typelibs** * **Mutagen 1.27** recommended 3.1 → 3.2 ^^^^^^^^^ * **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) 3.0 → 3.1 ^^^^^^^^^ * **No changes** compared to 3.0 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/index.rst����������������������������������������������������������������������0000644�0001750�0001750�00000002672�12607265240�016544� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������A Music Library/Editor/Player ============================= .. image:: images/front.png :align: right **Quod Libet** is a `GTK+ <http://www.gtk.org/>`__-based **audio player** written in `Python <http://www.python.org/>`__, using the `Mutagen <https://bitbucket.org/lazka/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. Table of Contents ----------------- .. toctree:: :maxdepth: 1 :titlesonly: screenshots changelog downloads features bugs_repo guide/index packaging translation/index development/index license contact ����������������������������������������������������������������������quodlibet-3.5.3/docs/Makefile�����������������������������������������������������������������������0000644�0001750�0001750�00000001035�12607265240�016333� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RTD_OVERRIDE=-Dhtml_theme=_rtd_theme -Dhtml_theme_path=. all: _rtd_theme sphinx-build $(RTD_OVERRIDE) -b html -n . _build_all guide: sphinx-build $(RTD_OVERRIDE) -b html -c . -n guide _build_guide clean: rm -rf _build_all _build_guide _rtd_theme .PHONY: clean guide show _rtd_theme: wget https://github.com/snide/sphinx_rtd_theme/archive/master.tar.gz tar --strip-components=1 -zxvf master.tar.gz sphinx_rtd_theme-master/sphinx_rtd_theme mv sphinx_rtd_theme _rtd_theme rm master.tar.gz show: all xdg-open _build_all/index.html ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/license.rst��������������������������������������������������������������������0000644�0001750�0001750�00000005516�12607265240�017057� 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 supercede 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.5.3/docs/changelog.rst������������������������������������������������������������������0000644�0001750�0001750�00000000052�12501341560�017343� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Changelog ========= .. include:: ../NEWS ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/images/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016153� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/images/queue_2browsers.png�����������������������������������������������������0000644�0001750�0001750�00000337054�12607265240�022017� 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.5.3/docs/images/album.png���������������������������������������������������������������0000644�0001750�0001750�00000312512�12607265240�017753� 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.5.3/docs/images/paned.png���������������������������������������������������������������0000644�0001750�0001750�00000162704�12607265240�017750� 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.5.3/docs/images/tagedit.png�������������������������������������������������������������0000644�0001750�0001750�00000141700�12607265240�020273� 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.5.3/docs/images/tagrename.png�����������������������������������������������������������0000644�0001750�0001750�00000200644�12607265240�020620� 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.5.3/docs/images/plugins.png�������������������������������������������������������������0000644�0001750�0001750�00000113513�12607265240�020334� 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.5.3/docs/images/front.png���������������������������������������������������������������0000644�0001750�0001750�00000215501�12515146416�020004� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��������`��� pHYs�� �� ����tIME  ֘c���bKGD����IDATxdGu]uOU! 0I""`[6|lm>68 0$lDB H H9Lկ=wj_wbޞzUn[Vmu[Vʖu|ugK n/3_{ky-q+~궺nG άV//*nK</׃�~ڽR9w1{aڝUYVU XR@q|%߻BCSKKӏԉ6+0bV 0궺YX{g UE7* =+,_ѥn ^~5y a[V]+X Y�(ݮ:he,ޕ7{t^ 쵸%@⺨Ce/ \~>6T`ef]Ωb:+{o)LxZBߊL4={ͽ ҋ<=q߬Eǂ{#A Y𨙽nv "U�2t4~ɹjv҄j @((=j7r�B6{MQ�+edze]J3fX)=^܂@n$OVt9ʱ*zܯX-T)*O<__O~h< ]{^>e=^X'{�t>2zڇ�c39 "9 ZPKG+ Җ2UY-b:ˢz}vwn]{3`+ pLE^>yxY0T'OGVG`_m9࿏4+:AeM9 弔Q7K@aSt0CrP_sBC{*,/878]"f4Ueen+w'|ٕW,.*õZmS?Z)5auBV`s=O'sgoٵkWqbttԍ580o߾C{9~?ǧ~pjj$3>t TE)�~~~AFTXk>eq0sbIU73PP}h� �u`)8%By:ס]H;,[?44׬Y~xxx߆7l0uu[l?76mY~Ȉٶm۲K.dWՋ.wæQ ҜZǰG~ꩧk;87==]ƇGvO( qrtNG{0"LxpNy9�>ƛfÂ[trh@ s/S]: Pfp_)Jnm4Yk}8 Aj5E8p~zG=s' ".R|U@=>+^&fA�z=͛7 Xx۸q<pk:֠-|~>#fr{37|'@?]~FG�: xT7_՞޳*zV<|fff��6T�F?sP{ϔn܃M�߁AӀߊ7fh Rh<4]*`usõ}U|+r$KY\<^zWAj*0yHӬ-vgOϺg#~A яx>Z�o4�P9@'@�O-FEi}׻uMoz"Xr9<C0 Ԩx*A}ֈy�xطuz0Y"~1}4A){ok}6g t%�ԯoYw/s_Qz2,pk˖ <E?Ic j�y WI(v_kgg_^�h{42zc5(�;T#�Qf,Pڙ6: z^pI7akŬ#r@-Nbyu&SH $D2o#îA6ᯙƴ�?96o/;FZר2{+Aq]>*%{ J^|>^&*ZCXGڹhȏ#^҇>g�Byy!:}3!zހIm?�_ `Ƥ!;|*'e\?9=�Tچsݻw{:sxi`YwED, S@Iv<+yg֭n۶m֓{?7DPjD[�7�:cm_38ϛLM^hAh=㶱3=LYMzϪKU3_NkOA'AXi*@t*Td:Ʋ><ëcag 0k� As-Q8�LC-?oXnVO/3W8@`u]q·7a"'>Fd|=Ɋn*]Uۍ8Rwv51<AoaC'=F@qc7Iy"$`SV805�B4TI0Ox\EY�p(;nNbB'?KUG~':9r үH@0dwO8wkd?!ϸp؆Zq@? ִZO,A~~d0�>|1xcm ;wn#MaV/�»Z-D@7}CDHd "+@|';>8oaT[vC8D톈 %pЀ6 z<jB3<L۷o"PbtG�iR, \I:lݴb$u 'rQBv =N͛7ٴiAC?g8 3z 8o��� ^DQ3)k>/<fж"dRpNj ��03wu/ޖKHL`";"<!?%Vb'+S#K $^Z=w~{0I;O oٲeO\LC=S[ ѧL4h,34<1MٳgKVIn�UfBRN@ҭf7H,nyEGs7mVPsѓk sЀ!Nr`?a0 4 l +MJDE[sM4 Mcblq.d0,uvTߗ *`J)IViN5)NoAz σ9 h3,Z80Vm`Y[ihW]u/~򔧴}*� hwghRYzw7N;͝|m-vxYKM=y-|*OIO6ǧ ~�>>9,:pIF8&8 tƌ3md]ù]@Jct1hȃ�Z>[H&Q PGq;gPb$R|ȯ31}? h~<nD028Ic,W,:ޅk׮ oOs|s%m櫀.k3:tOXs#O{zlZ G?r__;;D y/"|;qq=S6W>ٽկ&FQrɢ4 y^US[8˟MH)6aЍp3?I 8� mT5`&Mh°3xlZV(N?OwՂ|V#0�E`4 |@ >O߯0}|i~P<Q[XQwrjs#j(ɳZA%/fcE_>; $A@z E�#E,:9syK?2&Z@ЦhN^vuUvu*>cJHi?K(R{#n p BN8}uۓx'AAAcٱcGR~s)¹5\n&?<"9c6)SVciz0| reHЌ2Mc÷_3zb 9OGftIfAgB~>h@S\ˇ"g�.9�6_f<inji81T}R P <I D3yN>b">p,&բ6~]Z%v̚33Y Ͻ5:{[ߚw;:+?餓 (O| E\` <̵Ef,]%#�45Ma"pdYrl5-&IJp_ҋi g?=n='?q_Woo-m~B(^G{`} .pwg?�;e]w]''!&~k2A)%pDY>/¿_r"3 +2^, "3xN=Gh lr8y}1wdG3CrZ;sY �0� Jr|pN[?udnڧ>܃Y.^@wɽ`[0O< %9ci(;E:ڀa~0Lđs>EI2 g_WsY/QvMH}GPc "7rncm.�m #eŒé++A![*16S cB{f� ([*X=ww#Eˆ}cc`*[ŀ`<3+7d<)נh2hT׾5#Vy哟dߣ߭4sCR%)jx 5&ϨXd~+LHM3ҷj;ZE%.`n6k�E zȤ-~�k{, vi�+m۶_{}_;�뢋.>l'ԣ_xᅡ7<]d^ʍ_B;] M@ڵ?JRHafń_TN<^Uɱk|xe}!/DLLI&簨koWD�}хtb BD,ʵI}[Pg Κ5_qP8vI'N=TG1-~|zf~~y #8& &$.,@"HĖ-[ Wa0s\oo/~7bΝg/~` f�TigMn>pgAKk<%j�26I qȔS7["o_`s M\vЮ0yѸ|;FZe6sN'>u߇5׿^җ_|q3}oWO|"~Ԟ'�8� }'qIs1�>}e/369Slh3Q}B EB߅Cʬm^TWaߩJP�elxv @Lӧ}H�О]ez)}w]<Vv�Jzl`ʤiodóg?<cZ�3�4Cs/U`1'Rs3"w9d᣹wL}/ZlHK={4<up.xVx"L4^{<{_M0@2c3ژ m0B//}%b޽OӜQOo< |Lye]׽47 }ϤMkjt<Y,qEǶ54 <=(}C'� ':~+瞛{a2~.8}sL^wLmk<AܔAy(g)j.j\[ַh#N栥~UDVسƔGaq�t_W% 1N6 DL]jtZQg/@l ,:l[c5MA(Uz b:WY?$Ei$4zJF 'Px>gr@*8|}vL[AZܷm,S<;_iC@�8a0X\h"^siׄa~oy�c>3o{Ѹ<�p7ܽ{7N�N,wkJyF!�x?b �ȞP8|K^~:mh5qh+&4>׿gvQyWfVY)nA(zL鼊KC)e`;/,/�R+*Wʜ`"^GyZ%RCkXi3W0qbJ�8Mq0�ߐFw{5iO{Z{ r�ٶQ ]< x4 { �:iXLZ@PVd(N<M2dsQ9kbʼnDdP<v A0W'{_ >K4h+.7p& P\}5'F`L2x^)Vg@cXHkp.${" 6LayCODm{<S/b~3L&^qfb4;zYg8ڎ1HX^9`ΙEa5waR^G0f*T՗E*d?&A]�`w*ckqW/e^%v@�4^,� PO|bU|Am@x^9D~'Nc1s:I54.,M/ӂ,MMJ@(eLpa˪id2HIcIۖ38 ;|c�B҇H*0T}0z)<k#HM|',X534pa ,|=0OI#E; �_{ch^BB!|z!d� +0U@Ύ|C_!|ykM"lh ӷ-EfT7YȁY, V;UNin9,$VxJ~ز]G +Ӽ %!�AT�g.*Qp-<v~|{svŶ$�BÑv\ =xg>h 8gIx) +dD&ⷾHV.cUMRlJ *#Nazk[+ IN|V6!i22BH&HH[g皫}XPst \ FR;/#FbLi_|,0z@D > އ{OOZvh"836mTDz幅&Qky3i0UX(QKq2UnZ_TciS,kNV 'WòZ`MC2JHKoE` KB[ W`R%J1x_̺j|͟韆k1mr Zv*T2(șz7݆,348䦣ͺ�B'"D+2/ipx*"u#L;#zl'Wx4T&JWϦw VH"~(ZDk@"x%0j t,&;wjV˰@ttNXj?II~)9T>8jciq&#keqRDrpXe<c}&ZM 15Tc󵚅kC:.K;si"v _?s$5 ǰOz`to8XFmiWL?ȏB hJ|B9ovSn b})X.@o|d׿ t+Rb~~g3 ?̭Y3xQϟ,EcYE:cRœC� tA03:L^ N@h7gԜӭ=eαNRE7Gu'EDRU\Df@ a*ꂱժ0t<UdsI,.\vv@FeH@F3iKN}Z8{eJQF45es 9H"2 �C:~Z0R̭'`6G! (jF8ڥ"yYYհFE\8 tia ƚy.`gNw-mkIF܉'ܖDá"JeU\I#s>#L6KSiXb}h9ǃpF>`y/|Ppo~YzVNOoZߟz{7<4<ϙS~Y5QNiQ^S;8aX,P�>9 }N-"GvM*nB42 2wMc;8FsM<k5"&!ˮFrf +ZWߨ5ȤQ("F!\�Mh!Ay<.L*|Es4lʴc}fƇ"\d)]ĴBRa𙹏@!0LcnL)Ac1k?>OG)ww>;{Iq3A"Wg5@=h/,A}`nqnx۴8w͎n;ݴ?N \r%(m�J9DQ h(:Ih$G]^dxqq@9yN�1hY� 7ڤTBx{Jv�Ė28vM2 "bl3~zDVC:n͖ MZN�JEJb)i>�˗9(=_`"v)P}dT)6& j �%0&YЃBc)Be =#&f3\+;W2\dfi`"u֓fbLl"Ҵc1ԝ B-E=2Zs֬ !3=$ m?a*wGИHD143�Pg:W ў@_IsAֻ}Mzi1=2/nZ'tKLX<CEc{v;v'w'w<nt[6o�ow`kl'f"Oh~g.�8?pvɴ;pAC Dk8'Ox1O8^Fsh%= 0)oE1w}x0.8PT]v': H- 1嵈2s) *z<LM<xw¶f?t52H  Wy//)KTLumkr~uǤbđXoN>E=OmWe s&R� D &A<Iclʴbyd&U!.CSA",. QBQ8ֺOSl?SPZ@kYmȔ뱬V[o[gy4r}FȍcAhC5,*3I͉R])"y}}&_ݖ촳Zfjhz<5i<ZZ�µpԍ7ب۳у{yuObJ.ro; B#| mB+'v@гim t5\>LP Sh-͛ W dHMX~㞜\/kV==Y,xMƳnd�%h"~?:Tq(q.ҀD`y^xa,ЛX0|] uUJ1Q|*I@RBY) Km-9j<462Ys+@<7g*�O?RaE+3XEm~$qj:E5ɥ]4"8ϩ60bĭWHᐿ[&XTfYЈf�Dx~dHV}߱Vf"@9�cxZsj4՘,Dhk25L<7y`8o:KW频 H6'g~hy*<�kӼ1:17<X rʺQwpT'Db'v@@m8)`ޜ|gX~1!)]i#Zm8ϐyv~9ID{;/@ՙޟYH�HvZL=qu7߱MLNi7:; [Bs9 h A( -' B&0ƒh`.얒ىz"y%^1Iv`J_VN1߯PFY5]Y DCސ]Z{38&)j �k,)-082^ki0$]Eݥ$J "H4#/yDHmYk}fb=X63ԛQhX 8|2ZWDfcD @"Fo~-D'疝y "0c~PJ$<K˴g.wMpX^!r;I))Xf&�<?vx̭)xRc6dg^ퟟR'<)ڥj$�͏!:'c"*em lv6[do4s3މ�HY^OpkMGRdڒ~= -]90z1FAc ; e4pT%cX*u �THqO2" HrO$mlH2aʡm2p-*3"~Nej iU@e�+VU{FDG-Y/),plA-Ef% DhRW=1A* X<z<4^4g]e0v%^Z/R柗�4s̹>3X` p䝀"QDlpfT#kCneEc5ky~0:&ХJU3EkuG 1ϽC ~m۶ҫ$JY4xKhMXŽ0,)ce=iI8#bªҨù%e<8gTM[n=�`(F>ej|$ m� 7L QRMy Z%8FLgeQV6!UCm!2I['lҖ<JmDWٰjH7 =@r&{ieR�UwÜ}h̜x\jslMce8u*}*)>Tzr% e] a,mù w kL3#A kv˕ gW$}9ǷjU {̣sʷuG T| m,J$E(*g]Afp+-TP*9R�MW)\1�ҩl$TB嵎JrtkKZCfiB+ZXI6KJZxf )ʤn{7gwIUƺL\>XRҠ-QJkxtl)l7 B LYm4u[dӸ8:6*i[b�DMT|ND fxȫZ#N = SLKzU&/MdK% LL8IAXݖy+QK&3%0l${ɕ馲ڐnhDhjܢgm_%T :eV'U+2vDi:ZRV{Z+]ڢLJwѱM\'ztw|$-S 6]nf`;p3ӓ?hpoظ=𾧻F/?IYD0 H]r>�VG%7}G- _銈̏iU=N(%*rr3>,lDa><<H•t'!21c &ݻp-&T葺D܃$D:Ua#ǧF~*-ТvըK vUʄ DZ81-̔2sm"g([ɵ[ȲcJ5e)eRSU(Ujx6np'ٗc7Pσekrvz{ȖZ:0dPt݀ ikd n p627& }{_~W$7 >4Eƚ$1"<� 0sٟY� Rvhص xM ~i Se8�}C5!;n6, z8Wf+-I#mV Ur*<p?M Qn"ؚv ,,ȵ><vʙt xpEz zF GNVOZ Ni`& QM~3@$ >O~ 3>0 >UQ5^gc1vh7Șm'QB|+awelS] fͤtaPp:l}o@��(? X_|q/zыд"g`[hw'@lxޑ(44x*9%#tڬmhFL҈ -ehI"ʳJ+cϮQ? oI<tooM699&s1!N5/NmH H41 2Zu$?!:IJ _D`6�-,Z9mg\``*"0 \LDT]lLPrwbbb/})0rJQ Ir$Ai3UMy2Sπ`J CcRI<dH0&#7WQ�,>E/CٵFռ^ ĕI/[/8 s!ӣ9<qVH<L[S!I �|G v$Q AC0~NxLď$D 1rFPcSYD}:h Y%4B0k@~d8B@`YK<n�0@@vА$]#0l-mi4_D!?'-8y…w+8JP/OKY"�h Du[Oh>AܯLb,3=?4ir'oFM#HLP[XJi\îBp>Qe*̡e(W`|0r$>94�ϓ^WbS M9ff2΢?C(hB ZVk+1$F@Phq2n*,fY (Tr2RUi<-kE�bFTU(�t cb2.j!A-l%6 `szv8D@΄f3ɵw%fWoTkl2Va`4^1,;ߝ&ZLlH[;b#B@%}6psw~)6I3K[ΓIl\$edtJL?J#(vN5 W$8f=W=kfuZ|u[:t=^ni*~۶-l+rUB4~WINy$*s/{9*/)eW:9x@XS=>_4Wdu[VweKEȬ%-;ekiyY5U~H5sU< &Yjܱnw!|&d28RlV!ʶ6k?OQ5E W/Զ/Xݎ6G ˆUK&5=?IXL~Ί:կ~u"0JE~痯s{nÎnxֆiw7s9qVw I{٢˳ƌ}21r0xz*~wa*Kc|~R@Y{(3X/F=Κ.2U,ŽUdJlq/:J *ENclĄF qo|IvwߡlAZ*qFp`E((j'z ',ARQaBwᢊB.e+#&�2cKUqy�ÅBa@B&'4aD<RZ:&e>/ƕڢMNm" ޫ ^`bwg�ѢOvŘ#XaнːƖvl=b)cBlʌmh`HYzN[O.sj*)IM0I[ -!\$B`s_FZw4Ph6 wϿƔ;\Z wbJ?R@�[>/A%qH+%*SXa0 &QR$B~hZo–b+ER75ve9eXA|М8}PH2해- lKIg Y5wF۫xڟ+& {B. ;jY,{B%)�1Or�Z6h*<tԍDQv[2ŏ̘'+?:wN|oD9J^EB~sf}8yIO%!ԧYg �guRMI־FKdHDAT ڕVp43 p08#Au{Lhhl0KN6c\,k`9|uXV? T&@<P"a\~[[Z&>vӰ3 ]`=p1I1@Yg΢Z&#`s2?0_q- 0aFlFHH0$$&&- !IAAl 8 XA%gAҹw~)w= dWvq+) .[]a͖-'>Gg9g- {$??o/䃖J Eaųg׽LTj"!+גTۅwykMB »(�qOzғ¼s~,ЕfqT�"ꀐ@*3)yD0י?0v3j ˰5M'/x;46&&gԌ4 p'l[͖DTubzT Hgtp%/(PjVdu4  2J/U>jX/*3wr͙v�+ #tv767 1۶>v71ǃ5J&D`Q %6 нBE E2E�pTHD=̐6L�ƈd{n0(3 DfѠXF<[ @@D �ꧡޙ>sM,& 4#nA׎EF|QDlT.#%.15ؐDI߀ DZCGjs%&ylɃ_t3m9476z96Lr1xGSzeHHxwn`9ȏ]^'ZhaaW( __b#h 4HT8GfУ )p 0Hy 4/>|263ZL֏F37njhs|ʽaW7=Ni D֖N[$TM촶zIde׫�q�(0"&1!Bh,H7LFtsLfitѨw;mz?towEPW,öٶLZ b^Tmjjf=oy\;i KP rZBRʹ/ת0#Kj`V$I`c@w &>�FZhWIN# _Q!|}R|>@KaeHzU=Z4n^{c�y mIbWH#q] APb@r̊cc_ R m0N>jU.Z75ntn`h[sLKhb2)Z�f1'<nc&@Gk4۾TTQ7i#D?VTnjmbB3uW2PGۧ|"˖m Lwy\ת0.^Q;G� 7vstw嶻qW7s[`d Q"KMl*MHi@-D DGVms?njfvo)}8@VkwPS/m ?Jz5is1яܫSJUhcv9Z=_˚;ы|r%XI j ^*^nw1а+7|)wn`p W[HHwt/=w{iW01`<b0/n"a7Mu6mW.FC1sa=:~Rf'D׿9D~Ԥ-_QD=٠Zuf0g"M*3{USLki&ҼN@#()U!URvut/WKeS~הS _s-Zߦҡr R$ A^p0D~k_@݉8SBe5nD+7tgD5:&mB ,1h"_C89H&p")ͅςN>8Y3 \ "QٟJ0AuK6ᾀ;4EԖ,N+A &½ ɄdF8Z2džlFCe NLe0ċ.(]iD)c'J 3R!9ߠ_E@Haکih7YzAi;fO}SO}jwJ 5cy~ ILέ(,]A<ʕgWm<| i6&ڙY 5759ZֵB4|8�(Z axL~&fB+R�SQg.%AX/{_]k!YMfi:+f}P!1;˅^hD;|3Mf C9Y^=o68Ѻ�4|'<{s9a-o ȠkIc5Lhq å} s!bw}#_bC ?3)2(ID  L5TNZ6ތc"k&!/o 0U#%$2#Jc1nl-_ZVԴ{`<h"xuF'¢Rxk!v&$Y3DLJ^cP! | LT&]>aHOZX؝￸r#\+@+m4VF2B tz@+0 6K_[Tʲ{�U&׾Lh1yBHEA s Q|H÷9 ZF8 "@ dw -FĻP7�0k`�da܏wB[c Ki iW'̗w�HVbeNeH7M@>׍~:PQG@c/yM3h( lurco| 79`>\HoEUA̲QL:9o:[ZTt")I$8.<-mݫ_W"-s;|`yh@ RZ/) idEH;̈́0< >;*zL"p+HH_x< I܋c\ 3xk~i Pg}!")3VSUfh>\wA:_x/=} Ag Ba+9h.MnT[9_¼7s#�IDvsq%m@cx7hDI'CH49kp.CP#cs$ƴ*=ƌyA*ؑ4û@ .ơ! zF\ y_=+ -em:@4]N.(gb*7@ #dbÁ_I .{588`ϰ,bwMAxLڃ 80a:wL*¨D7ba  x̔<im OxB`0OA<ʱU̒k!>dL" ٘̌ E.dB0\)&1Ɵw]I C 7h9�>670f sQ-6 Xհ!hmAeux31/~q`�x*N2l2K''ڇa+01ހ*m 3h3@b.dh{7y.cP,o8&(-Ԗ0.Z2|@f\hZ t}Νʳ̛]&z)׍׾'!_;-2_:FH؁!$:L& #E� \75y]tx$c=lђUf1MMpu<S9'ʰEnlkLlQ&�/ ٲYM&n#$ԟ<ώ)�CA�F4:g"k'8OEGjSYV*=ħwq0E1/Hyv%Z`b;"Uc@_/-+ȡ0Xo^hlE]4Ww~ߋBC~'Q {L%9˾PE+ڤjY-9ҋH?^$nR 1Ӌܚn8ebqJ-MmK.fV[Z<}vz~Yv1~XIIL{@m$&Iu-N~󑂑ӈ-ƯYlKf]vll^cՋSz&Y#ǭ@=ϳn4^|Lm>5Pe (O9@O wN67_JwwX;%ĬqCm u\Y",*=󘧻K.61w^=ۺN\YZTH+Rd|Kcc@p4E ftLMz nCnQ# /Oz~6e.:<[7[7u qw5Z c;Xoi`l7Me{DշpMON Lщ֭w{inuƛn \Ɗz Jd3P4wn ,-:?eySNzt h4*MUai6=a&2ԑRGDBkFKYBJ`Iϳю1&^[㛮kCe>pkFunȃpQ<,Zf )",5k֪,:7h7n6#+𙨜[7 nVm}fK izM+[-š[]浌kE7v'8o8p2B0pR"m�$8A,gs !c  UwDH3?e*(y,1s.i8�*/(=E k.Z,w898UjZ1=لC'fŌvܧ66BOr*6Ȝ;X摖ŕ_ીtL� *N(5H!@uN ` [B/ RXTjX,m0w=>YWysYm%$�Cw; M[vzyp|xe�rx,JMypn'oDK<=Vqij ,@ثq�4; . &1"6`v eʑYlu^>T$8.9M `@0BZf`n <ZH'�"IDvq>CD= A ڃ96Tch$8@8Ä e&KɖD]Ϫ�;o+ " /5Qsy5[%7l@:@sWkT,Mqm D\zl6=iE@1u qm jɠCħb HÎD �!dwi;q[oW -a>֮iOhEnsR0=-rN 'O-f&1`r= ,>*A(14O;;gnu(p]�k- GZ3HZ_y>q%' @BJP6FǵtC_t^�=xPY< m3U]%8׏ z{2h,w–nǮ}ײi'l 9Z�ɩp",ԗo۽砻ᮝ0P= 0Q$2HH: "Fځa<L~BZ`2p>L@{Ad`j ]z7?s[8R6ׅ8z1yu<mݸ]q@\KU )(1I!i*O [>66H%Ta0ey.{V� epm3twf.nʙ";Y+3P� 6[h1Zѐ>o`GeUN/{@b\/2 $Ap_+47~3Q2N+ҿ~E>=8tf3nwݾIk;06ᮾuÈAwkrB#2h�ns;41^`j% m'fܯnQa{[5 )ZR@}Lz<A>8<70WR1-^$E澻:w~ak,*{ W[`T$[^z}^Aqh@`\iu[M xǴ )+zxk~GbbS\<ũg�<* 66 ڧy73vs`J%#I4h^RP÷xwU Bw�Nү6sڹټݭ׭ e.srWVsp<\40P GpEރ^hGD ':i9"iӌk/CSdЕ4?f"lCbծQ7rg <  0kM#$څ]:1۴vc5x` ҵ셱Oph' 4<gT߸Eۅ`-jt! UVU*Aа;Pylί KiQ.v�nlr)=Fq-};;i Y EղE;16RkI3V]57Wݵo֩ô Ao\Ib} )cnAޗ:g,NRS\޶5E[Q$K^AFepU BakMp\*$L0xcX(9<56~!TS!DV)"-Al<vs?L 81C]� fXj?)�&-zGGBJWnh/K0Uu>4Rf_ 7/bF ^YizYpd 7+&mfgULme+/ l>{LF*U,Ii/,&&ȼ�쮘 4Pw  6-le QLJ5oqx̻v͛H&ꈺG�'w}{C(Gpc+xu�#vj�@R[]uBKLwVb[ɛ~7RmU+b_5-Č$sW{אI~6C]똶X\/yZ`̓)Z{ Dfuz3Xijg\ι󮝁+ @ᘋݷ}r7mn +ݲyK` S ]U7I&2,_⊶=J9Ju JgN2*aFS!!�-Br6j1!A P}J1#`K;l8Zm"@ 5+*y!FlY3LSfXui,R9`.|%R3Ѳ12ZzPkBFkU#WOپٝr{x&H֎m8 �6[$kk$2:{VHHWav]Koɠes]{4VQTDJ_� ekWn;:9sazǴ Ww۵PlW,nMZ)dUm1kQ&4|Vq;p10&LG'tG-O`h �R<@A_�"$IW| ,JĎIddM 2 &T�Cch`zblXSh?ϡ|h!hQ%^j&ll�Y9a4N46Jސ&1h%>3V- CerKZUfST3sAY缓aQi9`-̦qH]ث9#wm^gT$6q'l۲m߼mݴm _Kbt,#w+hMLMvs7,3aoվRo4ι'?qW^yU[8bqab컭8Go|@ouWݰm;fP Z!'}g ݼS[/N%g`%5h:o0M6|N7>kB[]7LbMzuux]1=ܘt\pA`PO�Fͱe$ Ln9tsPeUER4gDJZq}Y^^o=`mj5> ! ĿiwtL:F9s$t" P2s~S֋0Fcǜ$0< 3G*AOB Sshk#t ULQkO�Ǝw}X|g{!/E_U4N5=-Ѽe^deI<EBQ`b4107L5yM;hw[:nnǮCnρqנsa%vu&/De'1QTPsi"p$l];P>6 %rJxo :u$6 a$-ހ)`j8ךr! f}\YHkh7fV-6 fE/sh/L̡x0W�<� AL'0ߙ%Sy=;31+2V*1.>vKߡ@;0h3b7r)d<R[޺Jm4h; UR|l�[)�2Ӽ4<�3^^_}+^ĤO(b,fg.ࡉ b2b&aPaHwHHtLkcp!<[8-,߽H6N1] 9$&\':V �'w;Eџika"aH0D@1GLoi)F0s01)i0$S\VYC0WރV/ĒIRD;�6ޟ~<F%lLL#̅aƋ�! {7 ;c a1^h" %xAWKygΣVz *ڋ!j7N/XB/9]WOHB^onLIV쒶RՔxcM*'o[SX8(R@6* bt~y1EjF&0 Ä4%A`zD`G=Eg8�p:doVbL0m F~7,'7 `X p$Ew\y B:&4@C40&ĦF29&&؆_ƌ5SkŹH7: PLD)9<vsOħj`U€�JA*'L nOc�7ρ֐Wñs==CVT~?60g10kH1OU BV6:mB + ϰh+HxLjUYD�L]%-$MxkAtұc/ E`ovC1D+@ԁ$!f[WzĚ><6n@_!`9nZ9Ü0Xe2Qib>` DEf   <$m~1q $o �f9*&n*E={2AeNXJӘ)/BF3KdUo헶҄'@҆AJ+;VS̄ߘs2GB\yA ']if"wѻ3T\eCALrǎ&$ A1f>34"MXe8nӜpWBd ק+hT(OKZpm"M$Zlfknyݨ+ns5+vT4Yq3x `$6Mz}|A3ѵ|ǬpU~$79)"{Ӟ.'ʹ0G=/q1 @N BmY6шT.[g&PM<EY- Şlx>tWICڗ8m퓴lUVJ =уG`J@h�]Y |Q5|t0Y:>3D²:i*ԲIds=8M5nf9Z܊ Qx5!ecc1'ɤ}`9 hx L� *Ϡ^Ck@Ñ{rczށBbqvG|~&Y8-R3J|,G˦`�(NJHEOU˲!?U֭8@ d'ҼPN'_G R5ݣƉQwIMusBǁTgpsڏNRJ 9 ,0(Z$G5U:NN"Ts Lp78Ƚ@ɉ܃g|#B0Uɵ\¸r@l锉ͯgϷ5`1}fE+ V]5Ү^^3�GΓEkeLONŞ銄ȒVީ5TGhd5zm/U  ֨_0x[ eVF$> ⸑I}vS�ݾ]2я~bX&)g-i,'x8q`rŀ3Q`t^zi&rY/,NuI>]r39 lƍvOLӋMH-Fa^ yӟ~c0C$L^Q¡)g0v@� �O / C(5NqK6�o@I~$ gy @M<[ 0A-#_}o3qih;I+AT 0r>48 N='$rgַ7ᢘ-a~UDZ! O ,/Eߡh}ɹ |0^[*m~^qB[ sdYj%`̧?+t{(ЮAHY&,: a>R5_?u#wCn(,T޽&mpgq|`ZL>I ÂHgFg=Yd&'A"#I&Z {"aYPtWt oq#FcCw 9qߵ]Xhi]D0h/!8)xW-)Jߝ{Ac!QJ*=mJJ� ;69e&r '#ikqS®t Uq6|SODTa@|s*"tx/ʦ'JY DQ^! .c=)i#m3-% Ah;|0whD1hT5A4UcL!]oJ WFxWN9f`|,yޏw@xC`ISRe'E}kx.@B."L,X_ 7nQs3٠ NTV̜foo׉B"3Lp,Ĥ織dsɹ�L 4"rC̝| ^xmmFZn.#ŀ2ANr$'R .短 fȉx~UWw`(V$!r/ #{89BP/0@�縍j/R>F"S2ZJaM JY UՐ*%@gHG_P9OI�:B4 h `FJG_?b#S-�7Z5}FDeR5&O4t?@bN1y'GˇVF�+=#.ƭ^ B�Bz@œe@"!1 `qOAU  T5{Ix#[fЬX@TIg3S38Â'v< Ccm bI Bh&HB|F=췜7i{ ‰%'a*n;}$3:f3}!ށ*<{oߙȩ�.@I X߄s#:J%�h?-LU%10a>ZCə.dg?;H-tr@ldtH "0bj2/ʤhKׁi}2c =@AQT?V O?$@M c&M7,Ek�<W0VЋ~: �I1�I14lV|"!ȩ3`7oΩZIb,DfIc!3L~>|ܘt"ig�eu<�)NdO-WE=U60^-J.FtG2Pm*ٕ<MeN2Ǚ}^ e9;],rnjc Y0٠(@ cΘL> Rb^DS=BcyL^7rVÌ0K"8x&aAK(:o5�><_ -PFGûN3! J'!ѣVd<" iaBjS˜cF vhNЃ7C[tS*IV_TaA %C+ډ6dEm#nꎃqz=]z3FxmwG%`zիe`D8! i`SȊb[+nܦfAVqdNAfL3Ӯqύn䤭n&tr)Euӫ9H@"mI Zi 3 lq\E�6` JȔPs@ Zֳ۟dSEmHj 2.<C?@z hg*OjkN�[uƈHh!_0.< y �F-ŀ) 7Lً ˲&#k8foP,=qLl~J0_k|gJ#.Ľmך4VB鳟U8Z6'hMMwͮ4I^u/0lU@�ƩU@v'EyM2uIoa8_yPm.搖fC^}pmioQѪ+vMYz6bcv;t,$>"/) m~QZ҂JZ;L~*IO{O>]g/7m0 -ө[A\ hm@,5ҖJSdZ6Bj-$ L2w]NjwJ4,t^,=%5j NbIHTu]+Sbr--$'sd飓ODiĔU*1 %*NsIT~ք,QSTU#©[ \*DB5Vhl_3o*`QۦȺڥJ:z]VD@,U6&&J)>JD>!;ypìcZ1&g*28@[дJco^WĝL2_jN95v*'6P;dBQ <i&\xO$j|GB8vqHfE,`ժ H-낹w 1ix3GFwFlъh\1�A%D -"sW~3"ZD\ Swxp{䙧c2!Xed"zǧ} eO#t3es'-&P>[Q6Zam ?I gb {62mKUbu ؠah bq@K7LY!\OЌ`DWTHk7C.φpcǡ)!\cWKHE=r> 2sM2MsI;NBqy'%m /F@O(&xa/jbx?vPKNH$w%L3]f<6ڍAW $TT}՗Hc"!ukv5ǺD 0k p7]ӝvIw1-ɍ K^g@w�IO3pPNEɂMx`HjoyޛGIO/W,6 uAE@aiZ@Q83rG<* {T`z,4MwUWwUYkyz3*232+2_Ȉ|<v"XkIR&snb0Tvyp!1d:w/y/+@3\۹{%W+}mAXG$�^QN0NY_B<Y#E.wWyAyQI<* ֞UD*!.`#Z 0m0JI �RX�q!s܊AT.d�W@6p?` /ފT6V;73g^`pI%<vz LN%Xi@`L Ex3IpԢ_X,Z2/k ֎0dJQҖ%zVi@N88!UNcCA(Vm & ؠt,w_O2؛񙅆POƺ~9~jnsؿɄ:sr N/WKzn&{`#*\49A,,exXK%Qb!BhAQeT!Rz+IX_o'$γFT\ ǭTxҰֈ-"2Wj0'*2T"eVlV>k,傪ҙ�!i䰶㙪:T&'@�aSiƆ𻴛T}Alc92N.1ƚc$5oJ*^:C&ܮTyyYyƴ~6Ӎ#6o(G}f}E]/,;|ɵAa ccAP 6<C#Jg?ökϦ65Wh4/M%ÞnY`=wI=}c'DF{Wo} r59[%$ Rw<d#AplhaEw]_sKd+HzQH?TC~9{}.4:qfmD)H*)% L_!\ϵ>�:($_AW5pΥ2%ߔBl\#I1o}[U P Ie]+/7y&d,'@C @Tʗ눫963[E@eYb bm+sԳ]De]eυGQa.i,/ڙ܂}4 BVVXO- "FRK@0,r$Z<gq; RW^L⵸ͤlʁbp]VL,$,\>~I{aϹ)v3gml*Gؘ$D]>VC3j Ůᡆ�`#2D o:vJ�Sb*CP׽n$QeAX[81$8Q~dlI@"vγS3Q 4�ma%E4ތҍ76$eP%6s\a\RT4t؎HbEUٜ,p-b_j_s8Ӏѕ~*mPv a IZ2`HwB``IC0Q-i$iJ}]61֢){U aH?ИM!jxX`m@Ct]ukǫ ýiGtVV,ٓnb61Sc?/sn(c,^LHLEJ^3р_u\pirF}MB_=6*>U;B�~o~|>'(UqX?A9kAjG5 ;\+}F;kѩ{qc+qA@,R[ڜ\/aY0dXQ<vN.[v-|,vj:Ah69bu=#-Kvv|ʆ{|sN*il'0;&l e;}av=61sb|;(֓) d}%2h@D C�fq 1`BTgB CX$́t BC1\.j1 ِ؝HO}SޤgEQpǨQ/`ٮ)(|HdZqT�N˾I^-?p9U3$-I!۹ 8zmzq6#ůsPq:{3;b [c}vۏ؝ϤSM,Xa wQ~_9]4#) ^H!]mU7~7\u3!� 8�3y`~Ը7]~b(h#V$k=@8g8HEzK!Jeڝ8 UC[awB/<+͐0B>{d<Zp5Vݒmju6وGuc W..p D"n'M ԌvF'n9'U6;9md)n??vIw c&g|^/WҹїmG:W܈<pd|&phi#(T.F02^@iKAe,V l(2<+] *Y\9Fzj7@\s >")1"|( r?ĚQ LdWR0"~3^LgckC#ʳ>(=R)5(mS7撾0̷Vےj}!}D:n#2!pJ:yH[u;Lbyþ7mNqv.L\9w# =ybH9g @]Õ#c$tJ"n{ol"t}1^W5؎>4f/zOXoKvg;cTI zeȸ*cNr6%6Bd� P1|V bT_QCqs= )"=1O@ AF|T`T{yhu"J)〺<hB8O]G\Z 5exo=rep@le�ZqT{8-p]'(50h#E;8o;^sHY>'Tw 'sN/hnJkqf 煹ĞLAؼ,:JbB~;NJ?tf ϥϹc24!r=EøaRĺ5\j9pJ'T)[%_ޤ emo^+ϖǎY2z`ɣگ=vMN N"-R4t 7¢̘H� %�fRۀ k7x&D yTK \G[9GTk8>E5.&Pq|NP4'~&YG x1Zڨ]>{Νya,l j%VIm!kCcT "Y[Dʥ ɺÙCy>JSÂuxjJU JBԎ xn P26uy$Og�fmt�Q=8xJe|x%Qڈr%lҎR{Q63Jl@5wjOYUA^6]:pQEKEGXqZ7j ,qÍ~j8CnAx-C K} �$5WϦ@>@`hFn.Ğ�ROu,vc\ "l9-6"^�8-xBP6{M%.H!JSm} vOj"铒r7GPbG!5 nجw�` 1!\.JAjqD"o1ٟZ4}T)' I[y(u-[I &u=6?Wq0C]s愊ͪݵ^ϹվS]Fd( ~Ay5&HU²'~C:zB|^XQe %CĆ), J; n[cl:#u{0$|V\B6n/v g3>ɉa3Sn!l-䩅TA&Z G,S3>]b3$ȆA0!vK_xB![�[r- 36=SKwL*I;ELR|~!!Lp$t@kM~'Μ54"ݾrcI5H,\6!4³/eYV7ƈgp=رU/ (u2 KQƺ7~q�?� \V1 mw^jY� CZ\={l̘+MckGao Z/jN֗cK/sEْZc|I|C!p#n+*NWL~h'sF6@+V".K6i'zJ"?SҒ=r3^h{G S1{کSmߞ~;7e>"˱BX,bNH*xqQV1)XF 0D$CсEJgߦuV n�98J`$x*u) DVQڭcRwpql**0�8_si<:6 Cb5| {zҼmҒ2%{�ĽT9P g[7jϊh @�jVZS>g-UH!KN'5f=] Mtbg7Fb 7`ed0a @HQ!Ge-,?WcGlpWֺ]V/ٿvS68gY?9Gc37Ra=A@T,lIZ6 /r8JZ Imt8Czh pl �qdLQ1N� `y+8G5EPkWֳ/C|k7Kt?8$H\a?)cfLI "b<mmaB"^en*l-!y~ZάVVT>C� 1vI)6K"al�=cgը<l-۾ϱB%8t}-J߉+Nɤ/Lb w!Rz턻N' ˵KpmS9KgI8ǜOVmb,a'M[궃TeqэEDcxߐ06+Qڱ�8WGb 8 E_FQ Km�;@E䓺;@ � xq umN TDU7M57iFƇn1V9NjHK~9#]涝5ӮY֗S.3iVHCm_1A vaq6jx\w'A%s>78 kzte(}}40ڲR 욻]$U)[8nɄO^^!tstвO3ߝXn`gt؜&6FwËV(90/Y1{ T(Ss]&m"F h@!wq�(KFDH|'$.$,ExIW}Hm\}C:tR!m `L{!@`[ n,OH6 -m~GԧPMjC[Z:50x#e])5sUjLD-M*RPR[ t=R9̪_dVN+ HmSʺG3p$V-z=?_pa=Aw.f CIC:śүjk[z\GKnliqm ~1ʤSnL ف36ߓ3CVIڎ޽U/u=;362X|0aݕM̂!ƀID@\*&cUc!iZR*%}4pgs 䜓4#O(U\<pXU[�[:p+ȶ iԜR�(c#c<~_o �ٔ'.̀0HeȢ:E!G+M`òrTfځQAж&@ԩS*} b D$)3{{J7^;!3}CM&\tT+HղV`\f(3]@3{.[!ZuY>kp(rD4XXUS:kX"44#$npPF'QU9*.M�]>;no<cn65=g3 ŋޝ67W}pW c-Nvﲓc(. #%&㬌x�SB$DsX@V��3F//}T؈xҒ뚟i e1;�'*9u rX!+vZS Έ߁ 2}Bd6%GŐ4g�* ,JlK DQa.vqd&P6ǚm{+^o+k0QFTG 5,LT< t!.Iԭjz^G nR0e%`L C  ݚ!Cݪ}�QԪj%iVBk8o7ؼی?8H5P[oݼw8?cSEˤq .D.t7 ns9Wz4zQ!q7_'Hu9svfrܢkW8yL2n9w96QyFug=ہ”ѡ]/7<EFBոPsVjj綳^> g6�K$4t !1q"S Qe[�׭T �{ } I`Rܷ9| @ t� c9gZ;)I`g/ҟhW04,l@8X E9Bʥ7�$ 4{pW}wg75ȍĮ dPV6 E{L8hÇ~̎<n~ {S ۝r`Nۮ^;;9kFlFWM;7c4v 8ŞUbUQ@csSHZ<{q׎d]k|MHj)PLq @'*vllDW怋éArF2:Bh�6u(R( > "N'VqmH aWCj6)I80΃@ 6D-G)WP v(iZ*ˋ}XFa, �pe# joڈ[hP"4k 2BMYd贓eK H눭)a%L7b6 LﰓFDFY\8=lPt"2>.'gSr@ g(r]bjK׎uz6j9E6 v  0@Nf#S]SH Q;8U8?3D@d�$ ڃcǡo8o`bc>4+^_z/@'T~=tƜ h/s@?dyT:*)h*hjV7WH;Z:�I)XYHӬo>KzFNРod6+r[0�(R'[ܹ]ý680)9۷ h*b/xdwKʠnPwNrwl6;c=/ (3| ~TcjH9TvkXVFYSݤG@ZxI9U #ǸnuEB-殝rgU`=ZBU(a rJ`]!l4pgl1))�5*RL/*^˗@<a\qמ %W|Iِ$spRI| R䢺0c/륌ł0m1(%.;4Gv#6prMܨζ9DI8+:jvhXN3sx5O[f/go!=Up|ڭJ% DZ$ǑA* f5/:�4a}׳'mK z%+|u\!0WvK>]|?D椋z^Mi"prQ.*?R6\\E6fCD׎儮ħy'6flzW$q$Ԏ*r"r Vwx~#ͩJ€XPIAvjoE�04T{Y<�!Im+ǚT^ B_o>g7#Vv $Y�IVGD} 1\o3^2IFPբ c '7-v (nz#qŅicm\MkYoR'$`ʮ+7<fNcQkZBf1KEװ)PÝ\XsM;0T5A'u,D !Wˀ$.AWXϣTUH ЕZϳUjsAp}~6e`EWo ŝBX)=GV_"TisHx.omոo QS1FKQbfM_^t6j'x7Tf4:c[K`A!HlF[U4:I؄P__z^ _dPQ�8U 5uJ7O*,՘.*F*J;%Y^ t;+/~pPZ]}UϤt5X4u�$VZ"@XbaɖRq8$wH]k-�zދn$ĸ$TN6jf^z|U ެ<JXmh&$,:·\fє+rjwc`m:>Qc`@jHbO#a,!K^`;�ZWb𲂀Ճ*0b%y%Pe@ѷJUd+f߷R YO:w9/xn6p&vMq%&Hn:| -\O8Fva-3|;2y%1$*96@kmpWK.Trf>jD[,Oٙ:qYw&A&_(y܁.o_,*G<5+,HܚOMM7Taq'lϱ[oN=*^J!;N?S?kꮐR$-r2UA=9S* xπx*X7NYDj+-a;UxV eu*p*qb.o+\_րp`]'6RaGp@Tj�"JTm1aM��/bna\䵴*jDXW~SweI",(m H~Y拽[ޙ'Hq6e LiqXs ;|ڷ\|ǎ??m|*�n!&8JnA$I'Nۜ{fh(һoϸ&'^dZ. w[?oCw�?l߶3c-zdJwۿ4+[dp�<4y>xff1QAEl FχDJ N"Gv"oo@*/-ڭL}|V|O pn0�. +GHP}b&A!@$hkB3Ց̟r{Jf?QX H1H#Gcf_Jjg#IP. mdeOeYs #!oK&xa9a�|,*vn.nnOּEHI^cl/mbf 6e%7QYtvvۣ'-k*ॏv„Ҫ\}iCvI&I la~tGv.s1F/,S'(9"Hf~U5GQ3{fP C(<UI!�2r/.M[uU0p�AX(]$ V䁂aSp%TH Ҡͩ\%m '.I6IngCdEoƏ^謷Pabm+*'0PEV0*=9ΑERVXXHe?*ϩfǻ.?nۉ6ÄG%H?0q0x�:󌪑؛̳(~[G^~�%iܫZ2- HJFv%7J{aA>;s!Ӝ0ť?7ew:vVĒe>P4'r|taxnǭV,A:U_eR%m&զEL8+:؀_Cpx$OcCM�ge/IBH@y6 �EF"9DPs Iɂ=g\BhPopuD*^<Bҡ=prc(]&鼛]vJeZjS~q#L&)=Kcޢ-0G2 !G'ی F?Ua7OOzv"I*8@;.ŞC <]RӇۍml0%+: cI3)+.|o;=N',T ]R;dн;;Вlcz%}ݽlj67;cY[1>a_ip|:sfI{baG_)E'pm%&l.:x#=y'D�,@$VE]7A@�:|,db<dQ.�Z\ǽ$ DPt�nV,4�8"qs+2m,)D�ꭶ0͵}͒@>[aZJN_ٜ@B|70R'}Pb9֊dH_w1dqxDPw9cgRt-Ln>b�Cq'u`̔U,Z#аZtK3K$&Z D!7g!@t5k|HU�HSBq<>�UR58TKJѡ#LZyR&[toDl"a~7ti!`RQם8:@+ m{sҕ>6!m :RZYۚ/w;z8)Oby@D>OH)P@pjALHA-B;ufύS~7r6uCCiRb 0N0J; 鶕"A洈0^BBn#vs/F<U,�jI=yeeݨV;r_^^gs{# n@AE U9TUv܅6qmfqa8J}NjFÉ;ު*zd+fDaĹR%ZB\߮߿<a gj­p.F; G۪4?[RXBOJ=^)x]cue{칎-G?O\^X q;vW vO~>4 $ ܊�6+*aA_ { <v<1ڢ<XQl)<t� �j/3DPawWਸx&FE[i}I! qVXDΡW<zeqc�ڮne@jI($�X{:e?m99y'掗 ,;@%BOMۍe$qwkdC8?0Vx*ֳ L@Ezir4iW*&*+ A9Ku,e@:ۄ^|\͈% gkKo8P2zʊbd '<$݆0UW;7c''mavڦ'v7Z6^6aKbf 8s @Iq% 7<H _B#.B8|�+ .xq�(x6Fs\z1cGJ IBt_l'pbZ1 �>O"6괋/8fs(Hi?@ )g0t;6IUI N_A)\Dk kL^yHƄ> Bq]�zx Bx. NK[v녳ƙ?>cSdV0ރ pRjEB[J8 ][%xeOPgOWv'SoBP2Q4F8 S%rœd렢T}==^O}uyH!e_`Kd@Vjhh EhGݦWO<6\@?0JV<{^f??}+v%0,+J@\P:@Mz$ q.�B69`uBQ�88Byp}e*p<? < \,Ap(\6uoaiNFun $ǡ+7Х/SAwy\�L�k'�$� w2s.pWma^ C݉HS挵\b?8ؕQaIkA)!Dݖ8)j .0+{&OAN^/.{fQޖ*VҢ*@_w](|>]}.odj#}Y"%GKqDw,$l!Vw嚕T];5i`:㥕ͺH˾f;`w^#xrs e`M$+XhEP baE�$F~^5|N(r tq< S$H8ϡo\ Ä{\ wP49c*&FV$86`~ "jA<0g  8/ U&Hj̣T6BE�*RTZ,i3sZBτq@`Bդ2I|4`[~ڽ^GLϋ@b.;&jJIbX@{2ݪNM62`&m!7i;9m{A-BH%mP.=LzR(%|b*Ȥ6䮛'/�œu!`.GprIO_rot͒gs@$*NE  'Ȃ-C`9>A �4rypKlt\mT͇8E-&i +]s mVo�p =561W>! hQIϚZ\ C.rl!^Sܦⴍq 8m�Z@+cH_�$Cs_� Q0##mC*bO6p+=Zqj $J7H/LN᳧4Zxթ\lIn2O8t{_!L/ZI#Do<vs7';l檕zJe8zrpx #~&ЍOOY@ZbX,jqxNb9#Lʩ�eQa7H0\f P88wuE*yzSCgSml8%VqMVx`AR>Web\1s .+ STcgJw`NhcAeߒyAdUB˽\2Rbm*#V?4Jת"AU ~ V*씄IC?kO0qzU`�}Q:,pHXUH*@$9BMjʁP1b x y~p%2iFdKoW qN 'VT?ʍ/-^7ؾ7:IhKvc.˺[8rc14jn8Pخܐ6  GL�ec[ B>O{ag|,v.bVrYUTA*J*%yӄ4+#%&k:a '0lWs+}Cݶ{sUN|8 | @�y�YK[hI\ʑ'@{l%8EX,}Zkn[(8+R%6#ɜjM->ѳpDnk$Yc鞬ϣDZMLN7eS1[/z8 )z}ҔS+ !8"(^. dE{EOJEl�E9c#ӮCf TdJ [1fzǫm]kjE$m6C$fHjS )MĕR1^6 ra77;o'/LY6lZ]*[(8rZQTȅĹFznغZT' $oι(Dvkv D%:Iﷳg|M(}9A[ #׊Sz}  ŞZI DQk0ͽ<tB}`5ó EAhR!qu>tD@emJHsEB%Qmڮ8}=%{e셗:g% ZB둜Zїr%$MF$hW2awV8xz4wM^ (KQ]a8�Wj.i[v?k{{| _Xt1uZpMHdl8t*muN)MxV*,_%fW:A�iƒx@�eE"{�D0C|�إXKD`SPGp% !NdaAQqA0#mHJ1n;#Wحȫn{^ϔ}Ew{bGlJ^vk5>k\v3+ucodZ˳p*GRh]:fzAx@zek Xk߉[ U$@#zJȆ֧~K8kjtKM-pşXlԕNyc}Q*ra)R YFo%vUllAM60h+%;$E9 � xsO^ 8<p�߅ mXܗQUC/+D ˊ Uo?:Y.Mb Ȯ @:ܑ*d8 4qI#leM9J^X x`~-X ^l^ڿĤ箤blW\Ӵ�xȎDXN&jEXOW( Οw#&>bI zjsBz-J.K-XZFگy;2S^.c{6uE' rLa/\i8: D18ַs銫x eLH+ .Vt\d`??R lN~HBb䞴 :�Mv/㎴wlv�$n20^sZpdVww=Ȓf<8h]׉]R!_gBWp_fM{W$`zUSb!#A Vz)潿jAx Fvr,Z@E:~xXɮfZ/3 Bh7"֫;ρ'qu#.ͦVQܫхºj 9VTRkVY Rԕrᾒ\MY=c8_j@3DHDKhHrlۑ 0&(sC, AUo lcHg.7d:/yE?v:er[w1^'[{ V&uО~m&#7lR/}W BąX\[ìDe7oI8fk ʧYZfjp !� {NzGͩ\9D@QH�sYw 9JӕsMxJ04$b�BlC\AX1�9A~G<Sy!%v~Я@~q t(P'}T}DDYM'4A:Y5BƁvseE-.7/#ld>KNJ|X| .,6. eq $gJ? &*=t1Y W芲RpRX*&},vYi_‡9pH}aHrF-kxF']FZ ܔE !=48ϗϕjPaL0؀CXBj;S< 5^;T[ul_]Z3WVݵ{  <@00H8A,аPϓ@ BHdKZ28*W}6@fP6[l?FP!@Df111p b7jB騣]%REsg]G3uEz\"^0mAk�lN')8LCUjXyP`Ȑ6Ѕ*أ𾐠v!qo>tjOs5fs(.*P+qVz_i :Ghz�I 52״5 <@[KM9iC_לYh9P? ``D]� }H9CpOaq*ȭ$SG3Mռs1/XW9B-^x&ᤎM,Yy78m6Sy : olx,}}~Fa} 5jHB &skUk9֍+|Vs:՞6mb=}eNM+'S3K yHA_Z3nW�r~R|a`cr۝6wuF^zѷ8n2}1 mp Jmh'WXX8:MLZmqjf}a;-[8|FouG̺}gpZiWd݋ruWbs-^tEQ*eox0?WBor>{.㌄&el٬ 刡Ue9p.$!w٬08L/9?E[O aYZe B)TR < k- rkSx_VN%CcltNZ6K3aLH;Gs:VCAEϮDYׯL:a7j(]7p-:o|b&1=%& \ȥFZporsV]*X.C߶)hx V[*Z.n9')&vڠ{V#[Pw!tm'cT{ugR6�OB=}WMun[O$9< VŲbg,^*U5|gιShkouX 68Pf5=OLDT{u)a=C}Y_[Sג'= 1ٸ+q@#�MxW)qx\z1*TbD# L<!Nxʠ[#@<:kԮbi硦\7E[ڬJj�~`FO;g0FH2С|}Hz2aOwھ %\ǜ>xgnd$H3bM` keaR=K~-p3�@B.G@_չff&>%5UsՍݎTzCzDQW]EVe"gs9o/OhM"e0e+1{ℕ,un歖IG RqI_=?[O\ޮN&syG˶otzi;1@@[n;�(aE[mߎwͻ{} ~n;ua֎M~Fm܁]wSzb~;,m'f>s}!خ^sE`OnԒ9㤶@k>ͪώT~jX;j6iYpҪ̦C\%D�!(X"8G{1J!:f;֕^ @0Z>r?Uu< {ﴕ߃3!:<6!Khők,{OԾ:v̗6Bh  to:y01ox.~gO\ԱQ՞m_r& ZQs^m4`&8_TWJU;{jz]P>#?bΝqǐkn.{Ȁ#T=t55ue$*- 6܂<(ߺK!w[Iʄ\a8rK G|}scShG �2 (LjHKwLHC&c$8�n[r7N {]]3^qE@d8�.sXp_=xԿjl.jF[n]8q�xECAb�,k%.pp⅔C)!"\HXii+R ;]6� 2v68c=HJ}$x>�\! A �-@HL nuMJ.5c}:6F�`Z٩.gvv褂ʊY*gցEGr+'?%=tסʡy uʡY+? v5qObu�UP$dʾ?p|QKrV9nr=uݖwӭY_<H017r1t,;.{CHO~cAؑ(�(5>g9"Nz@=d1IAٺ$G.[/x,#[G�LT]^Ρ;pb#{2-j缪r@v 9jXi86q-a$f*f CH)Rl8k֎RI{ /ýV 8(!@x^2pHpJH y6@وh'?I|)CK<ϠrDAe:α?xL�9jD�G"lrK*D)}%Ns|3wdf|#y� 7SĘ+pz>Y!R*8׼5� ԬߎitTxΔ"#ȟ9[q| SdҶ{G2PU_e יEc!  d0pKlT&=6OKY8;nOb y?R8whm֛u?-7̊y#Ow;☰ljb~~vi_CU%?”} L` P{R\>rf{ύSkߕ\!*4My}ɢ gy {s',ԥ,qFa~C.DmpsIF&\[G]#7P[qnΉ =NJ:p@ӲTll឴uh!�¥CtGQ'Z :LSU@. $OLʛy}M).ϗ2RKE%#)g4}UC^\/pm^e8Wge�p1^s28+lp7@2MkE3^OK0A~3<ƚ�eh�\9Z댟YjͪMՃ$["Bd~"xjf$HuF>IA(郜T>-/Ϲ4Kٽ@ 5KJ :NZ>ז=vO~%bF#BɵwY ,(WK@‹f'jղՖmGQ'Οڔ6{z-L; WwR>߿X;eYǩޟT*8HGD߀3Ƅ}8jBdGMy!BJf.~xã^T=WQj٘'pvw'/6$F;C�ߟ]9V7[#d3t:).̹6WS*P6gCoCX%ńY͇wa~ЇnDx~ObA.^>1h5Wl34K9�.`A'ߣE¢I�3W"[fGrٜ,bQpۥJ½jvL̞ugnї%xhxi1dEJa˹>tQf*ʃeQ˝>g_;~Ğu8.2oTY]쮷Ҭ-8p윝?rʎ?vʫ"ݼ2NW#L|&|*rZn<n7bO*?0^&rm#ɀ8rK؉%jCP-:*&yղX5Q;| Ou]^%iiɍ){9Dpki4 4 >l $T+o}D@)  Wzk A>WSQ6Gi<cPdPj_E)ĥc.멷-wWmalJ(Y'~vݻ@R1eE.;۞c_ܗ-_3XfH\baҙ1\\~#H\nn=8}$ARt{瘳ig9bd3 yiO>s(`{|T_8/d{a=}vԸXap m=yXgz`ԾyW[q#j.X<B2Il+QMlR`vʆؙ+Qu;q4{m*] Dt,,xޑu1ګWV/�j86׽rؗen>mA"6FII'}™� VJG#29k|N[Z99?irUR#NА%]15'Ѥwq^8sޫ"#at$&CKEow@pw|z%"`<ǀ=: 2Ŀ~ /N-%@;=X vyg:`޽}bHu]^nk{[Գot0¯~_(yiJż߸g/g޼-wx1<ju(%.l  :39n-ӊUyYmKIؑp+՞ 3Y 띛N"5DX@(HuQs.BgLkBWav^hZ{P Ko0|+$@w|pZa15'*ĸ ]jGhr9"rnAPŀ2޷Q@ ?n#l\_ܡa>fXyf5l$^VTv$_}#{vœ[ӳVvq\3+o w`_Wݰ{ms1~Á# ,/uxT-~ὅ+-i�g~<Nx#50h$!}LN=y=vN8vnK*ģTpty˰*]SDV-`܁.}8>6a^AB6$)~ojXAss\MyǓB@⾒!B\`%s5#/-Tpx,(__yoI # 4Llt0/)ن尪"LtȕT}$3lx!LdlUERu dk 9=iF"Mwl0hCYCp둖CY)]ѪfJ[M]*ZW&+U~sgؔ2++L#p5ҧ[sų64VCG-lpxq|xUN?dŇ lavz^˞vuv⛇lœK.X�z7X~Jq:8BRv@EkX<pEn^MȉLxSт{2(]Q({.xiqۉ3u#T`>h kjrDZNnD6>ɀ�=@; "qC!poF<�b#�6;`B x.kQ6ʏ>3=S7oQ/>X c?RɕȷfNiZeg)AQa@ T;7`\|5;ze:LCl WMmHdη-\~)ܾYͰT@ƺ8{zRа9wrDVd~K>z#9,N8NjO6VpRAq)*Jjdd͕Οx @NDc8Eh_q|ՉJc(ͪJNK&Å_>GRlzUX$6+IzBe3yWՠgm@ C60BnrQ{Oá M!2ps&]{A;p3>Ptңf<#Q}, r~@bM0Ox a|3 [ 1<H^=̻9ts.7~z#o!xIhJm=񤳁DWPfV|RU.ٹ] K'=c|l̞_n[v#-NMۑ7v);%2ѵ6Q,48C(T<CYO5^xhq;|s@7qvy}]uIb_msmQjs Jj3cG7p^�:nE!0 B`ȱ0k+J[iI BX#"9�SQ<k=Œ팉R�0ޭG|OF66\wt,:}aTzDzRU04U+0`ht醔R>`k[M?Zq \6g=Gϫfrv]wĿ:9dQ*6~fΕpg 3GA=*% $�l 7�u]2/6tސWwD@+iV60/]9b +'W5\76\7AVJ:8R  p;J]='O4z Μ/O\Q"Ah(!aJm>ߤ!f,X30 'o`ҮU# R&0<R\2tUkU[jDg#lvj1U6>vAosu7b),8#+U +VO) &kbń} ﲝ{Flrzyw=!؁ۮlh/ݿ]v3nSVG %ea `X=AT7E�N'.8 vdǪһRq1>KqUG=Mfn< q TyAX ƒX+JQa&�*,L.*s6솨t;\بN=c8"^�#}R6^ؙSvonh.Y8=Uꖨso'SOIn藿3aO\];˾fw,UԜ啣6җ[P?刞pkDcf5@8Fbt?яzc ̇UjvQ%ַXќ;88fS >8^8پ^9wJž;m.Yu;ynP-%\fǁL8ҕA=>\�En\ǵt]G4>N1nk 9Q\~W/;d8u~;_CL֪? {c0&ZV;E-jR?;ٷ0k@;1jUIFF&�!.PT&yGf+v>d٫rb/i[w d<WReȅR ayp*+%$tnؽdaO#Lۚ??i7=K�Nxk^uz $xaE%|KϾ{ OT4)'jn%:dZ0 kD Tp3-S RnJRPj@� ~{*[@TYH8!hZHNe]uUZbm#{ V%t_S _107h"eȬDQuo,k©}X&S_4f7B0HYX(&lOeRV9tIK!,,4$e՗e-֚xH'j 571EOVN<{=~G4gI~g#I 1G:[]BM,mqA[D<]r=pT1:\Jex+_zₕɴM 87i'Ul5Y#_*i\uyd:c߸v*H+Vn!׎͖7��ZSieԠy6qJ[+=6f=)k H|Zq ,~@|Q.5T@ťJݽ\Mޛj|Avw6ku_x~qb (iRсc)@@A*�ٚZF+[K;6[1B7^ތkcgy"EeGHkD,W끄̓ @K"WLF`t1;W\Bj*|DvUI۰&z *LI_Ҷ'^ղj{BJ2> `S9z{ BD=Lgq=e׎(.{5/Vd]=Hҕ>S0ӓ@ pY|fL!QA-daa~:jT !P]c%^zdڱ1ex 2F\ NhP�"#O(REA^%#dX3N>9KeasD$wu|*pv FtUTN"Y)</f5 Hxv<'j�tijQ MÝ&TQq" ڗ%^]v$!t0" ;v=d=?B֞$n? D*ix.S�x Ċ(OL?؛}]TDjqSx\JS?Qq%'Dzl7qwۏsFPoeqG)6ublx:4)^ Ƶ26wUtG#׈]S];%Рʝ]9ˠ)dD&|HX_`=򗿼㪗@ ^{+ [k(G,ѹۑ"+ѮxN=nD]C]Dg Ai!_җ|=~| H w}vw{^m13zBT1V!J:2>Q;vM]w6bw>Y62.5<( ҙkyJ AlZpA&Q\5i7bkHI"6و$IH}�U59w\C v0**PzcNT=3yiEX�r ];W܁u&~F }Ȟ"�#0DD4E*r/Ԅva!fDT( \|z"}ddpX@"`RsZ5"pU*-3azH=}ΜnGv߲/|Q#5D 8BJ  s�>9{}$N_@x<F,.>.Uz뿶W^:x!IJb,X~+}9Pb>jM[X I-R5kǵ H,h{~B;!tdS$R)l=;i�6Sিf痬8*Vxb-*RH#}0OG``! jCKrCj1R7Yh<~ұ]w'J,vc4nEiNd/<  ~փ'> n�Nlb|}_E9ğB|EҾ� 9qȤ Xp� R%W�(u|;=�ԫ_j&~`H@6P@0B2];TYa= >d_BC偪}QA90{O;S9+ t}'x^_WP4zBH`C4((OF#8nB 2Pc~8:M�j#YI4l'Պ |٘]STc)VT,)62}E`y`}#:K eY/Oq@X( � ;R1,(?҈ 'rEZP>,dh h Yazt V}kGMwb z=IY7w:+kPk|T6ca�(7ҩ]ff7F>9 րp!pe`@k'�bj"#"@M#B]lL<e#vpn5u uAۨFN8}{.?*:H#<Pc�L>#b,p{ӛ9* 2M_�xa7qp'B<R,2P�+:XZ^pP;qICKXƖw b¬+={PJUm(S3a?_U6y y3tǟw]zJ]q 4%ߡ恳gP%;)^۸Oje= mjz|SmG'<F>g~Wի~7W~ R 3�o~_ ��<8y^W~Xdm!<[ŔRZ��"5�/֒g0cc, m!-(CxH<!!EBH@$,EyQ0B(8.٬uÌ{9+Sߞߩ}3sS3}twu~y&Ko.5 ?Ueڠ+ND(+of8*Fd{ъD=p66 7҅˿I8|y?K^qq)֍j>,*@*JuMX }8e!pFxD: :ʺ$qX89[m]e]N*AVQ|#%>Z v(mX7u@<&+1a#ѻT| Y'poؽ3n㮼|)w<KVxmOǣ B6~6N|v  @ *BeЃ!�_bToaSḨ[B90ph͐` �>% gdCs\PUq8g _mWR<Iq. kv6@|?a/[A<n <P[}|ssa6Kݳ>ԩOj�st $Tl٥# ct.ֶ;( vGOM܍_|sra"D괳9WPPa5cӊ"#rE�z=0r�[-mP#9z7x\n'q!5@Fq׾{H&sp|g @V"u˺!J2hxbA t8QmL !L`3` mO~@=27Kngy?_/ݣI='z€*7Ѹܼo}[\6@p\eig;ol1w;71c^N<T8&<犱fts7"| FWv@eDY iIφ6h{F¦l1\Ģ Y H?TP da!Dg#668?ת[.r%:}]۩F!|t\1�/vM7O}S!F4 ^o/^q>/^r:zc77,\sW.{_}b29c;`aB'�T$xF�=-C}$srH y0E@$[[P&iЩ<f$= C5+͜`F5Ӌ27҄\ (ޥ5J>FD>f(n�|g1$>G!&8H>>䩂R˺!J  vKLHg3VdB#H-{;q@z{sÝ=s*qysY@^vn7 SĀ*7V�WZD7 ipj/y`m휎68F͜FzNboQ|m9(;115Pֵ 2ImG1SRRxQɣˎf? ocBAr�K Craq|x7B3Ɓt:P} +d{\܈SwpSkÔ_m"ѷ2G!VX$<T/�#+OHt3qɍu3w;Zi8$?ØrxAR樞g E"vҵ+e3u8,s\bwU(?uY[YdUdF;u5#K-s 轭%=ɝNPsL?J7H- DP0WO_~]x!bOJe3\{kF<<qvN*Sf]9sk/yc:11{X&$/o㳌\yW0 D /mm!I6kG.qEGk, "THy CkK;m4h^7NwǙM= m;?:w3n> c$P*CB*,3kn{JNIw4 u'3aWI_uw&a~T.+Ҹ(" cB. xJ.ۨ)m'YqoOa<K1e]XtH;pPrرu|D́gJMV޶Cڞ ?׽~ MhTxX@7D HdT TExb#4vy* [˳fW{_6QjP>"1PHiK`r-"e u�[Z#@8I졫&|LQp]FHltd>*)۰'W͇NINh(Ad&fFu\mq`]pd2Cw=]w7j 6 m-2Wݹ`hptzX&=ؗK~0̑F+>sj^Ol]8*[6U2 ^ Q[a%`#6 u76X ?Z 080<9o~ Lрΰ4gY͓ K"b!؁@P~癸daբRFKlD_]IltY vRhG},IZ+Pv1tt>ۃ9 sͥ=YXd vBcHŋ&$`RW߯|+1 q�6Msrw‹o/= jDvه~8+C-7 :=FC9G%A*Mel**:+@Xn?q#A&~g;8%+eæS)wKQ<0nʏk:lQV]�<*ovQ{}53N41 6*SǍ( W'?/{/.oE&g߾LbۨH7&wO|ZE'Bqn Yۑdqa�qz|ԗʅuLlpw ~~�:=6�S;A.hN]|ӟ4 n!FՃ|Q:{18' ! v ٟkӰ\32qY>fT=\'˴ard]dK\$<_w.= n* 5qqY8ʽ71f{7:tMFA㦣wܕItŘ "�13H䅐\\=u] BJx쑉*>@T3+`90F3 KRx8DAĢl 4~_ XCT7@A8ʹG ^( GjFAٟkbv3*)&$^{}{G}ν5+9(8wb,KY3W!Iɽt!wq92/}e/H!wyodۨwe?aˋ//L̈́PxA`hn*ȅ�J[Jo]u%@*,z�2I�ois4�H-Y�t lq;CN0..怲8|ߎyר -zRsxKҳԩϱh}~9tɃ>`w3 Y|X!@H'0 sRh><"B?@X d> 0aeP/ @vdB$7ѕ8 RL܅KWR$Wo<b7>OcBMˈ񈞂<+P>`kY\d@Z�P_8�&|v�+V^&%Ц-ӟtlWC !- �4noy3Q�iTLH3' Μ&EBB"E9b?et�|Ȁ@c z�jȂ : BǎX*\ATTwM:țP$b=8aJi9kTZ4)�aeԣ/| _yNˣ3eޥ߽}=HcSHeWXObD3(/)N]O۹<x&^PN@&q^5I&�<y5*乨Xũ:|QFĝ  $+RoWZj_d�Q l9&O[HU|.DHuǧ-• s ŹS3Zt/97ToH7$3$ OۖXrBqِ) 2ܹ?Z:W>۰М{<tI⓿Fo?u_tۛ㔑wmy)Ć_%@% //^+ZЭVw&u9Ŧ4l `(ļ<]�x!<6Fyao,WG=dJ:={qQPEpN+I,Rk/Բ,;ICYցcߺǞsx3F7FO<F7m#ҒjPy=^!Z|]( }Q{gë:ʭdcJ@+qy fٷk ߨmAOҚ@:rӇ瓪CjJd9([Qz(=)8M$TomuR#W:zLq0Q  <9p B<w_']'=O3AcώK͎[:\2u>[m+hٱumSreIe* *rg[mT-`SU ōU(||"+u R,;ō9pÑ[+qsfui; y5\f9"P`w$xM㒅W ylTN6pc<6zQ}k..&G5J =2s&=#b! 5 %+kx!>kZmχ>?^(˞O&Pۈ){wZn BγNe~gͨmmNpuf,h^_;u_l N9Jˣj^Fi}5by֛qJFs5ӾZv{Ugi(-v٥4lsU4%GTȾp2du1ֆ  D K(4Noa j8^!=<~ h{HQ7(#_r9}z7fu$&h؟LrW8198Xzg"2oD]@ş x�8Pa{]6"BR8 ȋ6�g <XI*}rѮfFKb]$-͒49ݯ4M>G!BhW^ù4" \gᾰL<43x$up'CP?.-5 ; ~-ºH&w<ΏsQ\2`U *٘|7 >ĆTlwHҴgx ܨn-0]g$0dzިkDMGÐȮ3wUah=5@kl}";‡^c1ܞ1㉇=|51TZN2> ϸvp>Q\Ͽk +NoDI͓g7PF276 n:�ff;ui:hT2@b!fK='<3՜(I#'$&!w`|@)m� 2 w@5K^dU3'r�FxURx>%t|hL³qzU %$3 mN>wo$I8'a֝?~&H4ԙ{chXWއ1RCN& зĠ߉괮.L `#{2 Oh,{MH6$QW`mb mQÐV-e%b%Ul}:AM KZJ^jzmtFvpPp($|`-6!O^Wa{ 7.~+gWx:zdN,}8C@'u @�D@\v]<2PɬM $c@9$,QBC^PA|=X|&W\ ~׽u~D%HO?_C[uOO3>Hb@$pix"AAq:p>HgMĪY'!@R(RWD.؍ԣ K""mXVZ½f'\T~"欯EKfeDQeDEU_%URL]ftuaE(V}_*, !]UI[@d,7.waˁ +ƹW΍1$mB'f]7:Gc; ѷ6=Їp^PMѲ5+ תWF ]q!Y$=T(h }2Ģ!=A"gA,irxVD׼³�MDڍJqP+MfH#y&XpcazIȥ l&U|0Nu"D 4,N+nt#nyvR$!Tiŋ`*I@qYYp$h QdTX DR9XG}%ScJ6AVJ3`m N� �P"rd<*:@xp3Z4J }K0M �X+"kǗ洩4<S=z?Tx߿F]Q^t`X':|@N ROu#a` C$<y2R]Qhd8ck0bIħQ"rͱU! f4YR )@FTTU"gj[FUne-)ޙX(@Ziԃ_֫_TKw󲝺ĕw&Y<e2rhF Aҗ=zeH ]v>$+/9_in%w\}tFT$I=m87Zc-9,x[Nך~[�dl'{=D7'R@*@"I`,i$T*!$�Gz\FWJ܊HVD0KgDҒ^I)|FޞKf m *Xӽ E$^c'W|Xzޟ\2=J]z۾vzD6Ht۰ WbC%[@쐊C QY -*Ժ"a赽6p/M9q Ye}X65Drum2o{ʈ!t}miaξ "Yllis@5IڈS<. F=ΒkLFI2DQ@RE$ ),f֙crM uK*J $8[UzͿ.)##)IE%y1dc$.Aljc\dv{nC{m/KRFN�鐟Xpui|П}K4זdFTl 0uHDot̸ND$:N-W\mCUS $!J6I=FPí{ÐeYpYcRHmOQ1iL"IVHSUAP"C@$_/ûzԫ8V6B<̎RKH"TvsRʱ#`V"ZT\60bUX}.y\Jj.n>XHY Tv!6)ODUrՕL=x �}�v"K>jdhEY7͈L${"I^ˆ?;kK'TZߵ%t#nA- RI͒[mJ%Vri!VeHȺZ)u$Q,,[, c3?aT6_QAl&Vml;CRKd+=uY fse F:5-u=gl( Q >*a2.SwŔ)yŋ#% i˔Ro\QĴJgYܭVJUz~{S,HJ̓͢.c4F"1QH"AVRe먍EKYzjt HKr11Z: @dP)j-'LjYۊ 56wƪÝغ5`A2s^x"1N oxK/TCq˃RAqɑCv׾pw%VߑQ4W>YysrQvS=yOm찿%mkA >oUp?ʞA-^$PXFt:ȵS3o�զ8Qq&)\jJi^S:He gzB:hJ όˮ`2a(}o$kw-,'<IZ<ϤkH=DxC*f )܀ydP_ |lVثzГ{1OGQո|s=q'[VQ@$x3ǦIqFh:$RO#^qPym)`, Ҫqs2Q\1"e꺒Գ J IoƍVVkIuQIa||o3jcHn*"D0>>cngHF1>�%5W*6Ҍp(k< Tp|KH53$)ef@.sUUkA(=Ȭ !pgޓrH@.\W=>GC$g�|0W>,q�<Mٳhtbɏu T >b\ ޤ-1$~AR/acP@*N"~΍렿ľ2苹WWLqsQ y䱊 D?gz%A6gQR,5<R� *12GR_)U䶫+gD\Y)$ƊK:�B1} @1!Ez76 R$)E|1X0Q0Ԕrc3J+U[UT-QYȟl9YcK۬q;iL5gu  ɂu7H'_'9`N*PE)�կ~VJH!#T` "@$"P/�'`iC2,F-U~<H6=S1SDBtl5@dà U/-)b$AhK8&sRVTSd"XM/RYGy.>gZU;I䤓_2% M']<xi(oj L%R}1;sI.}J%QNA*؄5)ND""gV"3 z$A0L6!ȇ|V I|i+M;i /%Xq'1/H{Qؗ^}"+ 8uj>#'$@IkVWu@1xӛޤ \Q5dgJ'N5~20@<E�DEO@'sFg4!ȫIҘ2m�$g(8WRsDžhK#9SL `O$9FQ=Qa61CTTr!7CQvxG3G2YHp~=ځX ){c|_[ɔ5F3êdiޗX3m|2/#MRAJ_fg~5,)Rd7b>RSIY(cp11r1Uʨ8nRnj:UDzo ` �p[q w "H(|Nq\\dz'm6!;It%uނg^|Ò邔*Yʜ_S6M]~xV @,R�:6=C!k 9~gTSڡ@U9hWIX0ڀ/1T#�Uh'l_��?*2d&93n=U�,JKv !.�rM?c= bA"9/G"d\yzCd�(ϗņp+�mn-z ZGURUW:`tڀx^+s5ջ2uvIk%[L*jbBc6Tw~1 TJJQ2C0rdک X\MP�/XF̑zQmCR<l'b:~NdmI*muve5N[=o37Vr5B GtwT5zVbWv;T<Iԅ !$PvP�.# (FPF{K"6"?�+ D!|CeCEpNMMl3jpTp8jwm@u�R @_\/WAih_ЫN@߈�ϒD0I[g/-̷;Jz4G\ij3jDL"Onm̳ \srͲ/;Tq%$E,C*9i]F U$)4ZNNDcMsK˖Tc�` ل6oXTv!0dv qsLȎ'[xJ[zl~hXIҾB~˜+G,CLޖm$!!}@l8#`ouR wH3wA`³Gǡ "%AVp#oc\ MH/mߣ۫/M6ז@-7 xλ,'SOI"4>ex�ȶ̵6vb+u]gQ"cwFGRsUX\AXF.˶!f9I3Zr,(Xk а1!&P9A,ijH >a~K$ ߭ r׸Z&8�䠼q_j ; ddBm#l�De n-|?%6zqA)Go{lj~{\!KiǞ|jA$u,5Z_;yc@E#멻BnϻnSAC ķGXMp-}N&wH(]dOhDqK՗+D.ḁdUHZ"IN X+uѬ%' 7J@H\Τ AM$0n&VmURyiL8m$c[k]sm)^da)+>67Mz̳s,^wُ /'(U>3ؗ[O*z 4#')�%ȁS3 g]ۦ4croZ(i^i{=P|O=�H=Ce @h�j9FZR-1ػD:l;̈́7<Z$Ѳ5oatIg86|`lDL(g$IS2$=v(<\E]i ~~֢^{"}~Y+ [ɍ`n+] %Q>MSJbfpgM~.�{o}n9 ߷'xc+It~=ȽJ2j!UuRU aխ ۫muHBUG.[N $e8 ⺔߬ :Gk16$tt&)'PlEIL$H 5uR b9[5UK^;g{"4vɶNW5.|%z.{ߛ$K�tI!u{JņKU ]T=n )ż9 m@`Er=e_ʫ/d,TzY%62i#׃[R$8MYq.dwVRʎ%JBL@2aiV9kAZ;x$!ق*ICɱe/uoÒ VZ:vҴ<_ RoD$?<\ r' >@u'9%ku}~uFcOc}bLzA@>R:=w5}uCΝvOty裏$4%-/`Lۃhi'7LQ{�y_Y~bc-r n Xw]PxŭH7`뻾p Li^O>26!}Hhꯄ M~soO[$ָMjq:FQK|m.lav6עR]UuHV]:Hm~hYzC˾aҶmh*/#eaI<*R"&u1y-Ѧ#^YFRxVѿm饯*rZhŶT#S 1"U+0F}Lw>2"飮ЇJ1~6\ú +I.H V(,ޥb CAsW=y[;zrcȦ җ$ bu[_BB*)VW-X2)u7vT QE !:U7v=i'ds#uW+:D}nVܞkAt:,ȒX5Z$ZR?n?\*8^u{.rOe 8$W r='׀TjqGك=nнՀu &i߷>s_V4TՖ{Q;(X07f�5د˺aj{ȱWV<1(5ȯ˺N@} ފ#I~]e]$tWuav\uYukPӈ{ca����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/images/exfalso.png�������������������������������������������������������������0000644�0001750�0001750�00000160760�12607265240�020322� 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.5.3/docs/screenshots.rst����������������������������������������������������������������0000644�0001750�0001750�00000001747�12515146372�020001� 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.5.3/docs/downloads.rst������������������������������������������������������������������0000644�0001750�0001750�00000036654�12646426641�017445� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Downloads: .. |ubuntu-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/ubuntu.png :height: 16 :width: 16 .. |debian-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/debian.png :height: 16 :width: 16 .. |fedora-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/fedora.png :height: 16 :width: 16 .. |opensuse-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/opensuse.png :height: 16 :width: 16 .. |windows-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/windows.png :height: 16 :width: 16 .. |source-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/source.png :height: 16 :width: 16 .. |arch-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/arch.png :height: 16 :width: 16 .. |macosx-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/macosx.png :height: 16 :width: 16 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.4.1 quodlibet-3.4.1.tar.gz_ `SHA256 <quodlibet-3.4.1.tar.gz.sha256_>`_ `SIG <quodlibet-3.4.1.tar.gz.sig_>`_ Quod Libet 3.3.1 quodlibet-3.3.1.tar.gz_ `SHA256 <quodlibet-3.3.1.tar.gz.sha256_>`_ `SIG <quodlibet-3.3.1.tar.gz.sig_>`_ Quod Libet 3.2.2 quodlibet-3.2.2.tar.gz_ `SHA256 <quodlibet-3.2.2.tar.gz.sha256_>`_ `SIG <quodlibet-3.2.2.tar.gz.sig_>`_ ========================== =============================== ================================================== ============================================ .. _quodlibet-3.4.1.tar.gz: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.4.1.tar.gz .. _quodlibet-3.4.1.tar.gz.sha256: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.4.1.tar.gz.sha256 .. _quodlibet-3.4.1.tar.gz.sig: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.4.1.tar.gz.sig .. _quodlibet-3.3.1.tar.gz: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.3.1.tar.gz .. _quodlibet-3.3.1.tar.gz.sha256: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.3.1.tar.gz.sha256 .. _quodlibet-3.3.1.tar.gz.sig: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.3.1.tar.gz.sig .. _quodlibet-3.2.2.tar.gz: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.2.2.tar.gz .. _quodlibet-3.2.2.tar.gz.sha256: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.2.2.tar.gz.sha256 .. _quodlibet-3.2.2.tar.gz.sig: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.2.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 PPA (12.04+):: $ sudo add-apt-repository ppa:lazka/ppa Unstable PPA (12.04+):: $ sudo add-apt-repository ppa:lazka/dumpingplace .. note:: While Ubuntu 12.04 is supported, drag and drop does not work. .. note:: To remove the PPAs and revert back to the old version:: $ sudo apt-get install ppa-purge $ sudo ppa-purge ppa:lazka/ppa $ sudo ppa-purge 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 -------------------- Stable Repo (`OBS <https://build.opensuse.org/project/show/home:lazka0:ql-stable>`__): * `Fedora 20 <http://download.opensuse.org/repositories/home:/lazka0:/ql-stable/Fedora_20/home:lazka0:ql-stable.repo>`__ .. note:: Check out the official repos first, they usually contain the latest stable release: https://apps.fedoraproject.org/packages/quodlibet/overview/ Unstable Repo (`OBS <https://build.opensuse.org/project/show/home:lazka0:ql-unstable>`__): * `Fedora 20 <http://download.opensuse.org/repositories/home:/lazka0:/ql-unstable/Fedora_20/home:lazka0:ql-unstable.repo>`__ Unstable Repo (`COPR <http://copr.fedoraproject.org/coprs/lazka/quodlibet-unstable/>`__): * `Fedora 22 <http://copr.fedoraproject.org/coprs/lazka/quodlibet-unstable/repo/fedora-22/lazka-quodlibet-unstable-fedora-22.repo>`__ * `Fedora 21 <http://copr.fedoraproject.org/coprs/lazka/quodlibet-unstable/repo/fedora-21/lazka-quodlibet-unstable-fedora-21.repo>`__ * `Fedora 20 <http://copr.fedoraproject.org/coprs/lazka/quodlibet-unstable/repo/fedora-20/lazka-quodlibet-unstable-fedora-20.repo>`__ * `Fedora Rawhide <http://copr.fedoraproject.org/coprs/lazka/quodlibet-unstable/repo/fedora-rawhide/lazka-quodlibet-unstable-fedora-rawhide.repo>`__ * `RHEL 7 <http://copr.fedoraproject.org/coprs/lazka/quodlibet-unstable/repo/epel-7/lazka-quodlibet-unstable-epel-7.repo>`__ .. _opensuse: |opensuse-logo| openSUSE ------------------------ Stable Repo: * `openSUSE 13.2 <http://download.opensuse.org/repositories/home:/lazka0:/ql-stable/openSUSE_13.2/>`__ * `openSUSE 13.1 <http://download.opensuse.org/repositories/home:/lazka0:/ql-stable/openSUSE_13.1/>`__ * `openSUSE Tumbleweed <http://download.opensuse.org/repositories/home:/lazka0:/ql-stable/openSUSE_Tumbleweed>`__ Unstable Repo: * `openSUSE 13.2 <http://download.opensuse.org/repositories/home:/lazka0:/ql-unstable/openSUSE_13.2/>`__ * `openSUSE 13.1 <http://download.opensuse.org/repositories/home:/lazka0:/ql-unstable/openSUSE_13.1/>`__ * `openSUSE Tumbleweed <http://download.opensuse.org/repositories/home:/lazka0:/ql-unstable/openSUSE_Tumbleweed>`__ .. _arch: |arch-logo| Arch Linux ---------------------- Stable: :: $ pacman -S quodlibet Unstable: See `quodlibet-hg <https://aur.archlinux.org/packages/quodlibet-hg>`__ in the `AUR <https://wiki.archlinux.org/index.php/AUR>`__. .. _windows: |windows-logo| Windows ---------------------- Based on `pygi-aio <https://sourceforge.net/projects/pygobjectwin32/>`__ by `Tumagonx Zakkum <https://github.com/tumagonx>`__ =========================== ============================== ================================================= ========================================== Release File SHA256 PGP =========================== ============================== ================================================= ========================================== Quod Libet 3.4.1 quodlibet-3.4.1-installer.exe_ `SHA256 <quodlibet-3.4.1-installer.exe.sha256_>`_ `SIG <quodlibet-3.4.1-installer.exe.sig_>`_ Quod Libet 3.4.1 (portable) quodlibet-3.4.1-portable.exe_ `SHA256 <quodlibet-3.4.1-portable.exe.sha256_>`_ `SIG <quodlibet-3.4.1-portable.exe.sig_>`_ Quod Libet 3.3.1 quodlibet-3.3.1-installer.exe_ `SHA256 <quodlibet-3.3.1-installer.exe.sha256_>`_ `SIG <quodlibet-3.3.1-installer.exe.sig_>`_ Quod Libet 3.3.1 (portable) quodlibet-3.3.1-portable.exe_ `SHA256 <quodlibet-3.3.1-portable.exe.sha256_>`_ `SIG <quodlibet-3.3.1-portable.exe.sig_>`_ Quod Libet 3.2.2 quodlibet-3.2.2-installer.exe_ `SHA256 <quodlibet-3.2.2-installer.exe.sha256_>`_ `SIG <quodlibet-3.2.2-installer.exe.sig_>`_ Quod Libet 3.2.2 (portable) quodlibet-3.2.2-portable.exe_ `SHA256 <quodlibet-3.2.2-portable.exe.sha256_>`_ `SIG <quodlibet-3.2.2-portable.exe.sig_>`_ =========================== ============================== ================================================= ========================================== .. _quodlibet-3.4.1-portable.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.4.1-portable.exe .. _quodlibet-3.4.1-portable.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.4.1-portable.exe.sha256 .. _quodlibet-3.4.1-portable.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.4.1-portable.exe.sig .. _quodlibet-3.4.1-installer.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.4.1-installer.exe .. _quodlibet-3.4.1-installer.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.4.1-installer.exe.sha256 .. _quodlibet-3.4.1-installer.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.4.1-installer.exe.sig .. _quodlibet-3.3.1-portable.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.3.1-portable.exe .. _quodlibet-3.3.1-portable.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.3.1-portable.exe.sha256 .. _quodlibet-3.3.1-portable.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.3.1-portable.exe.sig .. _quodlibet-3.3.1-installer.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.3.1-installer.exe .. _quodlibet-3.3.1-installer.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.3.1-installer.exe.sha256 .. _quodlibet-3.3.1-installer.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.3.1-installer.exe.sig .. _quodlibet-3.2.2-portable.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.2.2-portable.exe .. _quodlibet-3.2.2-portable.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.2.2-portable.exe.sha256 .. _quodlibet-3.2.2-portable.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.2.2-portable.exe.sig .. _quodlibet-3.2.2-installer.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.2.2-installer.exe .. _quodlibet-3.2.2-installer.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.2.2-installer.exe.sha256 .. _quodlibet-3.2.2-installer.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.2.2-installer.exe.sig For old releases see the `full file listing <https://bitbucket.org/lazka/quodlibet/downloads/>`__. There is also an SDK for developing under Windows: `quodlibet-win-sdk.tar.gz <https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-win-sdk.tar.gz>`__ .. _macosx: |macosx-logo| Mac OS X ---------------------- Based on the `OS X bundles <https://github.com/elelay/quodlibet-osx-bundle>`__ created by `Eric Le Lay <https://github.com/elelay>`__ =========================== ============================== ========================================== ========================================== Release Application Bundle SHA256 PGP =========================== ============================== ========================================== ========================================== Quod Libet 3.4.1 (v2) QuodLibet-3.4.1-v2.zip_ `SHA256 <QuodLibet-3.4.1-v2.zip.sha256_>`_ `SIG <QuodLibet-3.4.1-v2.zip.sig_>`_ Ex Falso 3.4.1 (v2) ExFalso-3.4.1-v2.zip_ `SHA256 <ExFalso-3.4.1-v2.zip.sha256_>`_ `SIG <ExFalso-3.4.1-v2.zip.sig_>`_ Quod Libet 3.4.1 QuodLibet-3.4.1.zip_ `SHA256 <QuodLibet-3.4.1.zip.sha256_>`_ `SIG <QuodLibet-3.4.1.zip.sig_>`_ Ex Falso 3.4.1 ExFalso-3.4.1.zip_ `SHA256 <ExFalso-3.4.1.zip.sha256_>`_ `SIG <ExFalso-3.4.1.zip.sig_>`_ Quod Libet 3.4.0 Quodlibet-3.4.0_1.zip_ `SHA256 <Quodlibet-3.4.0_1.zip.sha256_>`_ Ex Falso 3.4.0 ExFalso-3.4.0_1.zip_ `SHA256 <ExFalso-3.4.0_1.zip.sha256_>`_ Quod Libet 3.3.1 Quodlibet-3.3.1_0.zip_ `SHA256 <Quodlibet-3.3.1_0.zip.sha256_>`_ Ex Falso 3.3.1 ExFalso-3.3.1_0.zip_ `SHA256 <ExFalso-3.3.1_0.zip.sha256_>`_ =========================== ============================== ========================================== ========================================== .. _QuodLibet-3.4.1-v2.zip: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.4.1-v2.zip .. _QuodLibet-3.4.1-v2.zip.sha256: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.4.1-v2.zip.sha256 .. _QuodLibet-3.4.1-v2.zip.sig: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.4.1-v2.zip.sig .. _ExFalso-3.4.1-v2.zip: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.4.1-v2.zip .. _ExFalso-3.4.1-v2.zip.sha256: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.4.1-v2.zip.sha256 .. _ExFalso-3.4.1-v2.zip.sig: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.4.1-v2.zip.sig .. _QuodLibet-3.4.1.zip: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.4.1.zip .. _QuodLibet-3.4.1.zip.sha256: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.4.1.zip.sha256 .. _QuodLibet-3.4.1.zip.sig: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.4.1.zip.sig .. _ExFalso-3.4.1.zip: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.4.1.zip .. _ExFalso-3.4.1.zip.sha256: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.4.1.zip.sha256 .. _ExFalso-3.4.1.zip.sig: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.4.1.zip.sig .. _Quodlibet-3.4.0_1.zip: https://github.com/elelay/quodlibet-osx-bundle/releases/download/Quodlibet-3.4.0_1/Quodlibet-3.4.0_1.zip .. _Quodlibet-3.4.0_1.zip.sha256: https://github.com/elelay/quodlibet-osx-bundle/releases/download/Quodlibet-3.4.0_1/Quodlibet-3.4.0_1.zip.sha256 .. _ExFalso-3.4.0_1.zip: https://github.com/elelay/quodlibet-osx-bundle/releases/download/ExFalso-3.4.0_1/ExFalso-3.4.0_1.zip .. _ExFalso-3.4.0_1.zip.sha256: https://github.com/elelay/quodlibet-osx-bundle/releases/download/ExFalso-3.4.0_1/ExFalso-3.4.0_1.zip.sha256 .. _Quodlibet-3.3.1_0.zip: https://github.com/elelay/quodlibet-osx-bundle/releases/download/Quodlibet-3.3.1_0/Quodlibet-3.3.1_0.zip .. _Quodlibet-3.3.1_0.zip.sha256: https://github.com/elelay/quodlibet-osx-bundle/releases/download/Quodlibet-3.3.1_0/Quodlibet-3.3.1_0.zip.sha256 .. _ExFalso-3.3.1_0.zip: https://github.com/elelay/quodlibet-osx-bundle/releases/download/ExFalso-3.3.1_0/ExFalso-3.3.1_0.zip .. _ExFalso-3.3.1_0.zip.sha256: https://github.com/elelay/quodlibet-osx-bundle/releases/download/ExFalso-3.3.1_0/ExFalso-3.3.1_0.zip.sha256 ������������������������������������������������������������������������������������quodlibet-3.5.3/docs/conf.py������������������������������������������������������������������������0000644�0001750�0001750�00000002250�12646426641�016201� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os import sys import sphinx dir_ = os.path.dirname(os.path.realpath(__file__)) sys.path.insert(0, dir_) sys.path.insert(0, os.path.abspath(os.path.join(dir_, ".."))) from quodlibet import const extensions = ['sphinx.ext.autodoc', 'ext'] source_suffix = '.rst' master_doc = 'index' project = 'Ex Falso / Quod Libet' copyright = u"2004-2015 %s and more" % ", ".join(const.MAIN_AUTHORS) version = ".".join(const.VERSION.rsplit(".")[:2]) release = const.VERSION if release.endswith(".-1"): release = release[:-3] exclude_patterns = ['_build', '_rtd_theme_repo', 'README.rst'] if sphinx.version_info >= (1, 3): html_theme = "sphinx_rtd_theme" else: html_theme = "default" html_title = "%s (%s)" % (project, version) bug_url_template = "https://github.com/quodlibet/quodlibet/issues/%s" pr_url_template = "https://github.com/quodlibet/quodlibet/pull/%s" # on a stable branch which isn't a release if const.BRANCH_NAME != "master" and const.VERSION_TUPLE[-1] == -1: 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.5.3/docs/bugs_repo.rst������������������������������������������������������������������0000644�0001750�0001750�00000002457�12646426641�017432� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. |git-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/git.png :height: 16 :width: 16 .. |bug-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/bug.png :height: 16 :width: 16 ====================== Bug Tracker / Git Repo ====================== .. _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: |git-logo| Git Repo ------------------- Quod Libet uses `Git <http://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.5.3/docs/README.rst���������������������������������������������������������������������0000644�0001750�0001750�00000000650�12607265240�016364� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Quod Libet / Ex Falso Documentation =================================== Dependencies: * sphinx (http://sphinx-doc.org/) Build: make Build full documentation (fetches the rtfd.org theme) make guide Build only the user guide (fetches the rtfd.org theme) 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.5.3/docs/ext.py�������������������������������������������������������������������������0000644�0001750�0001750�00000001513�12607265240�016046� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from docutils import nodes def bug_role(name, rawtext, text, lineno, inliner, *args, **kwargs): app = inliner.document.settings.env.app url_tmpl = app.config.bug_url_template or "missing/%s" node = nodes.reference( rawtext, "[%s]" % text, refuri=url_tmpl % text) return [node], [] def pr_role(name, rawtext, text, lineno, inliner, *args, **kwargs): app = inliner.document.settings.env.app url_tmpl = app.config.pr_url_template or "missing/%s" node = nodes.reference( rawtext, "[pr-%s]" % text, refuri=url_tmpl % text) return [node], [] def setup(app): app.add_role('bug', bug_role) app.add_config_value('bug_url_template', None, 'env') app.add_role('pr', pr_role) app.add_config_value('pr_url_template', None, 'env') �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/development/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017230� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/development/contributing.rst���������������������������������������������������0000644�0001750�0001750�00000006352�12607265240�022465� 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 Please follow the `bug report guidelines <https://github.com/quodlibet/quodlibet/blob/master/CONTRIBUTING.rst>`__. For more general tips see `"How to Report Bugs Effectively" <http://www.chiark.greenend.org.uk/~sgtatham/bugs.html>`_. 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 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.5.3/docs/development/index.rst����������������������������������������������������������0000644�0001750�0001750�00000000243�12646426641�021065� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Development Guide ================= .. toctree:: :titlesonly: contributing devenv guidelines plugins tools faq maint formats �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/development/guidelines.rst�����������������������������������������������������0000644�0001750�0001750�00000006350�12607265240�022104� 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 <http://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.5.3/docs/development/formats.rst��������������������������������������������������������0000644�0001750�0001750�00000014711�12646426641�021436� 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 represention of the Unicode string. This tag may occur any number of times in a file. .. _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. This is similar to the ID3v2 IPLS (involved person list) frame. Examples: ``*performer:vocals=Brandon Patton``, ``performer:banjo=Béla Fleck*``. 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.5.3/docs/development/maint.rst����������������������������������������������������������0000644�0001750�0001750�00000007607�12646426641�021101� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Maintainer Resources ==================== Useful Specifications --------------------- * Code: * `PEP-8, style guidelines for Python code <http://www.python.org/dev/peps/pep-0008/>`_ * `GNOME Human Interface Guidelines <http://developer.gnome.org/hig-book/>`_ * File Formats: * `APEv2 tag specification <http://wiki.hydrogenaudio.org/index.php?title=APEv2_specification>`_ * `MP3/ID3 <http://www.id3.org/>`_: * `MPEG audio header format <http://www.dv.co.yu/mpgscript/mpeghdr.htm>`_, and the `Xing VBR header <http://www.codeproject.com/audio/MPEGAudioInfo.asp#XINGHeader>`_ * `ID3v2.4 structure <http://www.id3.org/id3v2.4.0-structure.txt>`_, `ID3v2.4 frame list <http://www.id3.org/id3v2.4.0-frames.txt>`_, `ID3v2.3 <http://www.id3.org/id3v2.3.0.html>`_, `ID3v2.2 <http://www.id3.org/id3v2-00.txt>`_, and `ID3v1 <http://www.id3.org/id3v1.html>`_ * `Lyrics3v2 <http://www.id3.org/lyrics3200.html>`_ * `Xiph Formats <http://www.xiph.org/>`_: * `Ogg bitstream structure <http://www.xiph.org/ogg/doc/rfc3533.txt>`_ * `Vorbis comment structure <http://www.xiph.org/vorbis/doc/v-comment.html>`_ * `Ogg Vorbis embedding <http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html>`_ * `FLAC format <http://flac.sourceforge.net/format.html>`_, and `Ogg FLAC embedding <http://flac.sourceforge.net/ogg_mapping.html>`_ * `Ogg Theora embedding <http://theora.org/doc/Theora_I_spec.pdf>`_ Downstream Bug Trackers ----------------------- * `Fedora <https://admin.fedoraproject.org/pkgdb/acls/bugs/quodlibet>`_ * `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>`_ Tags & Branches --------------- At the point where no more functionality will be added to a release, a new branch gets created. All bugfix changes should get committed there and merged back in the default branch where new functionality can be added. In case a bugfix was committed to the default branch or an unplanned stable release is needed, use Git's `cherry-pick` features to copy those changes to the stable branch(es). :: /|\ /|\ | | | 2.4.91 2.5.-1 / <--- quodlibet-2.5 branch |_____/ | /|\ | | | 2.4.1 <--- quodlibet-2.4.1 tag | | | 2.4.0.-1 | | | 2.4 <--- quodlibet-2.4.0 tag | | | 2.3.91.-1 | | | 2.3.91 2.4.-1 / |______/ <--- quodlibet-2.4 branch | | <--- default branch 2.3.-1 | /|\ Translation Backport Braindump ------------------------------ given: translation update for default, branch possibly contains code that got removed in default. **TODO: needs updating for Git.** :: hg up default # (commit translations to default) hg update quodlibet-2.5 ./setup.py build_mo msgcat --use-first brach.po default.po > branch.po ./setup.py test # (review changes..) hg up default hg merge --tool internal:local quodlibet-2.5 Release Checklist ----------------- **TODO: needs updating for Git.** Stable Release: * Run test suite on karmic/arch * Update version * Run setup.py build_mo * Update NEWS * Commit (release prep) * hg tag quodlibet-x.y.z * Update version * Commit (version bump) * hg up default * hg merge --tool internal:local quodlibet-x.y Files: * Run setup.py sdist * Create the plugin tarball Windows: * hg up quodlibet-x.y.z * setup.py build_mo * win_installer_build.py quodlibet-x.y.z * copy MSVC files * reinstall / test �������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/docs/development/tools.rst����������������������������������������������������������0000644�0001750�0001750�00000006746�12646426641�021134� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Useful Development Tools ======================== Performance Profiling --------------------- cProfile ^^^^^^^^ * http://docs.python.org/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__) ... ... 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: http://www.google.at/search?q=runsnakerun&tbm=isch Gprof2Dot ^^^^^^^^^ * http://code.google.com/p/jrfonseca/wiki/Gprof2Dot :: python -m cProfile -o output.pstats ./quodlibet.py gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png Line Profiler ^^^^^^^^^^^^^ * http://packages.python.org/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 ^^^^^^ * http://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.5.3/docs/development/devenv.rst���������������������������������������������������������0000644�0001750�0001750�00000004774�12646426641�021262� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. |windows-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/windows.png :height: 16 :width: 16 .. |linux-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/linux.png :height: 16 :width: 16 .. |macosx-logo| image:: http://bitbucket.org/lazka/quodlibet-files/raw/default/icons/macosx.png :height: 16 :width: 16 .. _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 :ref:`the provided bundle <macosx>` itself. The bundle contains a 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 provide a special SDK package which includes all dependencies and tools for development. Check out the :ref:`Windows download section <windows>`. First extract the package and open a console in the sdk directory. Then #. run env.bat #. (first time only) run clone.bat #. cd quodlibet\\quodlibet #. python quodlibet.py If you want to build an installer yourself or change/add dependencies check out the `"win_installer" <https://github.com/quodlibet/quodlibet/tree/master/win_installer>`__ directory in the git repo for further instructions. ����quodlibet-3.5.3/docs/development/faq.rst������������������������������������������������������������0000644�0001750�0001750�00000011770�12607265240�020525� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Frequently Asked Questions ========================== Any plans to use Python 3? -------------------------- Not immediately, though it's now (May 2015) `on the development radar <https://github.com/quodlibet/quodlibet/issues/1580>`_. First, all dependencies (like mutagen) would need to be ported, though this is largely done now. That said, at the moment Python 2 does its job well. I'm using PyCharm and it can't resolve certain functions like ``print_d``. What should I do? -------------------------------------------------------------------------------------------- QL adds some commonly used functions to `__builtin__` which PyCharm can't resolve. You can remove the resulting warnings by adding the function names to the `Ignore references` list under `File > Settings > Project Settings > Inspections > Python > Unresolved references`. Add the following names to the list: * `_` * `Q_` * `N_` * `ngettext` * `print_` * `print_d` * `print_w` * `print_e` What format is the song database in? ------------------------------------ It's a pickled list of AudioFile instances. It's easy to edit, if you know a little Python; here's an example session from the Python interactive interpreter which can get you started. :: Python 2.6.2 (r262:71600, Jun 4 2009, 15:54:27) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import quodlibet >>> import cPickle >>> with open(".quodlibet/songs", 'r') as songsfile: ... songs = cPickle.load(songsfile) ... >>> for k, v in songs[0].items(): ... print u'%-26s= %s' % (k, v) ... date = 2003 musicbrainz_albumartistid = 2624e8b9-3f77-453d-85e8-6a8c9e5b9d65 tracknumber = 1/11 ~mountpoint = /opt/media musicbrainz_trackid = 4471cad1-c642-4171-8bca-a8ddf7ac805b ~#skipcount = 0 album = You Are Here replaygain_album_gain = -0.519531 dB ~#bitrate = 192000 title = Ventriloquist ~#length = 195 ~#rating = 0.25 ~filename = /opt/media/music/+_-/You Are Here/01 - Ventriloquist.mp3 replaygain_album_peak = 0.46560668967 genre = Synthpop replaygain_track_peak = 0.423797607619 ~#laststarted = 0 ~#playcount = 5 artist = +/- musicbrainz_albumid = d9816797-946e-4d4e-beea-7940fdef57cc ~#added = 1215625984 replaygain_track_gain = +1.960938 dB ~#lastplayed = 1125835201 ~#mtime = 1238344410.0 >>> >>> inrainbows = filter(lambda s: s.get('album') == "In Rainbows", songs) >>> for s in inrainbows: ... s['~#rating'] = 1.0 ... >>> with open('test', 'w') as newsongsfile: ... cPickle.dump(songs, newsongsfile) ... >>> 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 an optimised native pickle-based repository to any of these, and each comes with a compatibility / maintenance cost. This doesn't mean it won't happen some day, but 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_NO_TRANS When in the environment disables translations QUODLIBET_NO_MMKEYS When in the environment disables multimedia keys support 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.5.3/docs/development/plugins.rst��������������������������������������������������������0000644�0001750�0001750�00000004754�12607265240�021443� 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.5.3/tests/������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�015120� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_formats_aac.py�����������������������������������������������������������0000644�0001750�0001750�00000004363�12607265240�021004� 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 shutil from tests import TestCase, DATA_DIR, mkstemp, skipUnless from quodlibet.formats.aac import AACFile try: from mutagen.aac import AAC except ImportError: AAC = None class _TAACFile(TestCase): NAME = None def setUp(self): fd, self.f = mkstemp(".aac") os.close(fd) shutil.copy(os.path.join(DATA_DIR, self.NAME), self.f) 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 = os.path.join(DATA_DIR, '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"), "") @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.5.3/tests/test_qltk_delete.py�����������������������������������������������������������0000644�0001750�0001750�00000003010�12607265240�021006� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from gi.repository import Gtk from tests import TestCase from quodlibet import config from quodlibet.formats import AudioFile from quodlibet.util.path import fsnative 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.5.3/tests/test_util_library.py����������������������������������������������������������0000644�0001750�0001750�00000004346�12607265240�021227� 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 sys from quodlibet import config from quodlibet.util.library import split_scan_dirs, set_scan_dirs from quodlibet.util.path import fsnative from tests import TestCase ON_WINDOWS = sys.platform == "win32" 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 Tsplit_scan_dirs(TestCase): def test_basic(self): if ON_WINDOWS: res = split_scan_dirs(r":Z:\foo:C:/windows:") self.assertEquals(res, [r"Z:\foo", "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 ON_WINDOWS: res = split_scan_dirs( ":%s:%s" % (STANDARD_PATH, GVFS_PATH_ESCAPED)) self.assertEquals(res, [STANDARD_PATH, GVFS_PATH]) class Tset_scan_dirs(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() @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 ON_WINDOWS else GVFS_PATH_ESCAPED self.assertEqual(self.scan_dirs, "%s:%s" % (STANDARD_PATH, expected)) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_information.py������������������������������������������������������0000644�0001750�0001750�00000002702�12607265240�022100� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase, init_fake_app, destroy_fake_app from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary from quodlibet.util.path import fsnative from quodlibet.qltk.information import Information 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.library = SongLibrary() def tearDown(self): destroy_fake_app() self.library.destroy() quodlibet.config.quit() def test_none(self): Information(self.library, []).destroy() def test_one(self): f = AF({"~filename": fsnative(u"/dev/null")}) Information(self.library, [f]).destroy() def test_two(self): f = AF({"~filename": fsnative(u"/dev/null")}) f2 = AF({"~filename": fsnative(u"/dev/null2")}) Information(self.library, [f, f2]).destroy() def test_album(self): f = AF({"~filename": fsnative(u"/dev/null"), "album": "woo"}) f2 = AF({"~filename": fsnative(u"/dev/null2"), "album": "woo"}) Information(self.library, [f, f2]).destroy() def test_artist(self): f = AF({"~filename": fsnative(u"/dev/null"), "artist": "woo"}) f2 = AF({"~filename": fsnative(u"/dev/null2"), "artist": "woo"}) Information(self.library, [f, f2]).destroy() ��������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_views.py������������������������������������������������������������0000644�0001750�0001750�00000015225�12646426641�020723� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.qltk.views import AllTreeView, BaseView, TreeViewColumn, \ DragScroll, MultiDragTreeView, RCMTreeView, DragIconTreeView import quodlibet.config from gi.repository import Gtk, Gdk 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_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_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, ctrl=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, ctrl=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) 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() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_data_editors.py�����������������������������������������������������0000644�0001750�0001750�00000001224�12607265240�022213� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_qltk_sliderbutton.py�����������������������������������������������������0000644�0001750�0001750�00000001124�12607265240�022266� 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.sliderbutton import HSlider 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() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_tracker.py����������������������������������������������������������0000644�0001750�0001750�00000006222�12646426641�021216� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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() self.failUnless("woo=bar\n" in file(self.filename).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.5.3/tests/test_qltk_edittags.py���������������������������������������������������������0000644�0001750�0001750�00000005667�12607265240�021374� 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 * 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.5.3/tests/test_formats_vgm.py�����������������������������������������������������������0000644�0001750�0001750�00000002401�12607265240�021040� 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 tests import TestCase, DATA_DIR from quodlibet.formats.vgm import VgmFile class TVgmFile(TestCase): def setUp(self): self.song = VgmFile(os.path.join(DATA_DIR, '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 = os.path.join(DATA_DIR, '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.5.3/tests/test_browsers_albums.py�������������������������������������������������������0000644�0001750�0001750�00000016701�12646426641�021744� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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 tests import TestCase from helper import realized from quodlibet import config from quodlibet.browsers.albums import AlbumList from quodlibet.browsers.albums.prefs import Preferences, FakeAlbum 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.path import fsnative 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): _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 album def assertOrder(self, func, list_): # sort twice for full line coverage of the compare function reversed_ = list(sorted(list_, cmp=func, reverse=True)) sorted_ = list(sorted(list_, cmp=func)) 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, [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, [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, [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, [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, [None, a, b, c, n]) class TFakeAlbum(TestCase): def test_call(self): self.assertEqual(FakeAlbum()("title"), "Title") self.assertEqual(FakeAlbum()("~title~artist"), "Title - Artist") self.assertEqual(FakeAlbum(title="foo")("title"), "foo") self.assertEqual(FakeAlbum(title="f")("~title~artist"), "f - Artist") self.assertEqual(FakeAlbum()("~#rating"), "Rating") self.assertEqual(FakeAlbum({"~#rating": 0.5})("~#rating"), 0.5) self.assertEqual(FakeAlbum()("~#rating:max"), "Rating<max>") def test_get(self): self.assertEqual(FakeAlbum().get("title"), "Title") def test_comma(self): self.assertEqual(FakeAlbum().comma("title"), "Title") self.assertEqual(FakeAlbum({"~#rating": 0.5}).comma("~#rating"), 0.5) self.assertEqual(FakeAlbum(title="a\nb").comma("title"), "a, b") 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 tearDown(self): self.bar.disconnect(self._id) self.bar.disconnect(self._id2) config.quit() ���������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_queue.py������������������������������������������������������������0000644�0001750�0001750�00000001350�12607265240�020675� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from gi.repository import Gtk 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(Gtk.CheckMenuItem(), SongLibrary(), player) def test_ctr(self): pass def test_status_icon(self): widget = PlaybackStatusIcon() widget.play() widget.stop() widget.pause() widget.pause() def tearDown(self): self.queue.destroy() quodlibet.config.quit() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_cbes.py�������������������������������������������������������������0000644�0001750�0001750�00000010231�12646426641�020472� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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) f = file(self.fname, "w") f.write(self.memory) f.close() f = file(self.fname + ".saved", "w") f.write(self.saved) f.close() 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, file(self.fname).read()) self.failUnlessEqual(self.saved, file(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) f = file(self.fname + ".saved", "w") f.write( "%s\n%s\n" % (self.TEST_KV_DATA[0][1], self.TEST_KV_DATA[0][0])) f.close() 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.5.3/tests/test_formats_remote.py��������������������������������������������������������0000644�0001750�0001750�00000001476�12646426641�021564� 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.path import is_fsnative from quodlibet.formats.remote import RemoteFile class TRemoteFile(TestCase): def test_path_types(self): f = RemoteFile("http://example.com") self.assertTrue(is_fsnative(f["~mountpoint"])) self.assertTrue(is_fsnative(f["~filename"])) def test_fix_old_types(self): f = RemoteFile("http://example.com") f["~filename"] = b"foo" self.assertTrue(is_fsnative(f["~filename"])) f["~filename"] = u"foo" self.assertTrue(is_fsnative(f["~filename"])) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_tagscombobox.py�����������������������������������������������������0000644�0001750�0001750�00000002325�12607265240�022243� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/quality/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016610� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/quality/test_pyflakes.py������������������������������������������������������0000644�0001750�0001750�00000003016�12646426641�022034� 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 sys try: from pyflakes.scripts import pyflakes except ImportError: pyflakes = None from tests import TestCase, skipUnless class FakeStream(object): # skip these, can be false positives BL = [ "unable to detect undefined names", ] def __init__(self): self.lines = [] def write(self, text): for p in self.BL: if p in text: return text = text.strip() if not text: return self.lines.append(text) def check(self): if self.lines: raise Exception("\n".join(self.lines)) @skipUnless(pyflakes, "pyflakes not found") class TPyFlakes(TestCase): def __check_path(self, path): old_stdout = sys.stdout stream = FakeStream() try: sys.stdout = stream for dirpath, dirnames, filenames in os.walk(path): for filename in filenames: if filename.endswith('.py'): pyflakes.checkPath(os.path.join(dirpath, filename)) finally: sys.stdout = old_stdout stream.check() def test_core(self): import quodlibet path = quodlibet.__path__[0] path = os.path.dirname(path) self.__check_path(path) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/quality/__init__.py�����������������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�020700� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/quality/test_pep8.py����������������������������������������������������������0000644�0001750�0001750�00000004607�12646426641�021101� 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 glob import subprocess from quodlibet.util.path import iscommand from tests import TestCase, skipUnless @skipUnless(iscommand("pep8"), "pep8 not found") class TPEP8(TestCase): # E12x popped up in pep8 1.4 compared to 1.2.. # drop them once 1.4 is common enough # E261: at least two spaces before inline comment IGNORE_ERROROS = ["E12", "E261", "E265", "E713", "W602", "E402", "E731", "W503"] def _run(self, path, ignore=None): if ignore is None: ignore = [] ignore += self.IGNORE_ERROROS p = subprocess.Popen( ["pep8", "--ignore=" + ",".join(ignore), path], stderr=subprocess.PIPE, stdout=subprocess.PIPE) class Future(object): def __init__(self, p): self.p = p def result(self): if self.p.wait() != 0: return self.p.communicate() return Future(p) def test_all(self): futures = [] # main_package import quodlibet path = quodlibet.__path__[0] files = glob.glob(os.path.join(path, "*.py")) for file_ in files: futures.append(self._run(file_)) # packages for entry in os.listdir(path): sub = os.path.join(path, entry) if os.path.isdir(sub): futures.append(self._run(sub)) # tests futures.append( self._run(os.path.join(path, "../tests"), ignore=["W601"])) # scripts scripts = glob.glob(os.path.join(os.path.join(path, "../"), "*.py")) assert scripts for script in scripts: futures.append(self._run(script)) # dist files = glob.glob(os.path.join(os.path.join(path, "../gdist"), "*.py")) assert files for file_ in files: futures.append(self._run(file_)) # join and print results errors = [] for f in futures: res = f.result() if res is not None: stdout, stderr = res errors.append(stdout) if errors: raise Exception("\n".join(errors)) �������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_songmodel.py��������������������������������������������������������0000644�0001750�0001750�00000031625�12607265240�021550� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from gi.repository import Gtk from quodlibet.player.nullbe import NullPlayer from quodlibet.formats import AudioFile from quodlibet.qltk.songmodel import PlaylistModel, PlaylistMux from quodlibet.qltk.playorder import ORDERS, Order 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(), range(10)) self.pl.set(range(12)) Gtk.main_iteration_do(False) self.assertEqual(self.pl.get(), 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_repeat(self): self.pl.repeat = True self.pl.go_to(3) for i in range(9): self.pl.next() self.assertEqual(self.pl.current, 2) for i in range(12): self.pl.next() self.assertEqual(self.pl.current, 4) def test_shuffle(self): self.pl.order = ORDERS[1](self.pl) for i in range(5): numbers = [self.pl.current for i in range(10) if self.pl.next() or True] self.assertNotEqual(numbers, range(10)) numbers.sort() self.assertEqual(numbers, range(10)) self.pl.next() self.assertEqual(self.pl.current, None) def test_weighted(self): self.pl.order = ORDERS[2](self.pl) r0 = AudioFile({'~#rating': 0}) r1 = AudioFile({'~#rating': 1}) r2 = AudioFile({'~#rating': 2}) r3 = AudioFile({'~#rating': 3}) self.pl.set([r0, r1, r2, r3]) Gtk.main_iteration_do(False) songs = [self.pl.current for i in range(1000) if self.pl.next() or True] self.assert_(songs.count(r1) > songs.count(r0)) self.assert_(songs.count(r2) > songs.count(r1)) self.assert_(songs.count(r3) > songs.count(r2)) def test_shuffle_repeat(self): self.pl.order = ORDERS[1](self.pl) self.pl.repeat = True numbers = [self.pl.current for i in range(30) if self.pl.next() or True] allnums = range(10) * 3 allnums.sort() self.assertNotEqual(numbers, allnums) numbers.sort() self.assertEqual(numbers, allnums) def test_onesong(self): self.pl.go_to(3) self.pl.order = ORDERS[3](self.pl) self.failUnlessEqual(self.pl.current, 3) self.pl.next() self.failUnlessEqual(self.pl.current, 4) self.pl.next_ended() self.failUnlessEqual(self.pl.current, None) def test_onesong_repeat(self): self.pl.go_to(3) self.pl.order = ORDERS[3](self.pl) self.pl.repeat = True self.failUnlessEqual(self.pl.current, 3) self.pl.next() self.failUnlessEqual(self.pl.current, 4) self.pl.next_ended() self.failUnlessEqual(self.pl.current, 4) 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 = ORDERS[1](self.pl) 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.pl) 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 = ORDERS[0](self.pl) 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.repeat = True self.pl.order = ORDERS[1](self.pl) 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, 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, 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, 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 = ORDERS[1](self.pl) 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()), 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.5.3/tests/test_remote.py����������������������������������������������������������������0000644�0001750�0001750�00000001672�12646426641�020027� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from helper import temp_filename from quodlibet.remote import QuodLibetUnixRemote 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 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, [b"foo", b"bar", b"baz"]) def test_response(self): with temp_filename() as fn: mock = Mock(resp=b"resp") remote = QuodLibetUnixRemote(None, mock) remote._callback(b"\x00foo\x00%s\x00" % fn) self.assertEqual(mock.lines, [b"foo"]) with open(fn, "rb") as h: self.assertEqual(h.read(), b"resp") ����������������������������������������������������������������������quodlibet-3.5.3/tests/test_util_collections.py������������������������������������������������������0000644�0001750�0001750�00000011113�12607265240�022067� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.util.collections import HashedList, DictProxy 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(self.fdict.iterkeys()), list(self.rdict.iterkeys())) def test_values(self): self.failUnlessEqual( list(self.fdict.values()), list(self.rdict.values())) self.failUnlessEqual( list(self.fdict.itervalues()), list(self.rdict.itervalues())) def test_items(self): self.failUnlessEqual( list(self.fdict.items()), list(self.rdict.items())) self.failUnlessEqual( list(self.fdict.iteritems()), list(self.rdict.iteritems())) 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.5.3/tests/test_query__match.py����������������������������������������������������������0000644�0001750�0001750�00000010452�12607265240�021201� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.query._match import map_numeric_op, ParseError from quodlibet.util import date_key, parse_date class TNumericOp(TestCase): TIME = 424242 def test_time_op(self): # lastplayed less than 10 seconds ago o, v = map_numeric_op("lastplayed", "<", "10 seconds", time_=self.TIME) self.failUnless(o(self.TIME - 5, v)) # laststarted more than 1 day ago o, v = map_numeric_op("laststarted", ">", "1 day", time_=self.TIME) self.failUnless(o(self.TIME - (3600 * 25), v)) # added less than 4 minutes and 30 seconds ago o, v = map_numeric_op("added", "<", "4:30", time_=self.TIME) self.failUnless(o(self.TIME - (4 * 60 + 15), v)) self.failIf(o(self.TIME - (4 * 60 + 35), v)) # don't allow time keys with raw numbers self.assertRaises(ParseError, map_numeric_op, "added", "<", "42") def test_date_op(self): o, v = map_numeric_op("lastplayed", "=", "2004") self.assertTrue(o(parse_date("2004"), v)) o, v = map_numeric_op("lastplayed", "<", "2004") self.assertTrue(o(parse_date("2003"), v)) o, v = map_numeric_op("lastplayed", ">", "2004") self.assertFalse(o(parse_date("2003"), v)) def test_time_unit(self): t = map_numeric_op("mtime", "=", "now", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME) t = map_numeric_op("mtime", ">", "today", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME - (3600 * 24)) t = map_numeric_op("mtime", ">", "2 days ago", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME - (3600 * 24 * 2)) t = map_numeric_op("mtime", ">", "3.0 weeks ago", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME - (3600 * 24 * 7 * 3)) t = map_numeric_op("mtime", ">", "3 months ago", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME - (3600 * 24 * 30 * 3)) t = map_numeric_op("mtime", ">", "1 year ago", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME - (3600 * 24 * 365)) t = map_numeric_op("mtime", ">", "5 hours ago", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME - (3600 * 5)) t = map_numeric_op("mtime", ">", "1 minute", time_=self.TIME)[1] self.failUnlessEqual(t, self.TIME - (60)) self.failUnlessRaises(ParseError, map_numeric_op, "mtime", "<", "3 foo") self.failUnlessRaises(ParseError, map_numeric_op, "mtime", "<", "bar") def test_time_format(self): o, v = map_numeric_op("length", ">", "5:10") self.failUnless(o(5 * 60 + 12, v)) o, v = map_numeric_op("length", "=", "10:5:10") self.failUnless(o((3600 * 10) + (5 * 60) + 10, v)) def test_date(self): o, v = map_numeric_op("date", ">", "2004") self.failUnless(o(date_key("2004-01-02"), v)) o, v = map_numeric_op("date", "=", "2005") self.failUnless(o(date_key("2005"), v)) self.failUnlessRaises( ParseError, map_numeric_op, "date", ">", "2001-foo") def test_float(self): for variant in ["0.5", ".5", "+.5", "+.5e0"]: o, v = map_numeric_op("rating", ">", variant) self.failUnless(o(0.6, v)) self.failIf(o(0.5, v)) def test_size(self): o, v = map_numeric_op("filesize", ">", "10MB") self.failUnless(o(1024 * 1024 * 11, v)) self.failIf(o(1024 * 1024 * 9, v)) o, v = map_numeric_op("filesize", ">", "1MB") self.failUnless(o(1024 * 1024 * 1.1, v)) self.failIf(o(1024 * 1024 * 0.9, v)) map_numeric_op("filesize", ">", "10kB") map_numeric_op("filesize", ">", "10bytes") map_numeric_op("filesize", ">", "10G") map_numeric_op("filesize", ">", "10m") self.failUnlessRaises(ParseError, map_numeric_op, "foobar", ">", "10MB") self.failUnlessRaises(ParseError, map_numeric_op, "filesize", ">", "10X") self.failUnlessRaises(ParseError, map_numeric_op, "filesize", "!", "10MB") def test_simple(self): o, v = map_numeric_op("playcount", "<=", "5") self.failUnless(o(5, v)) self.failIf(o(5.01, v)) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_util_json_data.py��������������������������������������������������������0000644�0001750�0001750�00000006762�12646426641�021540� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import json import os from quodlibet.util.json_data import JSONObjectDict, JSONObject from tests 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(json.dumps(exp), 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) # 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.5.3/tests/test_formats__audio.py��������������������������������������������������������0000644�0001750�0001750�00000061520�12646426641�021525� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase, DATA_DIR import os from quodlibet import config from quodlibet.util.path import is_fsnative, fsnative, fsdecode from quodlibet.formats import AudioFile from quodlibet.formats._audio import INTERN_NUM_DEFAULT from quodlibet.formats import decode_value 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", "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", "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", "albumartist": "Various Artists", "performer": "Jay-Z"}) quux = AudioFile({ "~filename": os.path.join(DATA_DIR, "asong.ogg"), "album": u"Quuxly" }) num_call = AudioFile({"custom": "0.3"}) class TAudioFile(TestCase): def setUp(self): config.RATINGS = config.HardCodedRatingsPrefs() file(quux["~filename"], "w") def test_sort(self): l = [quux, bar_1_2, bar_2_1, bar_1_1] l.sort() self.assertEqual(l, [bar_1_1, bar_1_2, bar_2_1, quux]) self.assertEqual(quux, 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 quux.realkeys()) self.failIf("~filename" in quux.realkeys()) self.failUnless("album" in quux.realkeys()) def test_iterrealitems(self): self.assertEqual( list(quux.iterrealitems()), [('album', u'Quuxly')]) 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_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 self.failIf(quux("not a key")) self.failUnlessEqual(quux("not a key", "foo"), "foo") self.failUnlessEqual(quux("artist"), "") self.failUnlessEqual(quux("~basename"), "asong.ogg") self.failUnlessEqual(quux("~dirname"), DATA_DIR) self.failUnlessEqual(quux("title"), "asong.ogg [Unknown]") 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) 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): self.failUnlessEqual(quux("~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 [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")) self.failUnlessEqual( song("~title~~#tracks"), song("~title~~#tracks")) 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)]) self.failUnlessEqual(quux.list("artist"), []) self.failUnlessEqual(quux.list("title"), [quux("title")]) self.failUnlessEqual(quux.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_separate(self): for key in bar_1_1.realkeys(): self.failUnlessEqual(bar_1_1.list_separate(key), [bar_1_1(key)]) self.failUnlessEqual(bar_2_1.list_separate("~artist~album"), ['Foo - Bar', 'I have two artists - Bar']) self.failUnlessEqual(bar_2_1.list_separate("~artist~~#track"), ['Foo - 1', 'I have two artists - 1']) def test_list_list_separate_types(self): res = bar_2_1.list_separate("~~#track~artist~~filename") self.assertEqual(res, [u'1 - Foo - does not/exist', u'1 - I have two artists - does not/exist']) 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"), unicode)) def test_exist(self): self.failIf(bar_2_1.exists()) self.failUnless(quux.exists()) def test_valid(self): self.failIf(bar_2_1.valid()) 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): self.failIf(quux.can_change("~foobar")) self.failIf(quux.can_change("=foobar")) self.failIf(quux.can_change("foo=bar")) self.failIf(quux.can_change("")) self.failUnless(quux.can_change("foo bar")) def test_is_writable(self): self.assertTrue(quux.is_writable()) os.chmod(quux["~filename"], 0444) self.assertFalse(quux.is_writable()) os.chmod(quux["~filename"], 0644) self.assertTrue(quux.is_writable()) def test_can_multiple_values(self): self.assertEqual(quux.can_multiple_values(), True) self.assertTrue(quux.can_multiple_values("artist")) def test_rename(self): old_fn = quux("~basename") new_fn = fsnative(u"anothersong.mp3") dir = DATA_DIR self.failUnless(quux.exists()) quux.rename(new_fn) self.failIf(os.path.exists(dir + old_fn), "%s already exists" % (dir + old_fn)) self.failUnless(quux.exists()) quux.rename(old_fn) self.failIf(os.path.exists(dir + new_fn)) self.failUnless(quux.exists()) # move out of parent dir and back quux.rename(fsnative(u"/tmp/more_test_data")) self.failIf(os.path.exists(dir + old_fn)) self.failUnless(quux.exists()) quux.rename(dir + old_fn) self.failUnless(quux.exists()) def test_rename_to_existing(self): quux.rename(quux("~basename")) if os.name != "nt": self.failUnlessRaises( ValueError, quux.rename, fsnative(u"/dev/null")) self.failUnlessRaises(ValueError, quux.rename, os.path.join(DATA_DIR, "silence-44-s.ogg")) def test_website(self): song = AudioFile() song["comment"] = "www.foo" song["contact"] = "eh@foo.org" self.failUnlessEqual(song.website(), "www.foo") song["contact"] = "https://www.foo.org" self.failUnlessEqual(song.website(), "https://www.foo.org") song["website"] = "foo\nhttps://another.com" self.failUnlessEqual(song.website(), "foo") song = AudioFile({"artist": "Artist", "album": "Album"}) for value in song.values(): self.failUnless(value in song.website()) song["labelid"] = "QL-12345" self.failIf(song["artist"] in song.website()) self.failUnless(song["labelid"] in song.website()) def test_lyric_filename(self): song = AudioFile() song["~filename"] = fsnative(u"filename") self.assertTrue(is_fsnative(song.lyric_filename)) song["title"] = u"Title" song["artist"] = u"Artist" self.assertTrue(is_fsnative(song.lyric_filename)) song["lyricist"] = u"Lyricist" self.assertTrue(is_fsnative(song.lyric_filename)) def test_sanitize(self): q = AudioFile(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()) | INTERN_NUM_DEFAULT) self.failUnlessEqual(dump.count("\n"), num + 2) for key, value in bar_1_1.items(): self.failUnless(key in dump) self.failUnless(value in dump) for key in INTERN_NUM_DEFAULT: self.failUnless(key in dump) n = AudioFile() n.from_dump(dump) self.failUnless(set(dump.split("\n")) == set(n.to_dump().split("\n"))) def test_to_dump_long(self): b = AudioFile(bar_1_1) b["~#length"] = 200000000000L dump = b.to_dump() num = len(set(bar_1_1.keys()) | INTERN_NUM_DEFAULT) self.failUnlessEqual(dump.count("\n"), num + 2) 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_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"] = "/\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_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": "/\x87\x12.mp3", "title": "linux"}) self.failUnlessEqual(f("~uri"), "file:///%87%12.mp3") def tearDown(self): os.unlink(quux["~filename"]) 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"), unicode)) path = fsnative(u"/foobar") self.assertEqual(decode_value("~filename", path), fsdecode(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.5.3/tests/test_qltk_image.py������������������������������������������������������������0000644�0001750�0001750�00000011762�12646426641�020652� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase import cairo from gi.repository import Gtk, GdkPixbuf, Gdk from quodlibet.qltk.image import set_renderer_from_pbosf, \ set_image_from_pbosf, get_scale_factor, pbosf_get_property_name, \ get_pbosf_for_pixbuf, scale, calc_scale_size, add_border, \ add_border_widget, pbosf_get_width, pbosf_get_height, \ set_ctx_source_from_pbosf, pbosf_get_rect 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_scale_factor(self): w = Gtk.Button() self.assertTrue(get_scale_factor(w) in range(10)) def test_get_pbosf_for_pixbuf(self): w = Gtk.Button() rgb = GdkPixbuf.Colorspace.RGB newpb = GdkPixbuf.Pixbuf.new(rgb, True, 8, 10, 10) pbosf = get_pbosf_for_pixbuf(w, newpb) self.assertTrue(isinstance(pbosf, (GdkPixbuf.Pixbuf, cairo.Surface))) def test_pbosf_get_property_name(self): sf = cairo.ImageSurface(cairo.FORMAT_RGB24, 10, 10) self.assertEqual(pbosf_get_property_name(sf), "surface") rgb = GdkPixbuf.Colorspace.RGB newpb = GdkPixbuf.Pixbuf.new(rgb, True, 8, 10, 10) self.assertEqual(pbosf_get_property_name(newpb), "pixbuf") # We pass None to clear an image, fall back to pixbuf in this case self.assertEqual(pbosf_get_property_name(None), "pixbuf") def test_set_image_from_pbosf(self): image = Gtk.Image() if hasattr(Gtk.Image, "new_from_surface"): sf = cairo.ImageSurface(cairo.FORMAT_RGB24, 10, 10) set_image_from_pbosf(image, sf) self.assertTrue(image.props.surface) rgb = GdkPixbuf.Colorspace.RGB newpb = GdkPixbuf.Pixbuf.new(rgb, True, 8, 10, 10) set_image_from_pbosf(image, newpb) self.assertTrue(image.props.pixbuf) def test_set_renderer_from_pbosf(self): cell = Gtk.CellRendererPixbuf() if hasattr(Gtk.Image, "new_from_surface"): sf = cairo.ImageSurface(cairo.FORMAT_RGB24, 10, 10) set_renderer_from_pbosf(cell, sf) rgb = GdkPixbuf.Colorspace.RGB newpb = GdkPixbuf.Pixbuf.new(rgb, True, 8, 10, 10) set_renderer_from_pbosf(cell, newpb) set_renderer_from_pbosf(cell, None) 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, round=False) self.assertEqual(res.get_width(), w + 2) self.assertEqual(res.get_height(), h + 2) res = add_border(self.small, color, round=True) 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() cell = Gtk.CellRendererText() add_border_widget(self.small, widget, cell, True) add_border_widget(self.small, widget, None, True) def test_pbosf_get_width_height(self): w = Gtk.Button() rgb = GdkPixbuf.Colorspace.RGB s = get_scale_factor(w) newpb = GdkPixbuf.Pixbuf.new(rgb, True, 8, 10 * s, 15 * s) pbosf = get_pbosf_for_pixbuf(w, newpb) self.assertEqual(pbosf_get_width(pbosf), 10) self.assertEqual(pbosf_get_height(pbosf), 15) def test_set_ctx_source_from_pbosf(self): sf = cairo.ImageSurface(cairo.FORMAT_RGB24, 10, 10) ctx = cairo.Context(sf) surface = cairo.ImageSurface(cairo.FORMAT_RGB24, 10, 10) pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 4, 4) set_ctx_source_from_pbosf(ctx, surface) set_ctx_source_from_pbosf(ctx, pixbuf) def test_pbosf_get_rect(self): sf = cairo.ImageSurface(cairo.FORMAT_RGB24, 10, 11) self.assertEqual(pbosf_get_rect(sf), (0, 0, 10, 11)) pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 4, 5) self.assertEqual(pbosf_get_rect(pixbuf), (0, 0, 4, 5)) ��������������quodlibet-3.5.3/tests/test_util_string_titlecase.py�������������������������������������������������0000644�0001750�0001750�00000012210�12604031045�023102� 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.5.3/tests/test_browsers_media.py��������������������������������������������������������0000644�0001750�0001750�00000001533�12607265240�021526� 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 * 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.5.3/tests/test_qltk_completion.py�������������������������������������������������������0000644�0001750�0001750�00000002325�12607265240�021725� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_util_path.py�������������������������������������������������������������0000644�0001750�0001750�00000005524�12607265240�020516� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os import unittest from tests import TestCase from quodlibet.util.path import pathname2url_win32, iscommand, limit_path, \ fsnative, is_fsnative, get_home_dir is_win = os.name == "nt" path_set = bool(os.environ.get('PATH', False)) class Tpathname2url(TestCase): def test_win(self): cases = { r"c:\abc\def": "/c:/abc/def", r"C:\a b\c.txt": "/C:/a%20b/c.txt", r"\\xy\z.txt": "//xy/z.txt", r"C:\a:b\c:d": "/C:/a%3Ab/c%3Ad", r"\\server\share\foo": "//server/share/foo", } p2u = pathname2url_win32 for inp, should in cases.iteritems(): self.failUnlessEqual(p2u(inp), should) class Tget_x_dir(TestCase): def test_get_home_dir(self): self.assertTrue(is_fsnative(get_home_dir())) 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(is_fsnative(new)) self.assertEqual(len(new), 255) self.assertTrue(new.endswith(fsnative(u"xx.ext"))) new = limit_path(path) self.assertTrue(is_fsnative(new)) self.assertEqual(len(new), 255) self.assertTrue(new.endswith(fsnative(u"...ext"))) self.assertTrue(is_fsnative(limit_path(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") def test_looks_in_path(self): path_dirs = set(os.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 os.listdir(d): if os.access(os.path.join(d, file_path), os.X_OK): print_d("Testing %s" % file_path) self.failUnless(iscommand(file_path)) return ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_util_dbusutils.py��������������������������������������������������������0000644�0001750�0001750�00000011100�12501341560�021554� 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 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 = """ <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 = """ <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 = '\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, unicode)) text = u"öäü" value = apply_signature(text, "s", utf8_strings=True) self.failUnless(isinstance(value, str)) value = apply_signature(text, "s") self.failUnless(isinstance(value, unicode)) 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_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_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('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.5.3/tests/test_plugins_events.py��������������������������������������������������������0000644�0001750�0001750�00000005152�12607265240�021567� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase, mkstemp, mkdtemp import os import sys 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() for f in os.listdir(self.tempdir): os.remove(os.path.join(self.tempdir, f)) os.rmdir(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.5.3/tests/test_qltk_controls.py���������������������������������������������������������0000644�0001750�0001750�00000002502�12607265240�021414� 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, SeekBar, \ TimeLabel 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_seekbar(self): w = SeekBar(self.p, self.l) w.destroy() def test_volume(self): w = Volume(self.p) w.destroy() 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) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_util_fifo.py�������������������������������������������������������������0000644�0001750�0001750�00000002615�12607265240�020503� 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.fifo import split_message 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"), [("foo", None), ("a", "/dev")]) self.assertEqual(func(b"\x00a\x00/dev\x00foo"), [("a", "/dev"), ("foo", None)]) self.assertEqual(func(b"\x00a\x00/dev\x00foo\x00b\x00/arg\x00bla"), [("a", "/dev"), ("foo", None), ("b", "/arg"), ("bla", None)]) # inval self.assertRaises(ValueError, func, "foo\x00bar") �������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_browsers___init__.py�����������������������������������������������������0000644�0001750�0001750�00000004103�12607265240�022202� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import sys from tests import TestCase from quodlibet import browsers browsers.init() class TBrowsers(TestCase): def test_presence(self): self.failUnless(browsers.empty) 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("EmptyBar") is browsers.empty.EmptyBar) 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.empty.EmptyBar), "Disabled") def test_get_invalid(self): self.assertRaises(ValueError, browsers.get, "DoesNotExist") def test_index(self): self.assertEqual( browsers.browsers[browsers.index("EmptyBar")], browsers.empty.EmptyBar) 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.5.3/tests/test_player_gst.py������������������������������������������������������������0000644�0001750�0001750�00000021013�12646426641�020674� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os import sys import contextlib try: from gi.repository import Gst except ImportError: Gst = None from tests import TestCase, skipUnless, DATA_DIR 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 from quodlibet.formats import MusicFile 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"], unicode)) self.assertTrue(u"äöü" in parsed["foo"].split("\n")) l["foo"] = u"äöü".encode("utf-8") parsed = parse_gstreamer_taglist(l) self.assertTrue(isinstance(parsed["foo"], unicode)) self.assertTrue(u"äöü" in parsed["foo"].split("\n")) l["bar"] = 1.2 self.failUnlessEqual(parse_gstreamer_taglist(l)["bar"], 1.2) l["bar"] = 9L 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"], unicode)) 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) # parse_gstreamer_taglist should only return unicode self.failIf(sanitize_tags({"foo": "bar"})) @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 = os.path.join(DATA_DIR, file_) song = MusicFile(path) if song is not None: self._check(song) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test___init__.py��������������������������������������������������������������0000644�0001750�0001750�00000002111�12607265240�020251� 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 import quodlibet from quodlibet import config from quodlibet.util.path import is_fsnative 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(is_fsnative(quodlibet.get_base_dir())) self.assertTrue(is_fsnative(quodlibet.get_image_dir())) self.assertTrue(is_fsnative(quodlibet.get_user_dir())) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_bookmarks.py��������������������������������������������������������0000644�0001750�0001750�00000002056�12607265240�021545� 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.bookmarks import EditBookmarks, MenuItems from quodlibet.player.nullbe import NullPlayer from quodlibet.util.path import fsnative 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.5.3/tests/test_library_libraries.py�����������������������������������������������������0000644�0001750�0001750�00000047627�12607265240�022237� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from gi.repository import Gtk import os import shutil from quodlibet import config from quodlibet.util import connect_obj from quodlibet.formats import AudioFile from tests import TestCase, DATA_DIR, mkstemp from helper import capture_output from quodlibet.library.libraries import * class Fake(int): def __init__(self, _): self.key = int(self) def Frange(*args): return 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"] = "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 map(FakeSongFile, range(*args)) def FSrange(*args): return map(FakeSong, range(*args)) def ASrange(*args): return 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()), range(100, 120)) self.failUnlessEqual(sorted(self.library.iterkeys()), 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()), range(20)) self.failUnlessEqual(sorted(self.library.itervalues()), 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 = zip(range(100, 120), range(20)) self.failUnlessEqual(sorted(self.library.items()), expected) self.failUnlessEqual(sorted(self.library.iteritems()), 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 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(Frange) def setUp(self): self.library = self.Library() def test_save_load(self): fd, filename = mkstemp() os.close(fd) try: self.library.add(Frange(30)) self.library.save(filename) library = self.Library() library.load(filename) self.failUnlessEqual( sorted(self.library.items()), sorted(library.items())) finally: os.unlink(filename) class TSongLibrary(TLibrary): Fake = FakeSong Frange = staticmethod(FSrange) Library = SongLibrary def test_rename_dirty(self): self.library.dirty = False song = FakeSong(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 = FakeSong(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 = FakeSong(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)), 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(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 IOError 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): fd, filename = mkstemp(".flac") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'empty.flac'), filename) return filename 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_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(self.library.itervalues()) self.failUnless(self.library.iteritems()) 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() ���������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_ratingsmenu.py������������������������������������������������������0000644�0001750�0001750�00000001712�12607265240�022107� 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 tests import TestCase from quodlibet import config from quodlibet.qltk.ratingsmenu import RatingsMenuItem from quodlibet.util.path import fsnative from quodlibet.library import SongLibrary, SongLibrarian from quodlibet.formats import AudioFile class TRatingsMenuItem(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_menuitem(self): library = SongLibrary() library.librarian = SongLibrarian() a = AudioFile({"~filename": fsnative(u"/foo")}) a.sanitize() x = RatingsMenuItem([a], library) x.set_rating(0, [a], library) x.destroy() library.destroy() library.librarian.destroy() ������������������������������������������������������quodlibet-3.5.3/tests/test_util_fmps.py�������������������������������������������������������������0000644�0001750�0001750�00000026047�12501341560�020523� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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 tests import TestCase from quodlibet.util.fmps import * class TFmps(TestCase): def setUp(self): pass def test_float(self): self.failUnlessEqual(str(FmpsFloat(1.0)), "1.0") self.failUnlessEqual(str(FmpsFloat(0.0)), "0.0") self.failUnlessEqual(str(FmpsFloat(-1.0)), "-1.0") self.failUnlessEqual(str(FmpsFloat(1.123456789)), "1.123457") def test_parse_float(self): self.failUnlessRaises(ValueError, lambda: FmpsFloat("")) self.failUnlessRaises(ValueError, lambda: FmpsFloat("a")) self.failUnlessEqual(FmpsFloat("99.99").native(), 99.99) self.failUnlessEqual(FmpsFloat("-1.0").native(), -1.0) self.failUnlessEqual(FmpsFloat("-1").native(), -1) def test_pos_float(self): self.failUnlessEqual(str(FmpsPositiveFloat(1.0)), "1.0") self.failUnlessEqual(str(FmpsPositiveFloat(0.0)), "0.0") self.failUnlessEqual(str(FmpsPositiveFloat(1.123456789)), "1.123457") self.failUnlessRaises(ValueError, lambda: FmpsPositiveFloat(-1.0)) self.failUnlessRaises( ValueError, lambda: FmpsPositiveFloat(4294967295)) def test_parse_pos_float(self): self.failUnlessRaises(ValueError, lambda: FmpsPositiveFloat("")) self.failUnlessRaises(ValueError, lambda: FmpsPositiveFloat("a")) self.failUnlessRaises(ValueError, lambda: FmpsPositiveFloat("-1.0")) self.failUnlessEqual(FmpsPositiveFloat("99.99").native(), 99.99) self.failUnlessEqual( FmpsPositiveFloat("4294967296").native(), 4294967296) def test_rating_float(self): self.failUnlessEqual(str(FmpsRatingFloat(1.0)), "1.0") self.failUnlessEqual(str(FmpsRatingFloat(1)), "1.0") self.failUnlessRaises(ValueError, lambda: FmpsRatingFloat(-1.0)) self.failUnlessRaises(ValueError, lambda: FmpsRatingFloat(1.1)) def test_parse_rating_float(self): self.failUnlessRaises(ValueError, lambda: FmpsRatingFloat("")) self.failUnlessRaises(ValueError, lambda: FmpsRatingFloat("a")) self.failUnlessRaises(ValueError, lambda: FmpsRatingFloat("-1.0")) self.failUnlessRaises(ValueError, lambda: FmpsRatingFloat("1.1")) self.failUnlessEqual(FmpsRatingFloat("1").native(), 1) self.failUnlessEqual(FmpsRatingFloat("0.0").native(), 0) def test_rating_user(self): a = RatingUser("Alice Abba::0.6;;Bob Beatles::0.8;;Alice Abba::0.6") self.failUnlessEqual(a.get_all("Alice"), []) self.failUnlessEqual(a.keys(), ["Alice Abba", "Bob Beatles"]) self.failUnlessEqual(a.get_all("Alice Abba"), [0.6, 0.6]) a.remove_all("Alice Abba") self.failUnlessEqual(a.get_all("Alice Abba"), []) self.failUnlessEqual(a.keys(), ["Bob Beatles"]) a.set_all("Bob Beatles", 0.25) self.failUnlessEqual(a.to_data(), "Bob Beatles::0.25") a.append("Bob Beatles", 0.5) a.extend("Bob Beatles", [0.75, 1]) self.failUnlessEqual(a.get_all("Bob Beatles"), [0.25, 0.5, 0.75, 1]) a.set_all("Bob Beatles", [0.125, 0.375]) self.failUnlessEqual(a.get_all("Bob Beatles"), [0.125, 0.375]) self.failUnlessEqual(a.to_data(), "Bob Beatles::0.125;;Bob Beatles::0.375") def test_rating_user_2(self): # if a key got invalid values it still shows up, but returns an # empty list a = RatingUser("foo::1.25;;bar::0.75;;foo::-1") self.failUnlessEqual(a.keys(), ["foo", "bar"]) self.failUnlessEqual(a.get_all("foo"), []) # also they will be written back self.failUnlessEqual(a.to_data(), "foo::1.25;;foo::-1;;bar::0.75") # but they will be overwritten a.set_all("foo", 0.25) self.failUnlessEqual(a.to_data(), "foo::0.25;;bar::0.75") def test_rating_user_3(self): a = RatingUser("a::b::c;;abc;;def") a.append("foo", 0.25) self.failUnlessEqual(a.to_data(), "foo::0.25;;a::b::c;;abc;;def") # ignore empty strings a = RatingUser("") a.append("foo", 0.25) self.failUnlessEqual(a.to_data(), "foo::0.25") def test_rating_user_4(self): a = RatingUser("foo::0.5") self.failUnlessRaises(ValueError, lambda: a.set_all("foo", 1.2)) # an error shouldn't remove old data self.failUnlessEqual(a.to_data(), "foo::0.5") def test_rating_user_5(self): a = RatingUser() x = [1, 0] y = x[:] a.set_all("x", x) self.failUnlessEqual(x, y) def test_int(self): a = Playcount("3.0000") self.failUnlessEqual(type(a.native()), int) self.failUnlessEqual(str(a), "3.0000") a = PlaycountUser("a::135.0;;b::123") self.failUnlessEqual(a.get_all("a"), [135]) self.failUnlessEqual(a.get_all("b"), [123]) def test_key(self): a = PlaycountUser() self.failUnlessRaises(ValueError, lambda: a.set_all("", 1.0)) self.failUnlessRaises(ValueError, lambda: a.append("", 1.0)) a = RatingUser() self.failUnlessRaises(ValueError, lambda: a.set_all("", 1.0)) self.failUnlessRaises(ValueError, lambda: a.append("", 1.0)) def test_escaping(self): a = RatingUser() a.extend("foo::;;", [0, 0]) self.failUnlessEqual(a.to_data(), r"foo\:\:\;\;::0.0;;foo\:\:\;\;::0.0") a = RatingUser(r"foo\:\:\;\;::0.0;;foo\:\:\;\;::0.0") self.failUnlessEqual(a.get_all("foo::;;"), [0, 0]) a = Performers() a.set_all(";;foo::", ["::bar;;", r"\;\;\:\:", r"\:\:\;\;"]) b = Performers(a.to_data()) self.failUnlessEqual(a.to_data(), b.to_data()) def test_escaping_2(self): d = "a::b;;;c::d" a = RatingUser(d) self.failUnlessEqual(a.to_data(), d) d = "a::b;;c:::d" a = RatingUser(d) self.failUnlessEqual(a.to_data(), d) d = ";;;;" a = RatingUser(d) self.failUnlessEqual(a.to_data(), "") def test_escaping_3(self): a = RatingUser(":;:;:;::1") self.failUnlessEqual(a.to_data(), r"\:\;\:\;\:\;::1") a = Performers(":;::;:;") self.failUnlessEqual(a.to_data(), r"\:\;::\;\:\;") def test_escaping_4(self): a = Performers(";x;;a::b;;:;") Performers(a.to_data()) Performers(a.to_data()) Performers(a.to_data()) self.failUnlessEqual(a.get_all("a"), ["b"]) def test_escaping_5(self): a = Performers(r"a::b\;;a\::b") self.failUnlessEqual(a.get_all("a"), ["b;;a::b"]) a = Performers(r"a::b\\;;a\\::b") self.failUnlessEqual(a.get_all("a"), ["b\\"]) self.failUnlessEqual(a.get_all("a\\"), ["b"]) a = Performers(r"ab::b\\\;;a\\\::b") self.failUnlessEqual(a.get_all("ab"), [r"b\;;a\::b"]) self.failUnlessEqual(a.to_data(), r"ab::b\\\;\;a\\\:\:b") a = Performers(r"a::b\\\\;;a\\\\::b") self.failUnlessEqual(a.get_all("a"), ["b\\\\"]) self.failUnlessEqual(a.get_all("a\\\\"), ["b"]) a = Performers(r"a::b;;;a::b;;;a::b") self.failUnlessEqual(a.get_all("a"), []) a = Performers(r":a::b;;a::b;;;a::b") self.failUnlessEqual(a.get_all(":a"), ["b"]) a = Performers(r";:a::b;;a::b;;;a::b") self.failUnlessEqual(a.get_all(";:a"), ["b"]) def test_escaping_6(self): a = Performers(r";;") self.failUnlessEqual(a.to_data(), "") def test_invalid_escaping(self): d = r"in:;;:va;\;li\;d\;:\:\:\x." a = Performers(d) self.failUnlessEqual(a.to_data(), d) a = RatingUser(r"foo::ba:\:\;;;foo::\:") self.failUnlessEqual(a.to_data(), r"foo::ba\:\:\;;;foo::\:") def test_merge(self): a = Performers(["ab::cd", "ef::gh"]) self.failUnlessEqual(a.get_all("ab"), ["cd"]) self.failUnlessEqual(a.get_all("ef"), ["gh"]) self.failUnlessEqual(a.to_data(), "ab::cd;;ef::gh") a = Performers(["ab::cd", ";ef::gh;;ab::x", ";a;;;c"]) self.failUnlessEqual(a.get_all("ab"), ["cd", "x"]) self.failUnlessEqual(a.get_all(";ef"), ["gh"]) self.failUnlessEqual(a.to_data(), "\\;ef::gh;;ab::cd;;ab::x;;\\;a;;;c") a = Performers(a.to_data()) self.failUnlessEqual(a.get_all("ab"), ["cd", "x"]) self.failUnlessEqual(a.get_all(";ef"), ["gh"]) def test_rating_algo(self): a = RatingAlgorithm("") self.failUnlessEqual(a.keys(), []) a = RatingAlgorithm("a::b::0;;a::c::1.0;;a::b::0.25") self.failUnlessEqual(a.keys(), ["a"]) self.failUnlessEqual(a.get_all("a"), {"b": [0, 0.25], "c": [1]}) self.failUnlessEqual(a.get_all("a", "c"), [1]) def test_rating_algo_2(self): a = RatingAlgorithm("a::b::0;;a::c::1.0;;a::b::0.25") a.remove_all("a", "c") self.failUnlessEqual(a.keys(), ["a"]) self.failUnlessEqual(a.get_all("a"), {"b": [0, 0.25]}) a.remove_all("a") self.failUnlessEqual(a.keys(), []) self.failUnlessEqual(a.to_data(), "") def test_rating_algo_3(self): a = RatingAlgorithm("a::b::0") x = {"d": 1} y = {"d": 1} a.set_all("a", None, x) self.failUnlessEqual(x, y) self.failUnlessEqual(a.to_data(), "a::d::1.0") a.remove_all("a") x = [0, 0.25] y = x[:] a.set_all("x", "y", x) a.set_all("x", "y", x) self.failUnlessEqual(x, y) self.failUnlessEqual(a.to_data(), "x::y::0.0;;x::y::0.25") def test_rating_algo_4(self): a = RatingAlgorithm("a::b::0") a.append("a", "b", 1) a.append("a", "c", 1) self.failUnlessEqual(a.get_all("a"), {"b": [0, 1], "c": [1]}) a.remove_all("a") a.extend("a", "b", [0, 1]) self.failUnlessEqual(a.to_data(), "a::b::0.0;;a::b::1.0") def test_rating_algo_5(self): a = RatingAlgorithm("a::b::0;;a::b::1") self.failUnlessEqual(a.items(), [("a", "b", 0), ("a", "b", 1)]) a = RatingAlgorithm() self.failUnlessEqual(a.get_all("foo"), {}) self.failUnlessEqual(a.get_all("foo", "bar"), []) def test_escaping_20(self): a = RatingAlgorithm() a.extend("foo::;;", ":;::", [0]) self.failUnlessEqual(a.to_data(), r"foo\:\:\;\;::\:\;\:\:::0.0") a = RatingAlgorithm(r"foo\:\:\;\;::;\:::0.0") self.failUnlessEqual(a.get_all("foo::;;", ";:"), [0]) def test_invalid_escaping_20(self): d = r"in:;;:va;\;li\;d\;:\:\:" a = AlbumsCompilations(d) self.failUnlessEqual(a.to_data(), d) a = AlbumsCompilations(r"fo:o::ba:\:::;x;:;;xxx") self.failUnlessEqual(a.to_data(), r"fo\:o::ba\:\:::\;x\;\:;;xxx") def test_invalid_escaping_21(self): a = AlbumsCompilations(r";xxx;;a::b::c;;x;") a = AlbumsCompilations(a.to_data()) a = AlbumsCompilations(a.to_data()) a = AlbumsCompilations(a.to_data()) self.failUnlessEqual(a.get_all("a", "b"), ["c"]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_appdata_files.py���������������������������������������������������������0000644�0001750�0001750�00000003522�12607265240�021315� 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 tests import TestCase, mkstemp, skipUnless QLDATA_DIR = os.path.join(os.path.dirname( os.path.dirname(os.path.realpath(__file__))), "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 + "\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.5.3/tests/test_util_tags.py�������������������������������������������������������������0000644�0001750�0001750�00000002025�12607265240�020511� 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.5.3/tests/test_browsers__base.py��������������������������������������������������������0000644�0001750�0001750�00000012317�12607265240�021522� 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 gi.repository import Gtk from tests import TestCase, init_fake_app, destroy_fake_app 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 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 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.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.statusbar(1000) self.b.statusbar(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(), unicode)) self.b.filter_text(u"foo") self.assertEqual(self.b.get_filter_text(), u"foo") self.assertTrue(isinstance(self.b.get_filter_text(), unicode)) 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() 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.5.3/tests/test_qltk_prefs.py������������������������������������������������������������0000644�0001750�0001750�00000001126�12607265240�020671� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_formats_wavpack.py�������������������������������������������������������0000644�0001750�0001750�00000001525�12607265240�021711� 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, DATA_DIR from quodlibet.formats.wavpack import WavpackFile class TWavpackFile(TestCase): def setUp(self): self.song = WavpackFile(os.path.join(DATA_DIR, 'silence-44-s.wv')) def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.68471, 3) 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.5.3/tests/data/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016031� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/data/empty.aac����������������������������������������������������������������0000644�0001750�0001750�00000005021�12604031045�017610� 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.5.3/tests/data/empty.ogg����������������������������������������������������������������0000644�0001750�0001750�00000016660�12501341560�017655� 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.5.3/tests/data/coverart.wv��������������������������������������������������������������0000644�0001750�0001750�00000110071�12604031045�020211� 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.5.3/tests/data/test2.lnk����������������������������������������������������������������0000644�0001750�0001750�00000001034�12501341560�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.5.3/tests/data/test.asf�����������������������������������������������������������������0000644�0001750�0001750�00000025146�12607265240�017501� 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.5.3/tests/data/empty.opus���������������������������������������������������������������0000644�0001750�0001750�00000050511�12501341560�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.5.3/tests/data/adif.aac�����������������������������������������������������������������0000644�0001750�0001750�00000010000�12604031045�017346� 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.5.3/tests/data/silence-44-s.mpc���������������������������������������������������������0000644�0001750�0001750�00000003641�12551270403�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.5.3/tests/data/test.wav�����������������������������������������������������������������0000644�0001750�0001750�00000005614�12607265240�017523� 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.5.3/tests/data/test.mid�����������������������������������������������������������������0000755�0001750�0001750�00000010100�12501341560�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.5.3/tests/data/silence-44-s.sv8.mpc�����������������������������������������������������0000644�0001750�0001750�00000001007�12607265240�021344� 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.5.3/tests/data/test.wma�����������������������������������������������������������������0000644�0001750�0001750�00000105162�12501341560�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.5.3/tests/data/lame.mp3�����������������������������������������������������������������0000644�0001750�0001750�00000004046�12607265240�017362� 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.5.3/tests/data/silence-44-s.wv����������������������������������������������������������0000644�0001750�0001750�00000104513�12501341560�020501� 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.5.3/tests/data/test.spc�����������������������������������������������������������������0000644�0001750�0001750�00000201060�12501341560�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.5.3/tests/data/test.lnk�����������������������������������������������������������������0000644�0001750�0001750�00000003226�12501341560�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.5.3/tests/data/silence-44-s.tta���������������������������������������������������������0000644�0001750�0001750�00000235274�12501341560�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.5.3/tests/data/test-2.wma���������������������������������������������������������������0000644�0001750�0001750�00000055106�12501341560�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.5.3/tests/data/silence-44-s.ape���������������������������������������������������������0000644�0001750�0001750�00000224141�12501341560�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.5.3/tests/data/test.m4a�����������������������������������������������������������������0000644�0001750�0001750�00000011764�12501341560�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.5.3/tests/data/empty.flac���������������������������������������������������������������0000644�0001750�0001750�00000143330�12501341560�020001� 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.5.3/tests/data/mutagen-bug.mp3����������������������������������������������������������0000644�0001750�0001750�00000003720�12501341560�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.5.3/tests/data/sine-110hz.flac����������������������������������������������������������0000644�0001750�0001750�00000146652�12604031045�020452� 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.5.3/tests/data/silence-44-s.mp3���������������������������������������������������������0000644�0001750�0001750�00000040000�12501341560�020532� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3���� TYER������2004TCON������SilenceTLEN���@��3000TALB������Quod Libet Test DataTPE1������pimanTPE1������jzigTIT2������SilenceTRCK������02/10TIT1������Silence��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������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.5.3/tests/data/silence-44-s.ogg���������������������������������������������������������0000644�0001750�0001750�00000017136�12501341560�020625� 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.5.3/tests/data/silence-44-s.spx���������������������������������������������������������0000644�0001750�0001750�00000057556�12501341560�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.5.3/tests/data/test.vgm�����������������������������������������������������������������0000644�0001750�0001750�00000005105�12501341560�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.5.3/tests/data/empty.xm�����������������������������������������������������������������0000644�0001750�0001750�00000030544�12501341560�017522� 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.5.3/tests/data/test.mp2�����������������������������������������������������������������0000644�0001750�0001750�00000015620�12607265240�017422� 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.5.3/tests/data/silence-44-s.flac��������������������������������������������������������0000644�0001750�0001750�00000143330�12501341560�020752� 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.5.3/tests/plugin/�����������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016416� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/plugin/test_test_plugins.py���������������������������������������������������0000644�0001750�0001750�00000000741�12607265240�022537� 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.5.3/tests/plugin/test_html.py�����������������������������������������������������������0000644�0001750�0001750�00000002340�12607265240�020760� 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 tests.plugin import PluginTestCase from quodlibet import config from quodlibet.util.path import fsnative 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".encode("utf-8") in text) def tearDown(self): config.quit() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/plugin/test_mediaserver.py����������������������������������������������������0000644�0001750�0001750�00000004133�12607265240�022324� 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.5.3/tests/plugin/test_style.py����������������������������������������������������������0000644�0001750�0001750�00000004764�12607265240�021170� 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 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 self.plugins.iteritems(): 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 self.plugins.iteritems(): 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.5.3/tests/plugin/test_mpdserver.py������������������������������������������������������0000644�0001750�0001750�00000007134�12607265240�022031� 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 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("foo bar"), ("foo", ["bar"])) self.assertEqual(parse("foo\tbar"), ("foo", ["bar"])) self.assertEqual(parse("foo\t bar"), ("foo", ["bar"])) self.assertEqual(parse("foo\t bar quux"), ("foo", ["bar", "quux"])) self.assertEqual( parse("foo\t bar \"q 2\" x"), ("foo", ["bar", "q 2", "x"])) self.assertEqual(parse("foo 'bar quux'"), ("foo", ["'bar", "quux'"])) self.assertEqual( parse("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": "/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() MPDConnection = self.mod.main.MPDConnection MPDService = self.mod.main.MPDService class Server(object): service = MPDService(app) 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() != "idle": return self.s.recv(99999) def tearDown(self): destroy_fake_app() config.quit() 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 + b"\n") def test_idle_close(self): for cmd in ["idle", "noidle", "close"]: self._cmd(cmd + b"\n") ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/plugin/__init__.py������������������������������������������������������������0000644�0001750�0001750�00000002470�12607265240�020520� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os import quodlibet from quodlibet.util.modulescanner import ModuleScanner from quodlibet.plugins import list_plugins, Plugin, PluginImportException from tests import AbstractTestCase, 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(os.path.dirname(__file__), "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 shouldn't have raised a %s, but it did (%r)."\ % (name, type(exc), exc) plugins = {} modules = {} for name, module in ms.modules.iteritems(): for plugin in list_plugins(module.module): plugins[plugin.PLUGIN_ID] = Plugin(plugin) modules[plugin.PLUGIN_ID] = module.module class PluginTestCase(AbstractTestCase): """Base class for all plugin tests""" plugins = plugins modules = modules ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/plugin/test_covers.py���������������������������������������������������������0000644�0001750�0001750�00000001777�12607265240�021332� 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.plugin import PluginTestCase from quodlibet.formats import AudioFile from quodlibet.util.path import is_fsnative 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(is_fsnative(cls(song).cover_path)) self.assertTrue(is_fsnative(cls(song2).cover_path)) # missing Soup if "musicbrainz-cover" in self.plugins: cls = self.plugins["musicbrainz-cover"].cls self.assertTrue(is_fsnative(cls(song).cover_path)) self.assertTrue(is_fsnative(cls(song2).cover_path)) �quodlibet-3.5.3/tests/plugin/test_trayicon.py�������������������������������������������������������0000644�0001750�0001750�00000004250�12646426641�021655� 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. import sys from gi.repository import Gtk, Gdk, GdkPixbuf from quodlibet import config from tests.plugin import PluginTestCase, init_fake_app, destroy_fake_app from tests import skipIf @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() self.plugin._popup_menu(self.plugin._icon, Gdk.BUTTON_SECONDARY, Gtk.get_current_event_time()) self.plugin.disabled() def test_get_paused_pixbuf(self): get_paused_pixbuf = self.modules["Tray Icon"].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"].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) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/plugin/test_custom_commands.py������������������������������������������������0000644�0001750�0001750�00000001714�12607265240�023213� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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 quodlibet.qltk.data_editors import JSONBasedEditor from quodlibet.util.json_data import JSONObjectDict from quodlibet import config from tests.plugin import PluginTestCase CustomCommands = Command = None class TCustomCommands(PluginTestCase): """Test CustomCommands plugin and associated classes""" def setUp(self): globals().update(vars(self.modules["CustomCommands"])) config.init() self.cmd_list = CustomCommands.DEFAULT_COMS self.commands = JSONObjectDict.from_list(self.cmd_list) def tearDown(self): config.quit() def test_JSONBasedEditor(self): ed = JSONBasedEditor(Command, self.commands, None, "title") ed.show_now() ed.destroy() ����������������������������������������������������quodlibet-3.5.3/tests/plugin/test_brainz.py���������������������������������������������������������0000644�0001750�0001750�00000001652�12607265240�021306� 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) @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(self): album = [ AudioFile({"tracknumber": "7"}), AudioFile({"tracknumber": "garbage"}), AudioFile({"tracknumber": "10/42"}), ] self.assertEqual(brainz.get_trackcount([]), 0) self.assertEqual(brainz.get_trackcount(album), 42) ��������������������������������������������������������������������������������������quodlibet-3.5.3/tests/plugin/test_plugins/����������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�021136� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/plugin/test_plugins/pickle_test.py��������������������������������������������0000644�0001750�0001750�00000001351�12607265240�024004� 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.5.3/tests/plugin/test_songsmenu.py������������������������������������������������������0000644�0001750�0001750�00000005046�12607265240�022040� 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 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.util.path import fsnative from quodlibet.library import SongLibrary, SongLibrarian 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 self.plugins.iteritems(): 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 self.plugins.iteritems(): 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 self.plugins.iteritems(): 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.5.3/tests/plugin/test_albumart.py�������������������������������������������������������0000644�0001750�0001750�00000002316�12607265240�021626� 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.5.3/tests/plugin/test_mpris.py����������������������������������������������������������0000644�0001750�0001750�00000016443�12607265240�021157� 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. try: import dbus except ImportError: dbus = None from gi.repository import Gtk from tests import skipUnless from tests.plugin import PluginTestCase, init_fake_app, destroy_fake_app from quodlibet.formats import AudioFile from quodlibet.util.path import fsnative from quodlibet import config from quodlibet import app 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() @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): while not self._replies: Gtk.main_iteration_do(False) 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 props.iteritems(): 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 props.iteritems(): self._prop().Get(piface, key, **args) resp = self._wait()[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.5.3/tests/plugin/test_prefs.py����������������������������������������������������������0000644�0001750�0001750�00000001670�12607265240�021140� 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 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 self.plugins.iteritems(): 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.5.3/tests/plugin/test_replaygain.py�����������������������������������������������������0000644�0001750�0001750�00000007603�12607265240�022156� 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 os 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 DATA_DIR from quodlibet import config # Give up analysis after 5s, in case GStreamer (or something else) dies. TIMEOUT = 5 SONG = AudioFile({'artist': 'foo', 'album': 'the album'}) class TReplayGain(PluginTestCase): # Ugh. Store test results statically analysed = None @classmethod def setUpClass(cls): config.init() cls.mod = cls.modules["ReplayGain"] Kind = cls.plugins["ReplayGain"].cls cls.songs = [] cls.plugin = Kind(cls.songs, None) @classmethod def tearDownClass(cls): config.quit() del cls.mod def test_RGSong_properties(self): rgs = self.mod.RGSong(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(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(SONG)], UpdateMode.ALWAYS) self.failIf(rga.done) self.failUnlessEqual(rga.title, 'foo - the album') 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(self, album): album.write() TReplayGain.analysed = [album] pipeline = self.mod.ReplayGainPipeline() sig = pipeline.connect('done', on_complete) pipeline.start(album) start = time.time() while not self.analysed and time.time() - start < TIMEOUT: Gtk.main_iteration_do(False) pipeline.quit() pipeline.disconnect(sig) _run_main_loop() self.assertTrue("Timed out", self.analysed) def test_analyze_sinewave(self): song = MusicFile(os.path.join(DATA_DIR, "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(os.path.join(DATA_DIR, "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.5.3/tests/plugin/test_fingerprint.py����������������������������������������������������0000644�0001750�0001750�00000013751�12607265240�022353� 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 os 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, DATA_DIR from quodlibet import config from quodlibet.formats import MusicFile @skipUnless(Gst and chromaprint and vorbisdec) 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(os.path.join(DATA_DIR, "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(os.path.join(DATA_DIR, "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) 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.5.3/tests/plugin/test_titlecase.py������������������������������������������������������0000644�0001750�0001750�00000002746�12607265240�022003� 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.5.3/tests/plugin/test_rbimport.py�������������������������������������������������������0000644�0001750�0001750�00000004760�12607265240�021662� 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 quodlibet.formats import AudioFile from tests.helper import temp_filename from quodlibet.library.libraries import SongFileLibrary from quodlibet.util.uri import URI from quodlibet.util.path import find_mount_point from . import PluginTestCase def get_example_xml(song_path, rating, lastplayed): song_uri = URI.frompath(song_path) mount_uri = URI.frompath(find_mount_point(song_path)) return """\ <?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) 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.5.3/tests/plugin/test_randomalbum.py0000644000175000017500000000650312646426641022331 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- 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.5.3/tests/test_util_i18n.py0000644000175000017500000000432512607265240020337 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- import os from tests import TestCase from helper import preserve_environ from quodlibet.util.i18n import GlibTranslations, bcp47_to_language, \ set_i18n_envvars, fixup_i18n_envvars, osx_locale_id_to_lang 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, unicode)) def test_ungettext(self): t = self.t.ungettext("foo", "bar", 1) self.assertEqual(t, "foo") self.assertTrue(isinstance(t, unicode)) t = self.t.ungettext("foo", "bar", 2) self.assertEqual(t, "bar") self.assertTrue(isinstance(t, unicode)) def test_upgettext(self): t = self.t.upgettext("ctx", "foo") self.assertEqual(t, "foo") self.assertTrue(isinstance(t, unicode)) def test_unpgettext(self): t = self.t.unpgettext("ctx", "foo", "bar", 1) self.assertEqual(t, "foo") self.assertTrue(isinstance(t, unicode)) t = self.t.unpgettext("ctx", "foo", "bar", 2) self.assertEqual(t, "bar") self.assertTrue(isinstance(t, unicode)) class Tgettext(TestCase): 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(): os.environ["LANGUAGE"] = "en:de:en_FOO:nl" fixup_i18n_envvars() self.assertEqual(os.environ["LANGUAGE"], "en:C:de:en_FOO:C:nl") quodlibet-3.5.3/tests/test_qltk_quodlibetwindow.py0000644000175000017500000000162412607265240022775 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.5.3/tests/test_formats__image.py0000644000175000017500000000550412607265240021477 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, DATA_DIR, 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 = os.path.join(DATA_DIR, '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.5.3/tests/test_qltk_renamefiles.py0000644000175000017500000000563012607265240022050 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- import os from tests import TestCase from quodlibet.qltk.renamefiles import (SpacesToUnderscores, StripWindowsIncompat) from quodlibet.qltk.renamefiles import StripDiacriticals, StripNonASCII from quodlibet.qltk.renamefiles import Lowercase from quodlibet.util.path import fsnative, is_fsnative class TFilter(TestCase): def setUp(self): self.c = self.Kind() def tearDown(self): self.c.destroy() class TFilterMixin(object): def test_empty(self): empty = fsnative(u"") v = self.c.filter(empty, empty) self.failUnlessEqual(v, empty) self.failUnless(is_fsnative(v)) def test_safe(self): empty = fsnative(u"") safe = fsnative(u"safe") self.failUnlessEqual(self.c.filter(empty, safe), safe) class TSpacesToUnderscores(TFilter): Kind = SpacesToUnderscores def test_conv(self): self.failUnlessEqual(self.c.filter("", "foo bar "), "foo_bar_") class TStripWindowsIncompat(TFilter): 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(is_fsnative(self.c.filter(empty, empty))) 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(is_fsnative(v)) 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): Kind = StripDiacriticals def test_conv(self): empty = fsnative(u"") test = fsnative(u"\u00c1 test") out = fsnative(u"A test") v = self.c.filter(empty, test) self.failUnlessEqual(v, out) self.failUnless(is_fsnative(v)) class TStripNonASCII(TFilter): Kind = StripNonASCII def test_conv(self): empty = fsnative(u"") in_ = fsnative(u"foo \u00c1 \u1234") out = fsnative(u"foo _ _") v = self.c.filter(empty, in_) self.failUnlessEqual(v, out) self.failUnless(is_fsnative(v)) class TLowercase(TFilter): 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(is_fsnative(v)) v = self.c.filter(empty, fsnative(u"Foobar.BAZ")) self.failUnlessEqual(v, fsnative(u"foobar.baz")) self.failUnless(is_fsnative(v)) quodlibet-3.5.3/tests/test_qltk_cover.py0000644000175000017500000000277712607265240020705 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- 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.5.3/tests/test_library_librarians.py0000644000175000017500000001454612607265240022403 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- 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)), 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.5.3/tests/test_util_config.py0000644000175000017500000002535612607265240021034 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- import os from tests import TestCase, mkstemp from helper import temp_filename from quodlibet.util.config import Config, Error, ConfigProxy 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 = "\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_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") self.assertEqual(conf.get("player", "backend"), "blah") 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.set("foo", "bar", "\xff\xff\xff\xff\xff\xff") 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) 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.5.3/tests/test_qltk_entry.py0000644000175000017500000001004012607265240020706 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase from helper import visible from quodlibet.qltk.entry import ValidatingEntry, UndoEntry, Entry, \ QueryValidator 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(QueryValidator) 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], unicode)) def tearDown(self): self.entry.destroy() quodlibet.config.quit() class TUndoEntry(TestCase): def setUp(self): self.entry = UndoEntry() def __equal(self, value): entry_val = self.entry.get_text().decode("utf-8") 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.5.3/tests/test_qltk_browser.py0000644000175000017500000000167212607265240021243 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- 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.empty import EmptyBar win = LibraryBrowser(EmptyBar, SongLibrary(), NullPlayer()) win.browser.emit("songs-selected", [], False) win.songlist.get_selection().emit("changed") win.destroy() def test_open(self): from quodlibet.browsers.empty import EmptyBar from quodlibet.library import SongLibrary widget = LibraryBrowser.open(EmptyBar, SongLibrary(), NullPlayer()) self.assertTrue(widget) self.assertTrue(widget.get_visible()) widget.destroy() def tearDown(self): quodlibet.config.quit() quodlibet-3.5.3/tests/test_formats_mp4.py0000644000175000017500000000646712607265240020767 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 shutil import StringIO import mutagen from tests import TestCase, DATA_DIR, mkstemp from quodlibet.formats.mp4 import MP4File from quodlibet.formats._image import EmbeddedImage import mutagen.mp4 class TMP4File(TestCase): def setUp(self): fd, self.f = mkstemp(".m4a") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'test.m4a'), self.f) self.song = MP4File(self.f) def tearDown(self): os.unlink(self.f) def test_format(self): self.assertEqual(self.song("~format"), "MPEG-4") def test_codec(self): if mutagen.version >= (1, 27): self.assertEqual(self.song("~codec"), "AAC LC") else: self.assertEqual(self.song("~codec"), "MPEG-4") def test_encoding(self): self.assertEqual(self.song("~encoding"), "FAAC 1.24") def test_basic(self): self.song["title"] = u"SomeTestValue" self.song.write() self.song.reload() self.assertEqual(self.song("title"), u"SomeTestValue") def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.7079, 3) def test_bitrate(self): self.assertEqual(self.song("~#bitrate"), 2) 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 = os.path.join(DATA_DIR, '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 = StringIO.StringIO("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.file.read(), "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.5.3/tests/test_qltk_unity.py0000644000175000017500000000030012607265240020713 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.qltk import unity class TUnityQuickList(TestCase): def test_init(self): unity.init("quodlibet.desktop", None) quodlibet-3.5.3/tests/test_qltk_session.py0000644000175000017500000000061512607265240021237 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.5.3/tests/__init__.py0000644000175000017500000002450412646426641017233 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- import fnmatch import inspect from math import log import os import sys import unittest import tempfile import shutil import atexit import subprocess from quodlibet.compat import PY3 from quodlibet.util.dprint import Colorise, print_ from quodlibet.util.path import fsnative, is_fsnative 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 class AbstractTestCase(TestCase): """If a class is a direct subclass of this one it gets skipped""" skipped = [] skipped_reason = {} skipped_warn = set() def skip(cls, reason=None, warn=True): assert inspect.isclass(cls) skipped.append(cls) if reason: skipped_reason[cls] = reason if warn: skipped_warn.add(cls) cls = unittest.skip(cls) return cls def skipUnless(value, *args, **kwargs): def dec(cls): assert inspect.isclass(cls) if value: return cls return skip(cls, *args, **kwargs) return dec def skipIf(value, *args, **kwargs): return skipUnless(not value, *args, **kwargs) DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "data") if os.name == "nt": DATA_DIR = DATA_DIR.decode("ascii") assert is_fsnative(DATA_DIR) _TEMP_DIR = None def _wrap_tempfile(func): def wrap(*args, **kwargs): if kwargs.get("dir") is None and _TEMP_DIR is not None: assert is_fsnative(_TEMP_DIR) 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 is_fsnative(path) return path def mkstemp(*args, **kwargs): fd, filename = _wrap_tempfile(tempfile.mkstemp)(*args, **kwargs) assert is_fsnative(filename) 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 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) 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 class Result(unittest.TestResult): TOTAL_WIDTH = 80 TEST_RESULTS_WIDTH = 50 TEST_NAME_WIDTH = TOTAL_WIDTH - TEST_RESULTS_WIDTH - 3 MAJOR_SEPARATOR = '=' * TOTAL_WIDTH MINOR_SEPARATOR = '-' * TOTAL_WIDTH CHAR_SUCCESS, CHAR_ERROR, CHAR_FAILURE = '+', 'E', 'F' def __init__(self, test_name, num_tests, out=sys.stdout, failfast=False): super(Result, self).__init__() self.out = out self.failfast = failfast if hasattr(out, "flush"): out.flush() pref = '%s (%d): ' % (Colorise.bold(test_name), num_tests) line = pref + " " * (self.TEST_NAME_WIDTH - len(test_name) - 7 - int(num_tests and log(num_tests, 10) or 0)) print_(line, end="") def addSuccess(self, test): unittest.TestResult.addSuccess(self, test) print_(Colorise.green(self.CHAR_SUCCESS), end="") def addError(self, test, err): unittest.TestResult.addError(self, test, err) print_(Colorise.red(self.CHAR_ERROR), end="") def addFailure(self, test, err): unittest.TestResult.addFailure(self, test, err) print_(Colorise.red(self.CHAR_FAILURE), end="") def printErrors(self): succ = self.testsRun - (len(self.errors) + len(self.failures)) v = Colorise.bold("%3d" % succ) cv = Colorise.green(v) if succ == self.testsRun else Colorise.red(v) count = self.TEST_RESULTS_WIDTH - self.testsRun print_((" " * count) + cv) self.printErrorList('ERROR', self.errors) self.printErrorList('FAIL', self.failures) def printErrorList(self, flavour, errors): for test, err in errors: print_(self.MAJOR_SEPARATOR) print_(Colorise.red("%s: %s" % (flavour, str(test)))) print_(self.MINOR_SEPARATOR) # tracebacks can contain encoded paths, not sure # what the right fix is here, so use repr for line in err.splitlines(): print_(repr(line)[1:-1]) class Runner(object): def run(self, test, failfast=False): suite = unittest.makeSuite(test) result = Result(test.__name__, len(suite._tests), failfast=failfast) suite(result) result.printErrors() return len(result.failures), len(result.errors) _BUS_INFO = 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 # 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) os.environ["XDG_RUNTIME_DIR"] = runtime_dir # 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) os.environ["HOME"] = home_dir os.environ.pop("XDG_DATA_HOME", None) os.environ.pop("XDG_CACHE_HOME", None) _BUS_INFO = None if os.name != "nt" and "DBUS_SESSION_BUS_ADDRESS" in os.environ: try: out = subprocess.check_output(["dbus-launch"]) except (subprocess.CalledProcessError, OSError): pass else: if PY3: out = out.decode("ascii") _BUS_INFO = dict([l.split("=", 1) for l in out.splitlines()]) os.environ.update(_BUS_INFO) # Ideally nothing should touch the FS on import, but we do atm.. # Get rid of all modules so QUODLIBET_USERDIR gets used everywhere. for key in list(sys.modules.keys()): if key.startswith('quodlibet'): del(sys.modules[key]) import quodlibet quodlibet.init(no_translations=True) def exit_test_environ(): """Call after init_test_environ() and all tests are finished""" global _TEMP_DIR, _BUS_INFO try: shutil.rmtree(_TEMP_DIR) except EnvironmentError: pass if _BUS_INFO: try: subprocess.check_call( ["kill", "-9", _BUS_INFO["DBUS_SESSION_BUS_PID"]]) except (subprocess.CalledProcessError, OSError): pass # 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=[], filter_func=None, main=False, subdirs=None, strict=False, stop_first=False): path = os.path.dirname(__file__) if subdirs is None: subdirs = [] # 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) suites = [] abstract = [] def discover_tests(mod): for k in vars(mod): value = getattr(mod, k) if value not in (TestCase, AbstractTestCase) and \ inspect.isclass(value) and issubclass(value, TestCase): if AbstractTestCase in value.__bases__: abstract.append(value) elif value not in skipped: suites.append(value) if main: for name in os.listdir(path): if fnmatch.fnmatch(name, "test_*.py"): mod = __import__(".".join([__name__, name[:-3]]), {}, {}, []) discover_tests(getattr(mod, name[:-3])) if main: # include plugin tests by default subdirs = (subdirs or []) + ["plugin"] for subdir in subdirs: sub_path = os.path.join(path, subdir) for name in os.listdir(sub_path): if fnmatch.fnmatch(name, "test_*.py"): mod = __import__( ".".join([__name__, subdir, name[:-3]]), {}, {}, []) discover_tests(getattr(getattr(mod, subdir), name[:-3])) # check if each abstract class is actually used (also by skipped ones) unused_abstract = set(abstract) for case in suites: unused_abstract -= set(case.__mro__) for case in skipped: unused_abstract -= set(case.__mro__) if unused_abstract: raise Exception("The following abstract test cases have no " "implementation: %r" % list(unused_abstract)) for case in skipped: # don't warn for tests we won't run anyway if run and case not in run: continue name = "%s.%s" % (case.__module__, case.__name__) reason = skipped_reason.get(case, "??") if case in skipped_warn: print_w("Skipped test: %s (%s)" % (name, reason)) import quodlibet.config runner = Runner() failures = errors = 0 use_suites = filter(filter_func, suites) for test in sorted(use_suites, key=repr): if (not run or test.__name__ in run or test.__module__[11:] in run): df, de = runner.run(test, failfast=stop_first) if stop_first and (df or de): break failures += df errors += de quodlibet.config.quit() return failures, errors quodlibet-3.5.3/tests/test_util_modulescanner.py0000644000175000017500000001321712607265240022417 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase, mkdtemp import shutil import py_compile from quodlibet.util.modulescanner import * from quodlibet.util.importhelper import * 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("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("test=24\n") h.close() py_compile.compile(h.name) os.unlink(h.name) self.failUnlessEqual(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("test=99\n") h.close() py_compile.compile(h.name) os.unlink(h.name) self.failUnlessEqual(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("test=99\n") h.close() py_compile.compile(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("test=456\n") h2.close() h.write("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("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("test=123\n") h2.close() h.write("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.5.3/tests/test_qltk___init__.py0000644000175000017500000000544012607265240021314 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase from gi.repository import Gtk, Gdk from quodlibet import qltk from quodlibet import util class TQltk(TestCase): def test_none(self): self.failUnless(qltk.get_top_parent(None) is None) 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_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) quodlibet-3.5.3/tests/test_browsers_iradio.py0000644000175000017500000000560512607265240021722 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- 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 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.5.3/tests/test_formats_wav.py0000644000175000017500000000226212607265240021051 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, DATA_DIR from quodlibet.formats.wav import WAVEFile class TWAVEFile(TestCase): def setUp(self): self.song = WAVEFile(os.path.join(DATA_DIR, 'test.wav')) def test_title_tag(self): self.assertEqual(self.song["title"], "test") self.assertTrue(isinstance(self.song["title"], unicode)) def test_length(self): self.failUnlessEqual(self.song("~#length"), 0) def test_write(self): self.song.write() def test_can_change(self): self.failUnless(self.song.can_change("artist")) def test_invalid(self): path = os.path.join(DATA_DIR, '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.5.3/tests/test_util_thumbnails.py0000644000175000017500000000713512607265240021730 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from quodlibet.util.path import mtime from tests import TestCase, NamedTemporaryFile from gi.repository import GdkPixbuf import os try: import hashlib as hash except ImportError: import md5 as hash from quodlibet.util import thumbnails from quodlibet.util.path import pathname2url, is_fsnative, getcwd 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 = os.path.join(getcwd(), "test_thumbnail.png") s.wide.savev(s.filename, "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, self.filename]: try: os.remove(path) except OSError: pass def test_get_thumbnail_folder(self): path = thumbnails.get_thumbnail_folder() self.assertTrue(is_fsnative(path)) 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, 3)) #test the thumbnail filename uri = "file://" + pathname2url(s.filename) name = hash.md5(uri).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.5.3/tests/test_qltk_debugwindow.py0000644000175000017500000000146512607265240022076 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 sys from tests import TestCase from helper import capture_output from quodlibet.qltk.debugwindow import ExceptionDialog, MinExceptionDialog class TExceptionDialog(TestCase): def test_exec_hook(self): with capture_output(): try: raise Exception except Exception: ExceptionDialog.from_except(*sys.exc_info()) ExceptionDialog.instance.destroy() class TMinExceptionDialog(TestCase): def test_main(self): MinExceptionDialog(None, u"foo", u"bar", u"quux\nquux2").destroy() quodlibet-3.5.3/tests/test_po.py0000644000175000017500000002420012646426641017142 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase, AbstractTestCase, skipIf 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") class TPOTFILESIN(TestCase): def test_missing(self): try: gettextutil.check_version() except gettextutil.GettextError: return result = gettextutil.get_missing(PODIR, "quodlibet") if result: raise Exception(result) @skipIf(polib is None, "polib not found") 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 PO(AbstractTestCase): def test_pos(self): if not iscommand("msgfmt"): return self.failIf(os.system("msgfmt -c po/%s.po > /dev/null" % self.lang)) 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("#"): continue self.failIf("\xc2\xb7" in line, "Broken GTranslator copy/paste in %s:\n%s" % ( 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('msgstr "gtk-'): parts = line.strip().split() value = parts[1].strip('"')[4:] self.failIf(value and value not in [ 'media-next', 'media-previous', 'media-play', 'media-pause'], "Invalid stock translation in %s\n%s" % ( self.lang, line)) def conclude(self, fails, reason): from quodlibet import print_w 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 ] for message in messages: print_w(message) self.fail( "One or more messages did not pass (%s).\n" "Please check the warning messages above." % reason) 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, (PO,), {}) testcase.lang = lang globals()['PO.' + lang] = testcase quodlibet-3.5.3/tests/test_qltk_ccb.py0000644000175000017500000000443012607265240020302 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- 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.5.3/tests/test_qltk_chooser.py0000644000175000017500000000166112607265240021220 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase from gi.repository import Gtk from quodlibet.qltk.chooser import FolderChooser, FileChooser import quodlibet.config class TFolderChooser(TestCase): Kind = FolderChooser def setUp(self): quodlibet.config.init() def tearDown(self): quodlibet.config.quit() def test_init_nodir(self): f = self.Kind(None, "A file chooser") while Gtk.events_pending(): Gtk.main_iteration() f.destroy() def test_init_dir(self): f = self.Kind(None, "A file chooser", initial_dir="/home") while Gtk.events_pending(): Gtk.main_iteration() f.destroy() class TFileChooser(TFolderChooser): Kind = FileChooser def test_filter(self): f = lambda *x: None x = FileChooser(None, "foo", filter=f) while Gtk.events_pending(): Gtk.main_iteration() x.destroy() quodlibet-3.5.3/tests/test_qltk_models.py0000644000175000017500000003137312646426641021053 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 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], 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], 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], 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], 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], range(10)) values = [m.get_value(i) for i in iters] self.failUnlessEqual(values, 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], 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] + 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], range(10)) m = ObjectStore() m.insert_many(99, range(10)) self.failUnlessEqual([r[0] for r in m], range(10)) def test_itervalues(self): m = ObjectStore() m.insert_many(0, range(10)) self.failUnlessEqual(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)) 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(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(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(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.5.3/tests/test_qltk_downloader.py0000644000175000017500000000056712607265240021720 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- 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.5.3/tests/test_qltk_songlist.py0000644000175000017500000001772612607265240021431 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from gi.repository import Gtk from tests import TestCase from quodlibet.library import SongLibrary from quodlibet.util.path import fsnative from quodlibet.qltk.songlist import SongList, set_columns, get_columns, \ header_tag_split 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("EmptyBar")(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"]) def tearDown(self): self.songlist.destroy() config.quit() quodlibet-3.5.3/tests/test_qltk_wlw.py0000644000175000017500000000253612607265240020371 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase 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_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.5.3/tests/test_windows.py0000644000175000017500000000465112630614074020216 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 sys from tests import TestCase, DATA_DIR, skipUnless from quodlibet.util.path import normalize_path from quodlibet import windows @skipUnless(os.name == "nt", "Wrong platform", warn=False) class TWindows(TestCase): def test_dir_funcs(self): d = windows.get_personal_dir() self.assertTrue(d is None or isinstance(d, unicode)) d = windows.get_appdate_dir() self.assertTrue(d is None or isinstance(d, unicode)) d = windows.get_desktop_dir() self.assertTrue(d is None or isinstance(d, unicode)) d = windows.get_music_dir() self.assertTrue(d is None or isinstance(d, unicode)) d = windows.get_profile_dir() self.assertTrue(d is None or isinstance(d, unicode)) d = windows.get_links_dir() self.assertTrue(d is None or isinstance(d, unicode)) def test_get_link_target(self): path = os.path.join(DATA_DIR, "test.lnk") d = windows.get_link_target(path) self.assertEqual( normalize_path(d), normalize_path(u"C:\Windows\explorer.exe")) self.assertTrue(isinstance(d, unicode)) def test_get_link_target_latin1(self): path = os.path.join(DATA_DIR, "test2.lnk") d = windows.get_link_target(path) # the second char is only not in latin-1 self.assertEqual(os.path.basename(d), u"\xe1??.txt") self.assertTrue(isinstance(d, unicode)) def test_environ(self): env = windows.WindowsEnviron() len_ = len(env) env[u"FOO"] = u"bar" self.assertEqual(len(env), len_ + 1) self.assertEqual(env.get(u"FOO"), u"bar") self.assertTrue("FOO" in repr(env)) self.assertEqual(len(list(env)), len(env)) del env[u"FOO"] def test_environ_ascii(self): env = windows.WindowsEnviron() env["FOO"] = u"bar" env["FOO"] del env["FOO"] @skipUnless(os.name == "nt", "Wrong platform", warn=False) class Tget_win32_unicode_argv(TestCase): def test_main(self): newargv = windows.get_win32_unicode_argv() self.assertEqual(len(sys.argv), len(newargv)) if newargv: self.assertTrue(isinstance(newargv[0], unicode)) quodlibet-3.5.3/tests/test_qltk_pluginwin.py0000644000175000017500000000345612607265240021576 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase from tests.helper import realized from quodlibet import plugins from quodlibet import config from quodlibet.plugins import Plugin from quodlibet.qltk.models import ObjectStore from quodlibet.qltk.pluginwin import PluginWindow, PluginErrorWindow, \ PluginListView, PluginFilterCombo, PluginPreferencesContainer, \ ComboType 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("~cover", "x"), song("~cover", "x")) failUnlessEq(album("~rating", "x"), song("~rating", "x")) for p in PEOPLE: failUnlessEq(album(p, "x"), song(p, "x")) for p in INTERN_NUM_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 TPlaylist(TestCase): TWO_SONGS = [ Fakesong({"~#length": 5, "discnumber": "1", "date": "2038"}), Fakesong({"~#length": 7, "dummy": "d\ne", "discnumber": "2"}) ] def setUp(self): self.temp = mkdtemp() self.temp2 = mkdtemp() def tearDown(self): shutil.rmtree(self.temp) shutil.rmtree(self.temp2) def test_make(self): p1 = Playlist.new(self.temp, "Does not exist") self.failUnlessEqual(0, len(p1)) self.failUnlessEqual(p1.name, "Does not exist") p1.delete() def test_rename_working(self): p1 = Playlist.new(self.temp, "Foobar") p1.rename("Foo Quuxly") self.failUnlessEqual(p1.name, "Foo Quuxly") p1.delete() def test_rename_nothing(self): p1 = Playlist.new(self.temp, "Foobar") self.failUnlessRaises(ValueError, p1.rename, "") p1.delete() def test_rename_dup(self): p1 = Playlist.new(self.temp, "Foobar") p2 = Playlist.new(self.temp, "Crazy") self.failUnlessRaises(ValueError, p2.rename, "Foobar") p1.delete() p2.delete() def test_make_dup(self): p1 = Playlist.new(self.temp, "Does not exist") p2 = Playlist.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_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") pl = Playlist(self.temp, "playlist", lib) 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) pl.delete() lib.destroy() def test_equality(s): pl = Playlist(s.temp, "playlist") pl2 = Playlist(s.temp, "playlist") pl3 = Playlist(s.temp2, "playlist") s.failUnlessEqual(pl, pl2) # Debatable s.failUnlessEqual(pl, pl3) pl4 = Playlist(s.temp, "foobar") s.failIfEqual(pl, pl4) pl.delete() pl2.delete() pl3.delete() pl4.delete() def test_index(s): pl = Playlist(s.temp, "playlist") 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 pl.delete() def test_internal_tags(s): pl = Playlist(s.temp, "playlist") 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("~#"), "") pl.delete() def test_numeric_ops(s): songs = NUMERIC_SONGS pl = Playlist(s.temp, "playlist") 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) pl.delete() def test_write(self): pl = Playlist(self.temp, "playlist") 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_read(self): pl = Playlist(self.temp, "playlist") pl.extend(NUMERIC_SONGS) pl.write() lib = FileLibrary("foobar") lib.add(NUMERIC_SONGS) pl = Playlist(self.temp, "playlist", lib) self.assertEqual(len(pl), len(NUMERIC_SONGS)) def test_updating_aggregates_extend(s): pl = Playlist(s.temp, "playlist") 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): pl = Playlist(s.temp, "playlist") 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): pl = Playlist(s.temp, "playlist") pl.extend(NUMERIC_SONGS) s.failUnless(pl.get("~#length")) pl.clear() s.failIf(pl.get("~#length")) def test_updating_aggregates_remove_songs(s): pl = Playlist(s.temp, "playlist") pl.extend(NUMERIC_SONGS) s.failUnless(pl.get("~#length")) pl.remove_songs(NUMERIC_SONGS) s.failIf(pl.get("~#length")) def test_listlike(s): pl = Playlist(s.temp, "playlist") 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) pl.delete() def test_playlists_featuring(s): pl = Playlist(s.temp, "playlist") 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 pl2 = Playlist(s.temp, "playlist2") pl2.append(NUMERIC_SONGS[0]) playlists = Playlist.playlists_featuring(NUMERIC_SONGS[0]) s.failUnlessEqual(set(playlists), {pl, pl2}) pl.delete() pl2.delete() def test_playlists_tag(self): # Arguably belongs in _audio songs = NUMERIC_SONGS pl_name = "playlist 123!" pl = Playlist(self.temp, pl_name) pl.extend(songs) for song in songs: self.assertEquals(pl_name, song("~playlists")) pl.delete() def test_duplicates_single_item(self): pl = Playlist(self.temp, "playlist") 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): pl = Playlist(self.temp, "playlist") 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]))) quodlibet-3.5.3/tests/test_qltk_info.py0000644000175000017500000000060112607265240020502 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.player.nullbe import NullPlayer from quodlibet.qltk.info import SongInfo from quodlibet.library import SongLibrary class TSongInfo(TestCase): def setUp(self): self.info = SongInfo(SongLibrary(), NullPlayer(), "") def test_ctr(self): pass def tearDown(self): self.info.destroy() quodlibet-3.5.3/tests/test_browsers_collection.py0000644000175000017500000000670512607265240022610 0ustar lazkalazka00000000000000# -*- 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 * from quodlibet.browsers.collection.models import * from quodlibet.browsers.collection.prefs import * from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary 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 = self.albums.values() 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.5.3/tests/test_operon.py0000644000175000017500000005540412646426641020040 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 the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import shutil from tests import TestCase, DATA_DIR, mkstemp from helper import capture_output from quodlibet import config from quodlibet import util from quodlibet.util.path import fsnative from quodlibet.formats import MusicFile from quodlibet.operon.main import main as operon_main def call(args=None): with capture_output() as (out, err): try: return_code = operon_main(["operon.py"] + args) except SystemExit, e: return_code = e.code return (return_code, out.getvalue(), err.getvalue()) class TOperonBase(TestCase): def setUp(self): config.init() fd, self.f = mkstemp(".ogg") os.close(fd) fd, self.f2 = mkstemp(".mp3") os.close(fd) fd, self.f3 = mkstemp(".mp3") os.write(fd, "garbage") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.ogg'), self.f) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.mp3'), self.f2) self.s = MusicFile(self.f) self.s2 = MusicFile(self.f2) 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] [] 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 [] 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 = self.s.keys() 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, 0000) self.check_false(["add", "foo", "bar", self.f, self.f], False, True) os.chmod(self.f, 0444) self.check_false(["add", "foo", "bar", self.f, self.f], False, True) finally: os.chmod(self.f, 0666) class TOperonPrint(TOperonBase): # [-p ] [] 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", "", 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) self.assertTrue(os.path.basename(self.f3) in e) def test_permissions(self): # doesn't prevent reading under wine.. if os.name == "nt": return os.chmod(self.f, 0000) 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) class TOperonImageExtract(TOperonBase): # [--dry-run] [--primary] [-d <destination>] <file> [<files>] def setUp(self): super(TOperonImageExtract, self).setUp() h, self.fcover = mkstemp(".wma") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'test-2.wma'), self.fcover) 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.file.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.file.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", [], []) h, self.fcover = mkstemp(".wma") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'test-2.wma'), self.fcover) self.cover = MusicFile(self.fcover) 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 = os.path.join(DATA_DIR, '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].file.read()) class TOperonImageClear(TOperonBase): # <image-file> <file> [<files>] def setUp(self): super(TOperonImageClear, self).setUp() fd, self.fcover = mkstemp(".wma") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'test-2.wma'), self.fcover) 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 = os.path.join(DATA_DIR, '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.5.3/tests/test_plugins_playlist.py������������������������������������������������������0000644�0001750�0001750�00000015452�12607265240�022130� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # TODO: Share better with, i.e. test MenuItemPlugin directly import os 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 DIR = mkdtemp() TEST_PLAYLIST = Playlist(DIR, "foo") def generate_playlists(n): return [Playlist(DIR, "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() for f in os.listdir(self.tempdir): os.remove(os.path.join(self.tempdir, f)) os.rmdir(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.5.3/tests/test_query__diacritic.py������������������������������������������������������0000644�0001750�0001750�00000005077�12607265240�022047� 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 from tests import TestCase from quodlibet.query._diacritic import re_add_variants, \ diacritic_for_letters, re_replace_literals class TDiacritics(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_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_escape(self): r = re_add_variants(u"n\\n") self.assertEqual(r, u"[nñńņňǹṅṇṉṋ]\n") def test_construct_regexp(self): res = [ (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), ] 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): self.assertEqual(re_add_variants(u"[x-y]"), u"[ẋẍýÿŷȳẏẙỳỵỷỹx-y]") self.assertEqual(re_add_variants(u"[f-gm]"), u"[ḟꝼĝğġģǧǵḡᵹf-gmḿṁṃ]") def test_literal(self): self.assertEqual(re_add_variants(u"f"), u"[fḟꝼ]") self.assertTrue(u"ø" in re_add_variants(u"o")) self.assertTrue(u"Ø" in re_add_variants(u"O")) self.assertEqual(re_add_variants(u"[^f]"), u"[^fḟꝼ]") �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_exfalso.py����������������������������������������������������������0000644�0001750�0001750�00000000720�12607265240�021212� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_formats_wma.py�����������������������������������������������������������0000644�0001750�0001750�00000014543�12607265240�021045� 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 shutil import StringIO import mutagen from mutagen import asf from tests import TestCase, DATA_DIR, mkstemp from quodlibet.formats.wma import WMAFile, unpack_image, pack_image from quodlibet.formats._image import APICType, EmbeddedImage class TWMAFile(TestCase): def setUp(self): fd, self.f = mkstemp(".wma") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'test.wma'), self.f) self.song = WMAFile(self.f) fd, self.f2 = mkstemp(".wma") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'test-2.wma'), self.f2) self.song2 = WMAFile(self.f2) fd, self.f3 = mkstemp(".asf") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'test.asf'), self.f3) 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_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): if mutagen.version < (1, 31): return 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): if mutagen.version < (1, 31): return 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_invalid(self): path = os.path.join(DATA_DIR, '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.file.read()) def test_get_image_invalid_data(self): tag = asf.ASF(self.f) tag["WM/Picture"] = [asf.ASFValue("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 = "\x03" + "\x00" * 4 + "\x00" * 4 mime, desc, data, type_ = unpack_image(data) self.assertEqual(mime, u"") self.assertEqual(desc, u"") self.assertEqual(data, "") self.assertEqual(type_, 3) def test_unpack_image_invalid(self): self.assertRaises(ValueError, unpack_image, "") self.assertRaises(ValueError, unpack_image, "\x00" * 6) self.assertRaises(ValueError, unpack_image, "\x00" * 8) self.assertRaises(ValueError, unpack_image, "\x00" * 100) def test_pack_image(self): d = pack_image( u"image/jpeg", u"Description", "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, "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 = StringIO.StringIO("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.file.read(), "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.5.3/tests/test_qltk_msg.py��������������������������������������������������������������0000644�0001750�0001750�00000001305�12607265240�020337� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.qltk.msg import * 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.5.3/tests/test_plugins___init__.py������������������������������������������������������0000644�0001750�0001750�00000012204�12607265240�022016� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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], 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_website(self): self.failUnlessEqual(self.pwrap.website(), self.psong.website()) 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(self.pwrap.values(), 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.5.3/tests/test_mmkeys.py����������������������������������������������������������������0000644�0001750�0001750�00000001131�12607265240�020020� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from gi.repository import Gtk from quodlibet.player.nullbe import NullPlayer from quodlibet.mmkeys import MMKeysHandler, iter_backends class TMmKeys(TestCase): def test_handler(self): win = Gtk.Window() handler = MMKeysHandler("Foo", win, NullPlayer()) 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.5.3/tests/test_config.py����������������������������������������������������������������0000644�0001750�0001750�00000004742�12501341560�017764� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os from quodlibet.config import RatingsPrefs from tests import TestCase, mkstemp from helper import capture_output from quodlibet import config class Tconfig(TestCase): def setUp(self): config.init() def test_init_garbage_file(self): config.quit() garbage = "\xf1=\xab\xac" fd, filename = mkstemp() os.close(fd) with open(filename, "wb") as f: f.write(garbage) with capture_output() as (stdout, stderr): config.init(filename) self.assertTrue(stderr.getvalue()) 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) self.failUnlessEqual(self.prefs.full_symbol, config.INITIAL[ "settings"]["rating_symbol_full"].decode("utf-8")) self.failUnlessEqual(self.prefs.blank_symbol, config.INITIAL[ "settings"]["rating_symbol_blank"].decode("utf-8")) 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.5.3/tests/test_cli.py�������������������������������������������������������������������0000644�0001750�0001750�00000001424�12607265240�017267� 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.5.3/tests/test_plugins_songsmenu.py�����������������������������������������������������0000644�0001750�0001750�00000013326�12607265240�022303� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from quodlibet.library import SongLibrary from quodlibet.plugins.songsmenu import SongsMenuPlugin 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 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() for f in os.listdir(self.tempdir): os.remove(os.path.join(self.tempdir, f)) os.rmdir(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))) 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.5.3/tests/test_util_copool.py�����������������������������������������������������������0000644�0001750�0001750�00000007757�12607265240�021067� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_util_trash.py������������������������������������������������������������0000644�0001750�0001750�00000003103�12607265240�020672� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- """Tests for quodlibet.util.trash.""" import os import sys from tests import TestCase from quodlibet import config from quodlibet.util.trash import use_trash 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 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_songlistcolumns.py��������������������������������������������������0000644�0001750�0001750�00000004522�12607265240�023020� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from helper import visible from gi.repository import Gtk from quodlibet.qltk.songlistcolumns import create_songlist_column from quodlibet.qltk.models import ObjectStore 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 = ObjectStore() view.set_model(model) song = AudioFile({"~filename": "/dev/null", "~#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.5.3/tests/test_formats_xiph.py����������������������������������������������������������0000644�0001750�0001750�00000046777�12646426641�021256� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from quodlibet.config import RATINGS from tests import DATA_DIR, skipUnless, mkstemp, TestCase import os import sys import shutil import base64 import StringIO from quodlibet import config, const, formats from quodlibet.formats.xiph import OggFile, FLACFile, OggOpusFile, OggOpus from quodlibet.formats._image import EmbeddedImage, APICType from mutagen.flac import FLAC, Picture from mutagen.id3 import ID3, TIT2, ID3NoHeaderError from mutagen.oggvorbis import OggVorbis 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) 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_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_invalid_rating(self): self.song["~#rating"] = "invalid" self.song.write() song = type(self.song)(self.filename) self.failUnlessEqual(song("~#rating"), RATINGS.default) def test_huge_playcount(self): count = 1000000000000000L 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() h, self.filename = mkstemp(".ogg") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'empty.ogg'), self.filename) 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 tags.iteritems(): m.tags[key] = value m.save() song = OggFile(self.filename) for key, value in expected.iteritems(): 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 tags.iteritems(): song[key] = value song.write() m = OggVorbis(self.filename) # test if all values ended up where we wanted for key, value in expected.iteritems(): 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) h, self.filename = mkstemp(".flac") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'empty.flac'), self.filename) 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) song["coverartmime"] = "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()) 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) 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 = ".-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()) pic2 = Picture() pic2.data = _get_jpeg(size=6) pic2.type = APICType.COVER_BACK b64pic_other = base64.b64encode(pic2.write()) 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 = ".-a,a.f,afa-,.-" song = self.MutagenType(self.filename) song["metadata_block_picture"] = base64.b64encode(crap) 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) song["coverartmime"] = "image/jpeg" song.save() fileobj = StringIO.StringIO("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) h, self.filename = mkstemp(".ogg") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'empty.ogg'), self.filename) self.MutagenType = OggVorbis self.QLType = OggFile class TVCCoverFlac(TVCCover, TVCCoverMixin): def setUp(self): TVCCover.setUp(self) h, self.filename = mkstemp(".flac") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'empty.flac'), self.filename) self.MutagenType = FLAC self.QLType = FLACFile class TFlacPicture(TestCase): def setUp(self): config.init() h, self.filename = mkstemp(".flac") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'empty.flac'), self.filename) def test_get_images(self): pic = Picture() pic.data = _get_jpeg() pic.type = APICType.COVER_FRONT b64pic_cover = base64.b64encode(pic.write()) # 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 = "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 = "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 = StringIO.StringIO("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) h, self.filename = mkstemp(".ogg") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'empty.ogg'), self.filename) 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) h, self.filename = mkstemp(".ogg") os.close(h) shutil.copy(os.path.join(DATA_DIR, 'empty.opus'), self.filename) 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_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.5.3/tests/test_formats_mpc.py�����������������������������������������������������������0000644�0001750�0001750�00000002661�12607265240�021036� 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, DATA_DIR from quodlibet.formats.mpc import MPCFile class TMPCFile(TestCase): def setUp(self): self.song = MPCFile(os.path.join(DATA_DIR, 'silence-44-s.mpc')) self.song2 = MPCFile(os.path.join(DATA_DIR, '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_bitrate(self): self.failUnlessEqual(self.song("~#bitrate"), 239) self.failUnlessEqual(self.song2("~#bitrate"), 1) def test_invalid(self): path = os.path.join(DATA_DIR, '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.5.3/tests/helper.py���������������������������������������������������������������������0000644�0001750�0001750�00000016557�12646426641�016764� 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 StringIO import sys from gi.repository import Gtk, Gdk from quodlibet.qltk import find_widgets from quodlibet.util.path import fsnative, normalize_path def dummy_path(path): path = fsnative(path) if os.name == "nt": return normalize_path(u"z:\\" + path.replace(u"/", u"\\")) return path 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, ctrl=False, shift=False, recursive=False): """See send_key_click_event""" state = Gdk.ModifierType(0) if ctrl: state |= Gdk.ModifierType.CONTROL_MASK 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, ctrl, 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 = os.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 os.environ.items(): if key not in old: del os.environ[key] for key, value in old.items(): if key not in os.environ or os.environ[key] != value: os.environ[key] = value @contextlib.contextmanager def capture_output(): """ with capture_output as (stdout, stderr): some_action() print stdout.getvalue(), stderr.getvalue() """ err = StringIO.StringIO() out = StringIO.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) as h: h.write("foo") do_stuff(filename) """ from tests import mkstemp fd, filename = mkstemp(*args, **kwargs) os.close(fd) yield filename os.remove(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.5.3/tests/test_commands.py��������������������������������������������������������������0000644�0001750�0001750�00000004274�12646426641�020336� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.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): 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("order shuffle") 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("status") self.__send("toggle-window") self.__send("unqueue /dev/null") ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk__editutils.py�������������������������������������������������������0000644�0001750�0001750�00000003136�12607265240�021722� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_query.py�����������������������������������������������������������������0000644�0001750�0001750�00000037350�12607265240�017674� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- encoding: utf-8 -*- from tests import TestCase from quodlibet import config from quodlibet.query import Query, QueryType from quodlibet.query import _match as match from quodlibet.formats import AudioFile 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')) 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_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))")) class TQuery(TestCase): def setUp(self): config.init() self.s1 = AudioFile( {"album": "I Hate: Tests", "artist": "piman", "title": "Quuxly", "version": "cake mix", "~filename": "/dir1/foobar.ogg"}) self.s2 = AudioFile( {"album": "Foo the Bar", "artist": "mu", "title": "Rockin' Out", "~filename": "/dir2/something.mp3", "tracknumber": "12/15"}) self.s3 = AudioFile( {"artist": "piman\nmu", "~filename": "/test/\xc3\xb6\xc3\xa4\xc3\xbc/fo\xc3\xbc.ogg"}) self.s4 = AudioFile({"title": u"Ångström", "utf8": "Ångström"}) self.s5 = AudioFile({"title": "oh&blahhh", "artist": "!ohno"}) def tearDown(self): config.quit() def test_repr(self): query = Query("foo = bar", []) self.assertEqual( repr(query), "<Query string=u'foo = bar' type=QueryType.VALID star=[]>") query = Query("bar", ["foo"]) self.assertEqual( repr(query), "<Query string=u'&(/bar/d)' type=QueryType.TEXT star=['foo']>") def test_2007_07_27_synth_search(self): song = AudioFile({"~filename": "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_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(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(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_star_numeric(self): self.assertRaises(ValueError, Query, u"foobar", star=["~#mtime"]) def test_match_diacriticals_explcit(self): self.failIf(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') 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.5.3/tests/test_qltk_maskedbox.py��������������������������������������������������������0000644�0001750�0001750�00000000574�12607265240�021535� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_metadata.py��������������������������������������������������������������0000644�0001750�0001750�00000007217�12607265240�020306� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import mkstemp, AbstractTestCase import os from quodlibet import formats from quodlibet import config from shutil import copyfileobj class TestMetaData(AbstractTestCase): base = 'tests/data/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, 'w') 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() 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._infos.keys(): if os.path.exists(TestMetaData.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, (TestMetaData,), extra_tests) testcase.ext = ext globals()[name] = testcase ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_util.py������������������������������������������������������������������0000644�0001750�0001750�00000101023�12646426641�017500� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import uuid from quodlibet.config import HardCodedRatingsPrefs from quodlibet.util.path import * from quodlibet.util import re_escape from quodlibet.util.string import decode, encode, split_escape, join_escape from quodlibet.util.string.splitters import * from quodlibet.util.library import * from tests import TestCase, mkstemp, skipIf import tempfile import os import sys import threading import traceback import time from quodlibet import util from quodlibet import config from quodlibet.util import format_time_long as f_t_l 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")) mkdir("nonext/test/test2/test3") try: self.failUnless(os.path.isdir("nonext/test/test2/test3")) finally: os.rmdir("nonext/test/test2/test3") os.rmdir("nonext/test/test2") os.rmdir("nonext/test") os.rmdir("nonext") class Tgetcwd(TestCase): def test_Tgetcwd(self): self.assertTrue(is_fsnative(getcwd())) 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 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.5), "11100") # Test rounding down... self.failUnlessEqual(util.format_rating(0.6), "11100") # Test rounding up... self.failUnlessEqual(util.format_rating(0.9), "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(""), "") self.assertTrue(isinstance(re_escape(""), bytes)) def test_empty_unicode(self): self.failUnlessEqual(re_escape(u""), u"") self.assertTrue(isinstance(re_escape(u""), unicode)) 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(""), "") def test_safe(self): self.failUnlessEqual(decode("foo!"), "foo!") def test_invalid(self): self.failUnlessEqual( decode("fo\xde"), u'fo\ufffd [Invalid Encoding]') class Tencode(TestCase): def test_empty(self): self.failUnlessEqual(encode(""), "") def test_unicode(self): self.failUnlessEqual(encode(u"abcde"), "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 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) 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(): self.failUnlessEqual(util.format_size(key), value) 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") 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 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_types(self): if is_win: return self.failUnlessRaises(TypeError, util.spawn, [u"ls"]) 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 = '# foo\nBLA="$HOME/blah"\n' vars_ = parse_xdg_user_dirs(data) self.assertTrue("BLA" in vars_) expected = os.path.join(os.environ.get("HOME", ""), "blah") self.assertEqual(vars_["BLA"], expected) vars_ = parse_xdg_user_dirs('BLA="$HOME/"') self.assertTrue("BLA" in vars_) self.assertEqual(vars_["BLA"], os.environ.get("HOME", "")) # some invalid self.assertFalse(parse_xdg_user_dirs("foo")) self.assertFalse(parse_xdg_user_dirs("foo=foo bar")) self.assertFalse(parse_xdg_user_dirs("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", ""]) 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 = None if not is_win: link = 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) class Tatomic_save(TestCase): def test_basic(self): fd, filename = mkstemp(".cfg") os.close(fd) with open(filename, "wb") as fobj: fobj.write("nope") with open(filename + ".tmp", "wb") as fobj: fobj.write("temp_nope") with util.atomic_save(filename, ".tmp", "wb") as fobj: fobj.write("foo") with open(filename, "rb") as fobj: self.assertEqual(fobj.read(), "foo") self.assertFalse(os.path.exists(filename + ".tmp")) class Tescape_filename(TestCase): def test_str(self): result = escape_filename("\x00\x01") self.assertEqual(result, "%00%01") self.assertTrue(is_fsnative(result)) def test_unicode(self): result = escape_filename(u'abc\xe4') self.assertEqual(result, "abc%C3%A4") self.assertTrue(is_fsnative(result)) @skipIf(is_win) 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("") self.assertTrue(isinstance(v, bytes)) v = strip_win32_incompat_from_path("foo") self.assertTrue(isinstance(v, bytes)) v = strip_win32_incompat_from_path(u"") self.assertTrue(isinstance(v, unicode)) v = strip_win32_incompat_from_path(u"foo") self.assertTrue(isinstance(v, unicode)) 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(is_fsnative(v)) v2 = glib2fsnative(fsnative2glib(v)) self.assertTrue(is_fsnative(v2)) self.assertEqual(v, v2) v3 = bytes2fsnative(fsnative2bytes(v)) self.assertTrue(is_fsnative(v3)) self.assertEqual(v, v3) class Tget_temp_cover_file(TestCase): def test_main(self): fobj = get_temp_cover_file(b"foobar") try: self.assertTrue(is_fsnative(fobj.name)) 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("\xff:\xff", ":") self.assertEqual(parts, ["\xff", "\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, unicode) for p in parts)) parts = split_escape(u"", u":") self.assertEqual(parts, [u""]) self.assertTrue(all(isinstance(p, unicode) for p in parts)) parts = split_escape(u":", u":") self.assertEqual(parts, [u"", u""]) self.assertTrue(all(isinstance(p, unicode) for p in parts)) def test_join_escape_types(self): self.assertEqual(join_escape([], ":"), "") self.assertTrue(isinstance(join_escape([], ":"), bytes)) self.assertTrue(isinstance(join_escape([], u":"), unicode)) self.assertEqual(join_escape(["\xff", "\xff"], ":"), "\xff:\xff") self.assertEqual(join_escape([u'\xe4', u'\xe4'], ":"), u'\xe4:\xe4') def test_join_escape(self): self.assertEqual(join_escape([":"], ":"), "\\:") self.assertEqual(join_escape(["\\:", ":"], ":"), "\\\\\\::\\:") def test_roundtrip(self): values = ["\\:", ":"] joined = join_escape(values, ":") self.assertEqual(split_escape(joined, ":"), 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) class Tenum(TestCase): def test_main(self): @util.enum class Foo(int): FOO = 0 BAR = 1 self.assertTrue(issubclass(Foo, int)) self.assertTrue(isinstance(Foo.BAR, Foo)) self.assertTrue(isinstance(Foo.FOO, Foo)) self.assertEqual(Foo.FOO, 0) self.assertEqual(Foo.BAR, 1) def test_str(self): @util.enum class Foo(str): FOO = "blah" BAR = "foo" self.assertTrue(issubclass(Foo, str)) self.assertTrue(isinstance(Foo.BAR, Foo)) self.assertEqual(Foo.FOO, "blah") self.assertEqual(repr(Foo.BAR), "Foo.BAR") 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, unicode)) else: self.assertTrue(isinstance(v, str)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_x.py����������������������������������������������������������������0000644�0001750�0001750�00000006533�12607265240�020030� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from helper import visible from gi.repository import Gtk from quodlibet.qltk import x from quodlibet.qltk import Icons from quodlibet import config 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 RPaned(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) 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.failUnlessEqual(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.failUnlessEqual(p.get_relative(), 0.75) class RHPaned(TestCase, RPaned): Kind = x.RHPaned class RVPaned(TestCase, RPaned): Kind = x.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 = x.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 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.5.3/tests/test_qltk_tagsfrompath.py�����������������������������������������������������0000644�0001750�0001750�00000001703�12607265240�022252� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_util_uri.py��������������������������������������������������������������0000644�0001750�0001750�00000006372�12607265240�020363� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os from tests import TestCase from quodlibet.util.uri import URI from quodlibet.util.path import is_fsnative class TURI(TestCase): def setUp(s): s.http_uri = URI("http://www.example.com/~piman;woo?bar=quux#whee") s.rfile_uri = URI("file://example.com/home/piman/crazy") s.file_uri = URI.frompath("/home/piman/cr!azy") def test_unc_paths(self): if os.name != "nt": return self.assertEqual( URI.frompath(u"\\\\server\\share\\path"), r"file:////server/share/path") def test_leading_slashes(self): self.assertEqual( str(URI("file://" + "/foo/bar")), "file://" + "/foo/bar") self.assertEqual( str(URI("file://" + "//foo/bar")), "file://" + "//foo/bar") self.assertEqual(URI("file://" + "//foo/bar").path, "//foo/bar") self.assertEqual( str(URI("file://" + "///foo/bar")), "file://" + "///foo/bar") self.assertEqual( str(URI("file://" + "////foo/bar")), "file://" + "////foo/bar") def test_windows_path(self): if os.name != "nt": return win_path = u"C:\\SomeDir\xe4" uri = URI.frompath(win_path) self.assertEqual(uri, "file:///C:/SomeDir%C3%A4") self.assertTrue(uri.is_filename) self.assertTrue(is_fsnative(uri.filename)) self.assertEqual(uri.filename, win_path) def test_raise_windows_path(self): self.assertRaises(ValueError, URI, u"C:\\Some\\path") def test_type(s): s.failUnless(isinstance(s.http_uri, URI)) s.failUnless(isinstance(s.http_uri, basestring)) # bad constructor tests def test_empty(s): s.failUnlessRaises(ValueError, URI, "") def test_no_scheme(s): s.failUnlessRaises(ValueError, URI, "foobar/?quux") def test_no_loc_or_path(s): s.failUnlessRaises(ValueError, URI, "http://") # good constructor tests def test_scheme(s): s.failUnlessEqual(s.http_uri.scheme, "http") def test_netlocl(s): s.failUnlessEqual(s.http_uri.netloc, "www.example.com") def test_path(s): s.failUnlessEqual(s.http_uri.path, "/~piman") def test_params(s): s.failUnless(s.http_uri.params, "woo") def test_query(s): s.failUnlessEqual(s.http_uri.query, "bar=quux") def test_fragment(s): s.failUnlessEqual(s.http_uri.fragment, "whee") # unescaping def test_unescaped(s): s.failUnlessEqual(s.file_uri.unescaped, "file:///home/piman/cr!azy") s.failUnlessEqual(s.http_uri.unescaped, s.http_uri) # local file handling def test_frompath(s): s.failUnlessEqual(s.file_uri, "file:///home/piman/cr%21azy") expected = os.path.sep + os.path.join("home", "piman", "cr!azy") s.failUnlessEqual(s.file_uri.filename, expected) s.assertTrue(is_fsnative(s.file_uri.filename)) def test_bad_files(s): s.failUnlessRaises(ValueError, lambda: s.http_uri.filename) s.failUnlessRaises(ValueError, lambda: s.http_uri.filename) def test_is_filename(s): s.failUnless(s.file_uri.is_filename) s.failIf(s.rfile_uri.is_filename) s.failIf(s.http_uri.is_filename) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_browsers_search.py�������������������������������������������������������0000644�0001750�0001750�00000007464�12646426641�021734� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from gi.repository import Gtk import quodlibet.browsers.search import quodlibet.config from quodlibet.browsers.search import SearchBar from quodlibet.browsers.empty import EmptyBar from quodlibet.formats import AudioFile from quodlibet.util.path import fsnative 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", "~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 TEmptyBar(TestCase): Bar = EmptyBar 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() class TSearchBar(TEmptyBar): Bar = SearchBar ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_formats_mp3.py�����������������������������������������������������������0000644�0001750�0001750�00000003335�12607265240�020755� 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 mutagen from tests import TestCase, DATA_DIR from quodlibet.formats.mp3 import MP3File class TMP3File(TestCase): def setUp(self): self.song = MP3File(os.path.join(DATA_DIR, 'silence-44-s.mp3')) self.song2 = MP3File(os.path.join(DATA_DIR, 'test.mp2')) self.song3 = MP3File(os.path.join(DATA_DIR, 'lame.mp3')) def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.0, 1) self.assertAlmostEqual(self.song2("~#length"), 1.764, 3) if mutagen.version >= (1, 31): self.assertAlmostEqual(self.song3("~#length"), 0.0616, 3) def test_bitrate(self): self.failUnlessEqual(self.song("~#bitrate"), 32) self.failUnlessEqual(self.song2("~#bitrate"), 32) if mutagen.version >= (1, 31): 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): if mutagen.version < (1, 31): return self.assertEqual(self.song("~encoding"), "") self.assertEqual(self.song2("~encoding"), "") self.assertEqual(self.song3("~encoding"), "LAME 3.99.1+\nVBR") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_browsers_playlists.py����������������������������������������������������0000644�0001750�0001750�00000016610�12646426641�022504� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from quodlibet.browsers.playlists.util import parse_m3u, parse_pls, PLAYLISTS from quodlibet.util.collection import Playlist from tests import TestCase, DATA_DIR, mkstemp, mkdtemp from helper import dummy_path import os import shutil from quodlibet.browsers.playlists import PlaylistsBrowser from quodlibet.library import SongLibrary import quodlibet.config from quodlibet.formats import AudioFile from quodlibet.util.path import fsnative2glib, 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) file(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 += fsnative2glib(os.path.join(DATA_DIR, "silence-44-s.ogg")) 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 = os.path.join(DATA_DIR, "silence-44-s.ogg") from quodlibet.util.uri import URI target = URI.frompath(target) target = self.prefix + target f = file(name, "w") f.write(target) f.close() 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 = "" class TParsePLS(TParsePlaylist, TParsePlaylistMixin): Parse = staticmethod(parse_pls) prefix = "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 = Playlist.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 = Playlist.new(self._dir, "Foobar") pl.extend(self.SONGS) self.assertTrue(len(pl)) pl.remove_songs(self.SONGS, False) self.assertFalse(len(pl)) class TPlaylists(TSearchBar): Bar = PlaylistsBrowser ANOTHER_SONG = AudioFile({ "title": "lonely", "artist": "new artist", "~filename": dummy_path(u"/dev/urandom")}) def setUp(self): try: shutil.rmtree(PLAYLISTS) except OSError: pass mkdir(PLAYLISTS) self.lib = quodlibet.browsers.playlists.library = SongLibrary() self.lib.librarian = SongLibrarian() all_songs = SONGS + [self.ANOTHER_SONG] for af in all_songs: af.sanitize() self.lib.add(all_songs) pl = Playlist.new(PLAYLISTS, "Big", self.lib) pl.extend(SONGS) pl.write() pl = Playlist.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) 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") ������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_filesel.py����������������������������������������������������������0000644�0001750�0001750�00000007172�12607265240�021204� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase, mkdtemp import os import sys sys.modules['dircache'] = os # cheat the dircache effects from quodlibet.qltk.filesel import DirectoryTree, FileSelector, get_drives from quodlibet.qltk.filesel import MainDirectoryTree, MainFileSelector from quodlibet.util.path import fsnative, is_fsnative, get_home_dir import quodlibet.config 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(is_fsnative(path)) 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.5.3/tests/test_util_cover.py������������������������������������������������������������0000644�0001750�0001750�00000011124�12646426641�020700� 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 import config from quodlibet.formats import AudioFile from quodlibet.util.cover.manager import CoverManager from quodlibet.util.path import fsnative, normalize_path from . import TestCase, DATA_DIR quux = AudioFile({ "~filename": os.path.join(DATA_DIR, "asong.ogg"), "album": u"Quuxly", }) 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): config.init() self.manager = CoverManager() self.dir = os.path.realpath(quux("~dirname")) self.files = [self.full_path("12345.jpg"), self.full_path("nothing.jpg") ] for f in self.files: file(f, "w").close() def _find_cover(self, song): return self.manager.get_cover(song) def tearDown(self): for f in self.files: os.unlink(f) config.quit() 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(quux)) def test_labelid(self): quux["labelid"] = "12345" self.failUnlessEqual(os.path.abspath(self._find_cover(quux).name), self.full_path("12345.jpg")) del(quux["labelid"]) def test_regular(self): files = [os.path.join(self.dir, f) for f in ["cover.png", "folder.jpg", "frontcover.jpg", "front_folder_cover.gif", "jacket_cover.front.folder.jpeg"]] for f in files: file(f, "w").close() self.files.append(f) self.failUnlessEqual( os.path.abspath(self._find_cover(quux).name), f) self.test_labelid() # labelid must work with other files present def test_file_encoding(self): if os.name == "nt": return f = self.full_path("\xff\xff\xff\xff - cover.jpg") file(f, "w").close() self.files.append(f) self.assertTrue(isinstance(quux("album"), unicode)) h = self._find_cover(quux) self.assertEqual(h.name, normalize_path(f)) def test_intelligent(self): song = quux song["artist"] = "Q-Man" song["title"] = "First Q falls hardest" files = [self.full_path(f) for f in ["Quuxly - back.jpg", "Quuxly.jpg", "q-man - quxxly.jpg", "folder.jpeg", "Q-man - Quuxly (FRONT).jpg"]] for f in files: file(f, "w").close() self.files.append(f) cover = self._find_cover(song) if cover: actual = os.path.abspath(cover.name) self.failUnlessEqual(actual, f) else: # Here, no cover is better than the back... self.failUnlessEqual(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(u"tests/data/asong.ogg"), "album": "foobar", "title": "Ode to Baz", "artist": "Q-Man", }) files = [self.full_path(f) for f in ['back.jpg', 'discovery.jpg', "Pharell - frontin'.jpg", 'nickelback - Curb.jpg', 'foobar.jpg', 'folder.jpg', # Though this is debatable 'Q-Man - foobar.jpg', 'Q-man - foobar (cover).jpg']] for f in files: file(f, "w").close() self.files.append(f) cover = self._find_cover(song) if cover: actual = os.path.abspath(cover.name) self.failUnlessEqual( actual, f, "\"%s\" should trump \"%s\"" % (f, actual)) else: self.failUnless(f, self.full_path('back.jpg')) def test_get_thumbnail(self): self.assertTrue(self.manager.get_pixbuf(quux, 10, 10) is None) self.assertTrue(self.manager.get_pixbuf_many([quux], 10, 10) is None) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_util_logging.py����������������������������������������������������������0000644�0001750�0001750�00000003412�12607265240�021202� 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.5.3/tests/test_source.py����������������������������������������������������������������0000644�0001750�0001750�00000005511�12607265240�020021� 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")] 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("coding[:=]\s*([-\w.]+)", line) if i >= 2: break if match: match = match.group(1) self.assertEqual(match, "utf-8", msg="%s has no utf-8 source encoding set\n" "Insert:\n# -*- coding: utf-8 -*-" % path) 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() 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.5.3/tests/test_formats_mod.py�����������������������������������������������������������0000644�0001750�0001750�00000001244�12607265240�021032� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase, skipUnless, DATA_DIR import os from quodlibet.formats.mod import ModFile, extensions @skipUnless(extensions, "ModPlug missing") class TModFile(TestCase): def setUp(self): self.song = ModFile(os.path.join(DATA_DIR, '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.5.3/tests/test_qltk_songsmenu.py��������������������������������������������������������0000644�0001750�0001750�00000011140�12607265240�021565� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary from quodlibet.util.path import fsnative from quodlibet.qltk.songsmenu import SongsMenu from quodlibet import config 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(unicode(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 if browsers.media.MediaDevices in browsers.browsers: 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.5.3/tests/test_plugins_cover.py���������������������������������������������������������0000644�0001750�0001750�00000023444�12607265240�021405� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import io import os import shutil from gi.repository import Gtk from gi.repository import GdkPixbuf from tests import TestCase, mkdtemp, mkstemp, DATA_DIR 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 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", [], []) fd, self.file1 = mkstemp(".mp3", dir=self.main) os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.mp3'), self.file1) fd, self.file2 = mkstemp(".mp3", dir=self.main) os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.mp3'), self.file2) 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.5.3/tests/test_icons.py�����������������������������������������������������������������0000644�0001750�0001750�00000001132�12607265240�017627� 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.5.3/tests/test_formats_apev2.py���������������������������������������������������������0000644�0001750�0001750�00000014522�12607265240�021273� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import DATA_DIR, mkstemp, TestCase import os import shutil import StringIO import mutagen from mutagen.apev2 import BINARY, APEValue 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 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("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): fd, self.f = mkstemp(".mpc") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.mpc'), self.f) self.s = MPCFile(self.f) def tearDown(self): os.unlink(self.f) class TMAFile(TestCase, TAPEv2FileMixin): def setUp(self): fd, self.f = mkstemp(".ape") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.ape'), self.f) 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"), "") class TWavpackFileAPEv2(TestCase, TAPEv2FileMixin): def setUp(self): fd, self.f = mkstemp(".wv") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.wv'), self.f) 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): fd, self.f = mkstemp(".wv") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'coverart.wv'), self.f) 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 = StringIO.StringIO("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].file.read(), "foo") def test_set_image_no_tag(self): m = mutagen.apev2.APEv2(self.f) m.delete() fileobj = StringIO.StringIO("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.5.3/tests/test_qltk_window.py�����������������������������������������������������������0000644�0001750�0001750�00000003515�12607265240�021065� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.qltk.window import Window, on_first_map, Dialog from quodlibet.util import InstanceTracker 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 = Window() w.use_header_bar() self.assertEqual(w.get_title(), None) 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.5.3/tests/test_qltk_getstring.py��������������������������������������������������������0000644�0001750�0001750�00000002370�12607265240�021562� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_pattern.py���������������������������������������������������������������0000644�0001750�0001750�00000042464�12607265240�020206� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase, AbstractTestCase import os from quodlibet.formats import AudioFile from quodlibet.util.path import is_fsnative from quodlibet.pattern import (FileFromPattern, XMLFromPattern, Pattern, XMLFromMarkupPattern, ArbitraryExtensionFileFromPattern) class _TPattern(AbstractTestCase): def setUp(self): s1 = {'tracknumber': '5/6', 'artist': 'Artist', 'title': 'Title5', '~filename': '/path/to/a.mp3', 'xmltest': "<&>"} s2 = {'tracknumber': '6', 'artist': 'Artist', 'title': 'Title6', '~filename': '/path/to/b.ogg', 'discnumber': '2', 'unislash': u"foo\uff0fbar"} s3 = {'title': 'test/subdir', 'genre': '/\n/', '~filename': '/one/more/a.flac', 'version': 'Instrumental'} s4 = {'performer': 'a\nb', 'artist': 'foo\nbar'} s5 = {'tracknumber': '7/1234', 'artist': 'Artist', 'title': 'Title7', '~filename': '/path/to/e.mp3'} s6 = {'artist': 'Foo', 'albumartist': 'foo.bar', 'album': 'Best Of', '~filename': '/path/to/f.mp3', 'title': 'The.Final.Word'} s7 = {'artist': u'un élève français', '~filename': '/path/to/g.mp3', 'albumartist': u'Lee "Scratch" Perry', 'album': "The 'only' way!", 'comment': 'Trouble|Strife'} 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" 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) class TPattern(_TPattern): from quodlibet.formats import AudioFile AudioFile 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": "yes"})), "x") self.assertEqual(pat.format(AudioFile({"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_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": "\xe3\x81\x99\xe3\x81\xbf\xe3\x82\x8c".decode('utf-8')}) pat = Pattern('<~#track>. <title>') s.assertEquals(pat.format(song), "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>') pat = Pattern('<~filename>') wpat = s._create(r'\\<artist>\\ "<title>') s.assertTrue(fpat.format(s.a).startswith("_path_to_a.mp3")) s.assertTrue(pat.format(s.a).startswith("/path/to/a")) if os.name != "nt": s.assertTrue(wpat.format(s.a).startswith("\\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.assertEquals(p1.format(s.a), '_path_to_a.mp3') s.assertEquals(p1.format(s.b), p2.format(s.b)) s.assertEquals(p1.format(s.b), '_path_to_b.ogg') s.assertEquals(p1.format(s.c), p2.format(s.c)) s.assertEquals(p1.format(s.c), '_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 is_fsnative(path) s.failUnlessEqual(len(path), 3 + 6 + 1 + 255 + 1 + 255) path = s._create(u'äüö<title><title>').format(a) assert is_fsnative(path) s.failUnlessEqual(len(path), 255) else: a = AudioFile({"title": "x" * 300, "~filename": "/f.mp3"}) path = s._create(u'/foobar/ä<title>/<title>').format(a) assert is_fsnative(path) s.failUnlessEqual(len(path), 1 + 6 + 1 + 255 + 1 + 255) path = s._create(u'äüö<title><title>').format(a) assert is_fsnative(path) s.failUnlessEqual(len(path), 255) class TFileFromPattern(_TFileFromPattern): def _create(self, string): return FileFromPattern(string) 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': '/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_same(s): pat = Pattern('<~basename> <title>') s.failUnlessEqual(pat.format_list(s.a), {pat.format(s.a)}) pat = Pattern('/a<genre|/<genre>>/<title>') s.failUnlessEqual(pat.format_list(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)}) s.assertEquals(pat.format_list(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', 'b'}) pat = Pattern('<performer><performer>') s.failUnlessEqual(set(pat.format_list(s.d)), {'aa', 'ab', 'ba', 'bb'}) pat = Pattern('<~performer~artist>') s.failUnlessEqual(pat.format_list(s.d), {'a - foo', 'b - foo', 'a - bar', 'b - bar'}) pat = Pattern('<performer~artist>') s.failUnlessEqual(pat.format_list(s.d), {'a - foo', 'b - foo', 'a - bar', 'b - bar'}) pat = Pattern('<artist|<artist>.|<performer>>') s.failUnlessEqual(pat.format_list(s.d), {'foo.', 'bar.'}) pat = Pattern('<artist|<artist|<artist>.|<performer>>>') s.failUnlessEqual(pat.format_list(s.d), {'foo.', 'bar.'}) def test_missing_value(self): pat = Pattern('<genre> - <artist>') self.assertEqual(pat.format_list(self.a), {" - Artist"}) pat = Pattern('') self.assertEqual(pat.format_list(self.a), {""}) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_player.py����������������������������������������������������������������0000644�0001750�0001750�00000023316�12607400623�020014� 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, skipUnless, AbstractTestCase from quodlibet import player from quodlibet import library from quodlibet import config from quodlibet.util.path import fsnative 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(AbstractTestCase): NAME = None def setUp(self): config.init() config.set("player", "gst_pipeline", "fakesink") 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() 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): 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): 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): 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.5.3/tests/test_formats___init__.py������������������������������������������������������0000644�0001750�0001750�00000013347�12607265240�022021� 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 os import pickle from tests import TestCase, DATA_DIR from helper import capture_output, temp_filename from quodlibet import formats from quodlibet.formats import AudioFile 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.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_infos(self): self.failUnless(formats._infos[".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 = os.path.join(DATA_DIR, 'silence-44-s.mp3') self.assertTrue(formats.MusicFile(path)) # non existing with capture_output() as (stdout, stderr): song = formats.MusicFile(os.path.join(DATA_DIR, "nope.mp3")) self.assertFalse(song) self.assertTrue("Error" in stderr.getvalue()) # unknown extension with capture_output() as (stdout, stderr): song = formats.MusicFile(os.path.join(DATA_DIR, "nope.xxx")) self.assertFalse(song) self.assertTrue("extension" in stderr.getvalue()) class TPickle(TestCase): # protocol 1 pickle of all types (created by test_pickle below) PICKLE = ( b']q\x00(ccopy_reg\n_reconstructor\nq\x01(cquodlibet.formats.vgm\nVgm' b'File\nq\x02c__builtin__\ndict\nq\x03}q\x04tq\x05Rq\x06h\x01(cquodli' b'bet.formats.monkeysaudio\nMonkeysAudioFile\nq\x07h\x03}q\x08tq\tRq' b'\nh\x01(cquodlibet.formats.mpc\nMPCFile\nq\x0bh\x03}q\x0ctq\rRq\x0eh' b'\x01(cquodlibet.formats.aac\nAACFile\nq\x0fh\x03}q\x10tq\x11Rq' b'\x12h\x01(cquodlibet.formats.midi\nMidiFile\nq\x13h\x03}q\x14' b'tq\x15Rq\x16h\x01(cquodlibet.formats.wavpack\nWavpackFile\nq\x17' b'h\x03}q\x18tq\x19Rq\x1ah\x01(cquodlibet.formats.trueaudio\nTrueAudio' b'File\nq\x1bh\x03}q\x1ctq\x1dRq\x1eh\x01(cquodlibet.formats.mp4\nMP4' b'File\nq\x1fh\x03}q tq!Rq"h\x01(cquodlibet.formats.xiph\nOggFLACFile' b'\nq#h\x03}q$tq%Rq&h\x01(cquodlibet.formats.xiph\nOggSpeexFile\nq\'h' b'\x03}q(tq)Rq*h\x01(cquodlibet.formats.xiph\nOggOpusFile\nq+h\x03}q,' b'tq-Rq.h\x01(cquodlibet.formats.xiph\nOggFile\nq/h\x03}q0tq1Rq2h\x01' b'(cquodlibet.formats.xiph\nFLACFile\nq3h\x03}q4tq5Rq6h\x01(cquodlibet' b'.formats.xiph\nOggTheoraFile\nq7h\x03}q8tq9Rq:h\x01(cquodlibet.forma' b'ts.wav\nWAVEFile\nq;h\x03}q<tq=Rq>h\x01(cquodlibet.formats.wma\nWMA' b'File\nq?h\x03}q@tqARqBh\x01(cquodlibet.formats.spc\nSPCFile\nqCh\x03' b'}qDtqERqFh\x01(cquodlibet.formats.mp3\nMP3File\nqGh\x03}qHtqIRqJh' b'\x01(cquodlibet.formats.remote\nRemoteFile\nqKh\x03}qLtqMRqNh\x01(cq' b'uodlibet.formats.mod\nModFile\nqOh\x03}qPtqQRqRe.') def test_pickle(self): types = formats.types instances = [] for t in types: instances.append(AudioFile.__new__(t)) with temp_filename() as filename: with open(filename, "wb") as h: pickle.dump(instances, h, 1) with open(filename, "rb") as h: self.assertEqual(len(pickle.load(h)), len(formats.types)) def test_unpickle(self): self.assertEqual(len(pickle.loads(self.PICKLE)), len(formats.types)) def test_load_items(self): from quodlibet.library.libraries import load_items with temp_filename() as filename: with open(filename, "wb") as h: h.write(self.PICKLE) self.assertEqual(len(load_items(filename)), len(formats.types)) def test_dump_items(self): from quodlibet.library.libraries import dump_items, load_items types = formats.types instances = [] for t in types: instances.append(AudioFile.__new__(t)) with temp_filename() as filename: dump_items(filename, instances) self.assertEqual(len(load_items(filename)), len(formats.types)) def test_unpickle_save(self): from quodlibet.library.libraries import unpickle_save items = unpickle_save(self.PICKLE, []) self.assertEqual(len(items), len(formats.types)) broken = self.PICKLE.replace(b"SPCFile", b"FooFile") items = unpickle_save(broken, []) self.assertEqual(len(items), len(formats.types) - 1) broken = self.PICKLE.replace(b"formats.spc", b"formats.foo") items = unpickle_save(broken, []) self.assertEqual(len(items), len(formats.types) - 1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_browsers_paned.py��������������������������������������������������������0000644�0001750�0001750�00000037711�12607265240�021545� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from helper import realized from gi.repository import Gtk 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.util.path import fsnative 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"}), ] SONGS.sort() 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_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"]) 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"]) 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 - 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", 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", 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", 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.5.3/tests/test_qltk_about.py������������������������������������������������������������0000644�0001750�0001750�00000000534�12607265240�020666� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.qltk.about import AboutQuodLibet, AboutExFalso from quodlibet.player.nullbe import NullPlayer class TAboutQuodLibet(TestCase): def test_ctr(self): AboutQuodLibet(None, NullPlayer()).destroy() def test_ef(self): AboutExFalso(None, NullPlayer()).destroy() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_browsers_audiofeeds.py���������������������������������������������������0000644�0001750�0001750�00000001132�12607265240�022552� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.browsers.audiofeeds import AudioFeeds from quodlibet.library import SongLibrary import quodlibet.config 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() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_desktop_files.py���������������������������������������������������������0000644�0001750�0001750�00000003326�12607265240�021356� 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 QLDATA_DIR = os.path.join(os.path.dirname( os.path.dirname(os.path.realpath(__file__))), "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("_"): l = l[1:] new_lines.append(l) temp.write("\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.5.3/tests/test_qltk_playorder.py��������������������������������������������������������0000644�0001750�0001750�00000004535�12607265240�021562� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from quodlibet.qltk.playorder import PlayOrder import quodlibet.config import quodlibet.plugins class TPlayOrder(TestCase): def setUp(self): quodlibet.plugins.init() quodlibet.config.init() self.order = None self.volume = 0 self.replaygain_profiles = [None, None, None] self.reset_replaygain = lambda: None self.po = PlayOrder(self, self) def tearDown(self): self.po.destroy() quodlibet.plugins.quit() quodlibet.config.quit() def test_initial(self): self.failUnlessEqual(self.po.get_active_name(), "inorder") self.failUnless(self.replaygain_profiles[2], ["album", "track"]) def test_unknown_name(self): self.assertRaises(ValueError, self.po.set_active_by_name, "foobar") def test_unknown_index(self): self.assertRaises(IndexError, self.po.set_active_by_index, 999) def test_set_name(self): self.po.set_active_by_name("weighted") self.failUnlessEqual(self.po.get_active_name(), "weighted") def test_replay_gain(self): self.po.set_active_by_name("weighted") self.failUnlessEqual(self.replaygain_profiles[2], ["track"]) self.po.set_active_by_name("inorder") self.failUnlessEqual(self.replaygain_profiles[2], ["album", "track"]) def test_set_int(self): old = self.po.get_active_name() self.po.set_active_by_index(3) self.failIfEqual(self.po.get_active_name(), old) def test_get_name(self): orders = ["inorder", "shuffle", "weighted", "onesong"] for i, name in enumerate(orders): self.po.set_active_by_name(name) self.failUnlessEqual(self.po.get_active_name(), name) def test_shuffle(self): self.assertEqual(self.po.get_active_name(), "inorder") self.po.set_shuffle(True) self.assertTrue(self.po.get_shuffle()) self.assertEqual(self.po.get_active_name(), "shuffle") def test_shuffle_weighted(self): self.po.set_active_by_name("weighted") self.assertTrue(self.po.get_shuffle()) self.po.set_shuffle(False) self.assertEqual(self.po.get_active_name(), "inorder") self.po.set_shuffle(True) self.assertTrue(self.po.get_shuffle()) self.assertEqual(self.po.get_active_name(), "weighted") �������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_formats__id3.py����������������������������������������������������������0000644�0001750�0001750�00000053377�12616615021�021103� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase, DATA_DIR, mkstemp import os import shutil import StringIO from quodlibet import config, const from quodlibet.formats._image import EmbeddedImage from quodlibet.formats.mp3 import MP3File from quodlibet.formats._id3 import ID3hack import mutagen class TID3Images(TestCase): def setUp(self): config.init() fd, self.filename = mkstemp(".mp3") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.mp3'), self.filename) def tearDown(self): os.remove(self.filename) config.quit() def test_can_change_images(self): self.failUnless(MP3File(self.filename).can_change_images) def test_get_primary_image(self): self.failIf(MP3File(self.filename).has_images) f = mutagen.File(self.filename) apic = mutagen.id3.APIC(encoding=3, mime="image/jpeg", type=4, desc="foo", data="bar") f.tags.add(apic) f.save() song = MP3File(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(), "bar") apic = mutagen.id3.APIC(encoding=3, mime="image/jpeg", type=3, desc="xx", data="bar2") f.tags.add(apic) f.save() song = MP3File(self.filename) self.failUnless(song.has_images) image = song.get_primary_image() self.failUnlessEqual(image.file.read(), "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="bar") f.tags.add(apic) f.save() song = MP3File(self.filename) self.failUnless(song.has_images) song.clear_images() song = MP3File(self.filename) self.assertFalse(song.has_images) def test_set_image(self): fileobj = StringIO.StringIO("foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) song = MP3File(self.filename) self.failIf(song.has_images) song.set_image(image) self.assertTrue(song.has_images) song = MP3File(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 = MP3File(self.filename) fileobj = StringIO.StringIO("foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) song.set_image(image) song = MP3File(self.filename) self.assertTrue(song.has_images) class TID3File(TestCase): def setUp(self): config.init() fd, self.filename = mkstemp(".mp3") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'silence-44-s.mp3'), self.filename) fd, self.filename2 = mkstemp(".mp3") os.close(fd) shutil.copy(os.path.join(DATA_DIR, 'mutagen-bug.mp3'), self.filename2) 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: MP3File(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(MP3File(self.filename)['date'], '2010-01-14') f.tags.delall('TDRC') f.save() self.assertEquals(MP3File(self.filename)['date'], '2010-01-13') f.delete() MP3File(self.filename) 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(MP3File(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(MP3File(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(MP3File(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 = MP3File(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 = MP3File(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 = MP3File(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(MP3File(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(MP3File(self.filename)("~#length") > 0) # inval f.tags.add(mutagen.id3.TLEN(encoding=0, text=['x'])) f.save() self.failUnless(MP3File(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(MP3File(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="x")) f.save() song = MP3File(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, "y") del song["musicbrainz_trackid"] song.write() f = mutagen.File(self.filename) self.failIf(f.tags.get("UFID:http://musicbrainz.org")) 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(MP3File(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 = MP3File(self.filename) self.failIfAlmostEqual(song.replay_gain(["track"]), 1.0, 1) # check if all keys are str for k in MP3File(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 = MP3File(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 = MP3File(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 = MP3File(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 = MP3File(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 MP3File(self.filename).keys(): self.failUnless(isinstance(k, str)) song = MP3File(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 = MP3File(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 = MP3File(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 = MP3File(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() MP3File(self.filename) def test_id3_hack(self): # will only show the content of the last frame f = mutagen.File(self.filename) self.failUnless(len(f.tags["TPE1"].text), 1) # will merge both frames and translate TP1 to TPE1, so 3 values f = mutagen.mp3.MP3(self.filename, ID3=ID3hack) f.tags.add(mutagen.id3.TP1(encoding=3, text="blah")) self.failUnless(len(f.tags["TPE1"].text), 3) # same here, but without the TP1, so 2 values song = MP3File(self.filename) self.failUnlessEqual(len(song.list("artist")), 2) def test_encoding(self): song = MP3File(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 = MP3File(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(MP3File(self.filename).list("~performer")), 1) # but after writing they should still be there song = MP3File(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 = MP3File(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 = MP3File(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 = MP3File(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 = MP3File(self.filename) self.failUnlessAlmostEqual(song.replay_gain(["track"]), 0.7, 1) def test_rva_inval(self): song = MP3File(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 = MP3File(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"))) f.save() # back to utf-8 song = MP3File(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(MP3File(self.filename)("artist"), x) def test_handled_txxx_encoding(self): song = MP3File(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 = MP3File(self.filename) song['albumartistsort'] = u"foo" song.write() song = MP3File(self.filename) self.assertEqual(song['albumartistsort'], u"foo") def tearDown(self): os.unlink(self.filename2) os.unlink(self.filename) config.quit() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_util_tagsfrompath.py�����������������������������������������������������0000644�0001750�0001750�00000014264�12607265240�022262� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase import os from quodlibet.util.tagsfrompath import TagsFromPattern from quodlibet.util.path import fsnative 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 formats._infos.iteritems(): 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.5.3/tests/test_qltk_properties.py�������������������������������������������������������0000644�0001750�0001750�00000003327�12607265240�021753� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase from gi.repository import Gtk from quodlibet.formats import AudioFile from quodlibet.util.path import fsnative 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.5.3/tests/test_util_environment.py������������������������������������������������������0000644�0001750�0001750�00000001772�12607265240�022127� 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.environment import * 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.5.3/tests/test_util_thread.py�����������������������������������������������������������0000644�0001750�0001750�00000003156�12607265240�021030� 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.5.3/tests/test_util_massagers.py��������������������������������������������������������0000644�0001750�0001750�00000007203�12646426641�021552� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase import quodlibet.util.massagers class TMassagers(TestCase): def validate(self, key, values): for val in values: self.failUnless(quodlibet.util.massagers.tags[key].is_valid(val)) def invalidate(self, key, values): for val in values: self.failIf(quodlibet.util.massagers.tags[key].is_valid(val)) def equivs(self, key, equivs): for value, normed in equivs.items(): self.failUnlessEqual( normed, quodlibet.util.massagers.tags[key].validate(value)) 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 = quodlibet.util.massagers.tags["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.5.3/tests/test_formats_midi.py����������������������������������������������������������0000644�0001750�0001750�00000002406�12607265240�021176� 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 from tests import TestCase, DATA_DIR from quodlibet.formats.midi import MidiFile class TMidiFile(TestCase): def setUp(self): self.song = MidiFile(os.path.join(DATA_DIR, '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 = os.path.join(DATA_DIR, '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.5.3/tests/test_qltk_notif.py������������������������������������������������������������0000644�0001750�0001750�00000002530�12607265240�020671� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from tests import TestCase 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.5.3/tests/test_util_string.py�����������������������������������������������������������0000644�0001750�0001750�00000002443�12607265240�021065� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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 = '\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.5.3/tests/test_browsers_filesystem.py���������������������������������������������������0000644�0001750�0001750�00000001120�12607265240�022623� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_const.py�����������������������������������������������������������������0000644�0001750�0001750�00000002231�12607265240�017643� 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 == "master" or branch.startswith("quodlibet"): self.failUnlessEqual(branch, const.BRANCH_NAME) def test_authors(self): # Noting that <= is subset operator on sets... self.assertLessEqual(set(const.MAIN_AUTHORS), set(const.AUTHORS)) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/tests/test_qltk_textedit.py���������������������������������������������������������0000644�0001750�0001750�00000003230�12607265240�021402� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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.5.3/tests/test_formats_spc.py�����������������������������������������������������������0000644�0001750�0001750�00000002476�12607265240�021050� 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, DATA_DIR from quodlibet.formats.spc import SPCFile class TSPCFile(TestCase): def setUp(self): self.song = SPCFile(os.path.join(DATA_DIR, '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 = os.path.join(DATA_DIR, '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.5.3/setup.py����������������������������������������������������������������������������0000755�0001750�0001750�00000014370�12607265240�015466� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python2 # -*- 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 sys import os import shutil from distutils.core import setup from gdist import GDistribution if __name__ == "__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__))) import quodlibet from quodlibet import const # find all packages package_path = quodlibet.__path__[0] 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) setup_kwargs = { 'distclass': GDistribution, 'name': "quodlibet", 'version': const.VERSION, '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", "coverage_options": { "directory": "coverage", }, } if os.name == 'nt': # taken from http://www.py2exe.org/index.cgi/win32com.shell # ModuleFinder can't handle runtime changes to __path__, # but win32com uses them try: # py2exe 0.6.4 introduced a replacement modulefinder. # This means we have to add package paths there, not to the # built-in one. If this new modulefinder gets integrated into # Python, then we might be able to revert this some day. # if this doesn't work, try import modulefinder try: import py2exe.mf as modulefinder except ImportError: import modulefinder import win32com for p in win32com.__path__[1:]: modulefinder.AddPackagePath("win32com", p) for extra in ["win32com.shell", "win32com.client"]: __import__(extra) m = sys.modules[extra] for p in m.__path__[1:]: modulefinder.AddPackagePath(extra, p) except ImportError: # no build path setup, no worries. pass def recursive_include_py2exe(dir_, pre, ext): all_ = [] dir_ = os.path.join(dir_, pre) for path, dirs, files in os.walk(dir_): all_path = [] for file_ in files: if file_.split('.')[-1] in ext: all_path.append(os.path.join(path, file_)) if all_path: all_.append((path, all_path)) return all_ data_files = [('', ['COPYING'])] + recursive_include_py2exe( "quodlibet", "images", ("svg", "png")) # py2exe trips over -1 when trying to write version info in the exe if setup_kwargs["version"].endswith(".-1"): setup_kwargs["version"] = setup_kwargs["version"][:-3] CMD_SUFFIX = "-cmd" GUI_TOOLS = ["quodlibet", "exfalso"] for gui_name in GUI_TOOLS: setup_kwargs.setdefault("windows", []).append({ "script": "%s.py" % gui_name, "icon_resources": [(1, os.path.join('..', 'win_installer', 'misc', '%s.ico' % gui_name))], }) # add a cmd version that supports stdout but opens a console setup_kwargs.setdefault("console", []).append({ "script": "%s%s.py" % (gui_name, CMD_SUFFIX), "icon_resources": [(1, os.path.join('..', 'win_installer', 'misc', '%s.ico' % gui_name))], }) setup_kwargs["scripts"].append("%s%s.py" % (gui_name, CMD_SUFFIX)) for cli_name in ["operon"]: setup_kwargs.setdefault("console", []).append({ "script": "%s.py" % cli_name, }) setup_kwargs.update({ 'data_files': data_files, 'options': { 'py2exe': { 'packages': ('encodings, feedparser, quodlibet, ' 'HTMLParser, cairo, musicbrainz2, shelve, ' 'json, gi'), 'skip_archive': True, 'dist_dir': os.path.join('dist', 'bin'), } } }) for name in GUI_TOOLS: shutil.copy("%s.py" % name, "%s%s.py" % (name, CMD_SUFFIX)) try: setup(**setup_kwargs) finally: for name in GUI_TOOLS: os.unlink("%s%s.py" % (name, CMD_SUFFIX)) else: setup(**setup_kwargs) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/po/���������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�014374� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/po/bg.po����������������������������������������������������������������������������0000644�0001750�0001750�00000523004�12646427547�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: 2016-01-16 12:54+0100\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 "Слушане на музика" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "редактор на музикални етикети" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "папка" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Заглавие" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Артист" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Дата" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "жанр" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Оценка" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Сортиране по дата" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Настройки" #: ../quodlibet/browsers/albums/main.py:339 #, fuzzy msgid "Album List" msgstr "Спис_ък с албуми" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Спис_ък с албуми" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Всички албуми" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d албум" msgstr[1] "%d албума" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Показване на _обложките" msgstr[1] "Показване на _обложките" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Песните не са в албум" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d песен" msgstr[1] "%d песни" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d диск" msgstr[1] "%d диска" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Всички албуми" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Настройки на списъка с албуми" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Показване на _обложките" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[опции]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Показване на албум" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Невалиден шаблон" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "непознат" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Нова емисия" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Въведете местоположението на аудио емисия:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 #, fuzzy msgid "Audio Feeds" msgstr "_Аудио емисии" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Аудио емисии" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "Из_тегляне" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Изтегляне на файлове" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Изтегляне на файл" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Неуспех при добавяне на емисията" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Изтриване на файлове" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Разглеждане на фонотеката" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "" msgstr[1] "" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "непознат" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Разделяне на _множество стойности" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Лично" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Премахване на станция" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Етикет" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Настройки на списъка с албуми" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 #, fuzzy msgid "Disable Browser" msgstr "_Изключване на разглеждането" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Изключване на разглеждането" #: ../quodlibet/browsers/filesystem.py:39 #, fuzzy msgid "File System" msgstr "Ф_айлова система" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "Ф_айлова система" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Неуспех при копиране на песните" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Избраните файлове не могат да бъдат копирани към други списъци с песни или " "към опашката." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "Пре_зареждане на фонотеката" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Неподдържан вид файл" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Неуспех при добавяне на станцията" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 #, fuzzy msgid "Internet Radio" msgstr "_Радио по Интернет" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Изтегляне на файлове" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Нова станция" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Радио по Интернет" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Нова станция" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Нова станция" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Нова станция" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Няма открити станции." #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Няма открити Интернет радиостанции на %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Всички изписани станции са вече във фонотеката Ви." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Добавяне към списък" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "Премахване от фонотеката" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d станция" msgstr[1] "%(count)d станции" #: ../quodlibet/browsers/media.py:34 #, fuzzy msgid "Device Properties" msgstr "Информация" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "точка на монтиране" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Име:" #: ../quodlibet/browsers/media.py:133 #, fuzzy msgid "Media Devices" msgstr "Аудио устройство: %s" #: ../quodlibet/browsers/media.py:134 #, fuzzy msgid "_Media Devices" msgstr "Аудио устройство: %s" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 #, fuzzy msgid "_Eject" msgstr "_Избор" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Информация" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Преименуване" #: ../quodlibet/browsers/media.py:459 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 #, fuzzy msgid "Unable to copy song" msgstr "Неуспех при копиране на песните" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/browsers/media.py:543 #, fuzzy msgid "Unable to delete songs" msgstr "Неуспех при добавяне на песните" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/browsers/media.py:577 #, fuzzy msgid "Unable to delete song" msgstr "Неуспех при редактиране на песента" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/browsers/media.py:595 #, fuzzy msgid "Unable to eject device" msgstr "Неуспех при изтриването на файл" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 #, fuzzy msgid "Paned Browser" msgstr "_Изглед на панели" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Изглед на панели" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "_Избор на всички" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Всички" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Настройки на панели" #: ../quodlibet/browsers/playlists/main.py:37 #, fuzzy msgid "Playlists" msgstr "Сп_исъци с песни" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "Сп_исъци с песни" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Премахване от фонотеката" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Внасяне" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Нов списък с песни" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Неуспех при внасяне на списъка" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet може да внася само списъци с песни с формат M3U или PLS." #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "Неуспех при преименуване на списъка." #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Внасяне на списък с песни" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Нов списък с песни" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Въведете име за новата папка:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet не е стартиран." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "фонотека и програма за слушане на музика" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[опции]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Показване на изпълняващата се песен и излизане" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Започване на изпълнението незабавно" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Отиване на следващата песен" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Отиване на предишната песен" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Започване на изпълнението" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Паузиране на изпълнението" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Сменяне между Слушане и Пауза" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Започване на изпълнението" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Увеличаване силата на звука" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Намаляване силата на звука" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Показване статуса на изпълнението" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Скриване на главния прозорец" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Показване на главния прозорец" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Превключване видимостта на главния прозорец" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Фокусиране на програмата" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "_Изключване на разглеждането" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Печат на текущия списък с песни" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Показване съдържанието на опашката" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Показване съдържанието на опашката" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet не е стартиран." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Затваряне на Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Прескачане в слушаната в момента песен" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Промяна на реда на изпълнение" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Включване на повтарянето, изключване или превключването му." #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Настройване силата на звука" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Търсене из фонотеката" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "запитване" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Слушане на файл" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "файлово име" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Оценка на текущата песен" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Отваряне на нов браузър" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Показване или скриване на опашката" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Показване или скриване на главния изглед с песни" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Филтриране по произволна стойност" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "етикет" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "етикет=стойност" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Поставяне на файл или запитване на опашката" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "файлово име" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 #, fuzzy msgid "Unqueue a file or query" msgstr "Поставяне на файл или запитване на опашката" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Невалиден аргумент за \"%s\"." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Опитайте %s --help." #: ../quodlibet/devices/_base.py:63 #, fuzzy msgid "Unknown Device" msgstr "непознат" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: \"%s\" не е уникална представка." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Невалидна стойност" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "Показване на _обложките" #: ../quodlibet/devices/ipod.py:139 #, fuzzy msgid "Combine tags with _multiple values" msgstr "Разделяне на _множество стойности" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Заглавието включва _версията" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Неуспех при запазване на фонотеката" #: ../quodlibet/devices/ipod.py:313 #, fuzzy msgid "Unable to save iPod database" msgstr "Неуспех при запазване на фонотеката" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Файлово име" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[невалидна кодировка]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Заглавие" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Редактор на музикални етикети" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Етикети със регистър на заглавие" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Настройки на панели" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Общ размер:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Редактиране на показваното" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Тежест" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Редактиране на показваното" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "Пре_глед" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d секунда" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Лично" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Грешки на приставките" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Слушане на музика" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "_Радио по Интернет" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "местонахождение" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Скриване на главния прозорец" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Настройки" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Заглавие" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "Няма нови станции" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "Няма нови станции" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 msgid "_Service:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Име:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Други:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Артист" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Файлово име" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Произволен _албум" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "албуми" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Тежест" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Произволен _албум" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Внасяне на списък с песни" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Не се изпълнява нищо" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d песен" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "шаблон" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Колелото на мишката наглася силата на звука;\n" "Shift и колелото на мишката променят песента." #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Колелото на мишката сменя песента;\n" "Shift и колелото на мишката променят силата на звука." #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Колелото на ми_шката" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Показване на подсказка" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Не се изпълнява нищо" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "Настройки на иконата за статус" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Сп_исъци с песни" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Преслушване" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Пре_глед" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "Р_ед на прослушване" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "П_овтаряне" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Спиране след тази песен" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "Р_азглеждане на фонотеката" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Редактиране на _етикети" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Информация" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Текст на песен" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Текст на песен" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "Пре_глед" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Само този _артист" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Лично" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Само този _жанр" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Само този _артист" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "_Аудио емисии" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Въведете местоположението на аудио емисия:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Нов списък с песни" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_Опашка" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Никога" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "номер" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Преименуване" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Фонотека" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Скриване на главния прозорец" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Файлово име" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Не може да се запази песента" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Спис_ък с албуми" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Размер" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Търсене:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Търсене" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Спис_ък с албуми" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Редактиране на отметки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Редактиране на отметки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Отметки" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Файлово име" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Песен" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Заглавие" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Артист" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Няма открити приставки." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "и още %d..." msgstr[1] "и още %d..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "ID в MusicBrainz на албума" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "запитване" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Търсене" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "ID в MusicBrainz на албума" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Номерът на диска извън етикета за _албум" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Разглеждане" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Неуспех при създаването на папка" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Списък с песни" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Време" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "_Избор на всички" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, python-format msgid "%(title)s and %(count)d more…" msgid_plural "%(title)s and %(count)d more…" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Преименуване" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "файлово име" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Невалиден шаблон" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Невалидна стойност" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Лично" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "_Изключване на разглеждането" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Редактиране на показваното" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer неуспя да зареди избраната песен." #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Само този _жанр" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Опашка" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Показване на _грешки" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Запис" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "папка" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Спис_ък с албуми" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Запис" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Внасяне на списък с песни" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Преименуване" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Не може да се запази песента" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Няма открити приставки." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Текст на песен" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Текст на песен" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Преглед и редакция на етикетите на вървящата песен" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Сп_исъци с песни" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Неуспех при внасяне на списъка" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Пропадна изтриването на <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d песен" msgstr[1] "%d песни" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Редактиране на етикетите" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Редактиране на етикетите" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Всички албуми" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Търсене" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "шаблон" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Запазване на редактираните стойности..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Фонотека" #: ../quodlibet/library/libraries.py:657 #, fuzzy msgid "Checking mount points" msgstr "точка на монтиране" #: ../quodlibet/library/libraries.py:667 #, fuzzy msgid "Scanning library" msgstr "Запазване на фонотеката" #: ../quodlibet/library/libraries.py:722 #, fuzzy, python-format msgid "Scanning %s" msgstr "Проверяване на %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Показване на про_граматични етикети" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "описание" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Стойност" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Редактор на музикални етикети" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Няма избрани песни." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_Премахване на станция" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "_Премахване на станция" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Няма информация за времетраенето" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Неуспех при преименуване на файл." #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "_Премахване на станция" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Файл" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Няма открити станции." #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Неуспех при създаването на папка" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "П_риставки" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Поддържани формати: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Аудио устройство: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Начало" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "липсва" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Време" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Име на отметка" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "ММ:СС" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Отметки" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Филтри" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "Н_икога не е слушано" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Топ 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Нова станция" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Само този _жанр" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Само този _артист" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Само този _албум" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Произволен _жанр" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Произволен _артист" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Произволен _албум" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40те песни, които сте слушали най-много (може да са повече от 40, ако някой " "имат равен брой пускания)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Няма информация за времетраенето" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "С_тойност:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Запазени стойности" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Запазване на редактираните стойности..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Песни" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Показване на оставащото време" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Номера на песните" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Спис_ък с албуми" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Без нагласяне на силата на звука" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "непознат" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Файлове" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Изтриване на файлове" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "Преместване в _кошчето" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Преместване на %d/%d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Неуспех при запазване на фонотеката" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Изтриване на %d/%d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Неуспех при изтриването на файл" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "липсва от %d песен" msgstr[1] "липсва от %d песни" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "различно при %d песен" msgstr[1] "различно при %d песни" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "Разделяне на _множество стойности" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Номерът на диска извън етикета за _албум" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "_Версията извън етикета за заглавието" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "_Аранжиментът извън етикета за артист" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Из_пълнителят извън етикета за артист" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Из_пълнителят извън етикета за артист" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "_Версията извън етикета за заглавието" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Добавяне на етикет" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Етикет:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Неуспех при добавяне на етикет" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Неуспех при добавяне на песента" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Невалиден етикет" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Невалидна стойност" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "П_риставки" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Настройки на Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Раз_деляне на:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Редактиране на етикети" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Папки" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Нова папка" #: ../quodlibet/qltk/filesel.py:230 #, fuzzy msgid "_Select All Subfolders" msgstr "_Избор на всички" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Нова папка" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Въведете име за новата папка:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Неуспех при създаването на папка" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Неуспех при изтриването на папка" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Диск %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Песен номер %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Редактиране на показваното" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Няма избрани песни." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Няма песни" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Информация" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Текст на песен" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "артист" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "артисти" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "изпълнители" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Никога" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d път" msgstr[1] "%d пъти" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "добавенa" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "последно слушана" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "Прослушвания" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "пропускания" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "оценка" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "времетраене" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Информация" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[невалидна кодировка]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "размер на файла" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "променян" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d избрана" msgstr[1] "%d избрани" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Продуцирано от %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "изпълнител" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Песента е неналична" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Избор на дискография" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "албуми" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Общо времетраене:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Общ размер:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Файлове" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "Из_тегляне" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Няма открит текст за тази песен." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Търсене на текст на песента..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Неуспех при изтегляне на текстовете" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Отказване от промените?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Етикетите бяха променени, но не бяха запазени. Ще запазите промените или ще " "се откажете от тях?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Никога" #: ../quodlibet/qltk/msg.py:85 #, fuzzy msgid "File exists" msgstr "Ф_айлова система" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Преименуване на файлове" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet е стартиран" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "непознат" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Подред" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "П_одред" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "В разбъркан ред" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "П_роизволен ред" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Претеглен" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "Пре_теглен" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Една песен" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Една песен" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Грешки на приставките" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "_Изключване на разглеждането" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Няма открити приставки." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "П_риставки" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Показване на _грешки" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "Д_иск" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "Песен н_омер" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "групиране" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Алб_ум" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Файлово име" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Времетраене" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Списък на песните" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Автоматично прескачане до текущата песен" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Когато слушана песен се смени, автоматично да се селектира нея в списъка с " "песни" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Други:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Редактиране на показваното" #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Видими колони" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Заглавието включва _версията" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Името на файла вклю_чва папката" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Настройки" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Видими колони" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Разглеждане" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Глобален филтър:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Търсене" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Когато слушана песен се смени, автоматично да се селектира нея в списъка с " "песни" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "_Оценка" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Спис_ък с албуми" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Паузиране на изпълнението" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "Без нагласяне на силата на звука" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "Без нагласяне на силата на звука" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "_Оценка" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Запазване на оценките и броя на слушания" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Е-поща:" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "Оценките и броя на слушанията ще бъдат настроени за тази е-поща" #: ../quodlibet/qltk/prefs.py:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Отказване от промените?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Редактиране на етикетите" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Нова станция" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Проверка за промени във фонотеката Ви" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Пре_зареждане на фонотеката" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "" "Презареждане на всички песни от фонотеката ви (това може да отнеме много " "време)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "Сканиране на пап_ки" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Няма песни" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Информация" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Опашка" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Премахване на всички песни от опашката" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "Произв_олен" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Започване наново списъка с песни след приключване" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Паузиране на изпълнението" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Избор на папки" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Неуспех при добавяне на песните" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> използва неподдържан протокол." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Музика" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Добавяне на папка..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Добавяне на файл..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Добавяне на местоположение" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Отваряне на нов браузър" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Управление" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "П_рескачане към текущата песен" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Преглед" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "Помощ" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Спиране след тази песен" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Отметки" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Редактиране на отметки..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Търсене" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Списък с пес_ни" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Добавяне на местоположение" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Въведете местоположението на аудио файл:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Неуспех при добавяне на местоположението" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Добавяне на музика" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Наблюдение на папката за нови песни" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Оценка" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Премахване на станция" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Премахване на станция" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Заменяне на интервалите с долни черти" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Премахване на _несъвместимите с Windows символи" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Премахване на _диакритичните знаци" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Премахване на н_e-ASCII символите" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Преименуване на файлове" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "шаблон" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Запазване на редактираните стойности..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "Пре_глед" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Ново име" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Неуспех при преименуване на файл." #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "Показване на _грешки" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Продължаване" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Местоположението не е абсолютно" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "Песните поставени в тези папки ще бъдат добавяни към фонотеката" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "Избор на папки" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Запазени стойности" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Запазване на редактираните стойности..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Търсене" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Спиране след тази песен" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Ограничаване:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Тежест" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Само този %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Спис_ък с албуми" #: ../quodlibet/qltk/songlist.py:1072 #, fuzzy msgid "_Track Headers" msgstr "Номера на песните" #: ../quodlibet/qltk/songlist.py:1073 #, fuzzy msgid "_Album Headers" msgstr "Спис_ък с албуми" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1076 #, fuzzy msgid "_File Headers" msgstr "_Филтри" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Филтри" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Сп_исъци с песни" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Добавяне към _опашката" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "Премахване от фонотеката" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Замяна на _долните черти с интервали" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Етикети със регистър на заглавие" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Разделяне на _множество стойности" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Етикети от местоположението" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Етикетите заменят съществуващите" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Етикетите се добавят към съществуващите" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Невалидни етикети" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Редактиране на показваното" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Номера на песните" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Запо_чване от:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Общо песни:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Преслушване" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "Пре_глед" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "и още %d..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Запазване на песните, които сте променили." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Преместване на %d/%d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Списък с песни с името %s, вече съществува." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Ф_айлова система" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Показване на кратка информация за употреба" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Показване на версията на запазените права" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[опции]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Опцията \"%s\" не е разпозната." #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Опцията \"%s\" изисква аргумент." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: \"%s\" не е уникална представка." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунди" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d минута" msgstr[1] "%d минути" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d час" msgstr[1] "%d часа" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d ден" msgstr[1] "%d дни" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Заглавие" #: ../quodlibet/util/massagers.py:31 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Датата трябва да бъде въведета във един от следните формати: ГГГГ, ГГГГ-ММ-" "ДД или ГГГГ-ММ-ДД ЧЧ:ММ:СС." #: ../quodlibet/util/massagers.py:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Неуспех при редактиране на песента" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[невалидна кодировка]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "албум" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "аранжимент" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "аранжименти" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "аранжимент" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "автор" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "автори" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "композитор" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "композитори" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "композитор" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "диригент" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "диригенти" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "диригент" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "за контакт" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "авторски права" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "дата" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "описание" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "жанр" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "жанр" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "групиране" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "език" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "лиценз" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "местонахождение" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "текстописец" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "организация" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "заглавие" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "версия" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "интернет сайт" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "Артист на албума" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "диск" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "номер" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "каталожен номер" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "оригинална дата на издаване" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "оригинален албум" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "оригинален артист" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "дата на запис" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID в MusicBrainz на артиста" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz album status" msgstr "ID в MusicBrainz за артиста на албума" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz album type" msgstr "ID в MusicBrainz на албума" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 #, fuzzy msgid "track gain" msgstr "номер" #: ../quodlibet/util/tags.py:128 #, fuzzy msgid "track peak" msgstr "номер" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 #, fuzzy msgid "album gain" msgstr "албум" #: ../quodlibet/util/tags.py:131 #, fuzzy msgid "album peak" msgstr "албум" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Настройки" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "дискове" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "песни" #: ../quodlibet/util/tags.py:140 #, fuzzy msgid "last started" msgstr "последно слушана" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "пълно име" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "точка на монтиране" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "човека" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "година" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "оригинална дата на издаване" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Отметки" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "формат" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Сп_исъци с песни" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Неуспех при отваряне на файловете" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Невалидна стойност" #~ msgid "Clear search" #~ 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 "lyricists" #~ 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 "_Продължаване" #, fuzzy #~ 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 "" #~ "%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.5.3/po/ja.po����������������������������������������������������������������������������0000644�0001750�0001750�00000473753�12646427547�015354� 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: 2016-01-16 12:54+0100\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 "ミュージックプレイヤー" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "オーディオタグ・エディタ" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "ディレクトリ" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "タイトル" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "アーティスト(_A)" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "日付(_D)" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "ジャンル" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "レイティング(_R)" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "日付で並び換え" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "設定" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "アルバムリスト" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "アルバムリスト(_A)" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "全てのアルバム" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%dアルバム" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "アルバムのカバーを表示する(_c)" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "どのアルバムにも属さない曲" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%dトラック" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%dディスク" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "全てのアルバム" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "アルバムリストの設定" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "アルバムのカバーを表示する(_c)" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "場所" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "アルバムの表示" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "不正なパターン" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "不明" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "新規フィード" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "オーディオフィードの場所を入力してください:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "オーディオフィード" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "オーディオフィード(_A)" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "ダウンロード(_D)" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "ファイルのダウンロード" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "ファイルのダウンロード" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "フィードを追加できません" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "ファイルの削除" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "ライブラリブラウザ" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d曲(%(time)s)" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "不明" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "複数の値に分割(_M)" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "カスタム(_C)" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "タグ" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "アルバムリストの設定" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "ブラウザの無効化" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "ブラウザの無効化(_D)" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "ファイルシステム" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "ファイルシステム(_F)" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "曲のコピーができません" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "選択されたファイルのソングリストまたはキューへのコピーに失敗しました。" #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "ライブラリへ追加(_A)" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "サポートしていないファイル形式です" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "ラジオ局を追加できません" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "インターネットラジオ" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "ファイルのダウンロード" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "新規ラジオ局" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "インターネットラジオ(_I)" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "新規ラジオ局" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "新規ラジオ局(_N)" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "新規ラジオ局" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "ラジオ局が見つかりません" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%sにインターネットラジオ局が見つかりません。" #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "一覧にあるラジオ局は全てライブラリに登録されています。" #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "プレイリストへ追加(_A)" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "プレイリストから削除(_R)" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d局" #: ../quodlibet/browsers/media.py:34 #, fuzzy msgid "Device Properties" msgstr "プロパティ" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "デバイス:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "マウントされていません" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "マウントポイント" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "名前(_N)" #: ../quodlibet/browsers/media.py:133 #, fuzzy msgid "Media Devices" msgstr "オーディオデバイス: %s" #: ../quodlibet/browsers/media.py:134 #, fuzzy msgid "_Media Devices" msgstr "オーディオデバイス: %s" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 #, fuzzy msgid "_Eject" msgstr "イジェクト(_E)" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "プロパティ" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "名前の変更(_R)" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "使用中<b>%s</b>、利用可能<b>%s</b>" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "指定された場所 <b>%s</b> にアクセスできません。" #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%s</b>の削除失敗。" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 #, fuzzy msgid "Unable to copy song" msgstr "曲のコピーができません" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "この曲を保存するための空き領域が不足しています" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b>のコピーに失敗しました。" #: ../quodlibet/browsers/media.py:543 #, fuzzy msgid "Unable to delete songs" msgstr "曲を追加できません" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%s</b>の削除失敗。" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "指定された場所 <b>%s</b> にアクセスできません。" #: ../quodlibet/browsers/media.py:577 #, fuzzy msgid "Unable to delete song" msgstr "曲の編集に失敗しました" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b>のイジェクト失敗。" #: ../quodlibet/browsers/media.py:595 #, fuzzy msgid "Unable to eject device" msgstr "ファイルを削除できませんでした。" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "ペインブラウザ" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "ペインブラウザ(_P)" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "全て選択(_A)" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "全て" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "ペインブラウザの設定" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "プレイリスト" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "プレイリスト(_P)" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "プレイリストから削除(_R)" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "インポート(_I)" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "新規プレイリスト" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "プレイリストをインポートできません" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod LibetではM3UとPLS形式のプレイリストしかインポートできません。" #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "プレイリストの名前を変更できません" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "プレイリストのインポート" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "新規プレイリスト(_N)" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" #: ../quodlibet/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "フォルダ名を入力してください:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libetが起動していません。" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "ミュージックライブラリ/プレイヤー" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "場所" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "再生中の曲名を表示して終了" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "直ちに再生開始" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "次の曲へジャンプ" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "前の曲へジャンプ" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "再生開始" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "一時停止" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "再生/一時停止の切替" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "再生開始" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "音量を上げる" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "音量を下げる" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "プレイヤーの状態を表示" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "メインウィンドウを隠す" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "メインウィンドウを表示する" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "メインウィンドウの表示/非表示切り替え" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "起動中のプレイヤーにフォーカス" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "アクティブなフィルタを削除" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "ブラウザの無効化" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "現在のプレイリストを表示" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "キューの内容を表示" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "キューの内容を表示" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libetが起動していません。" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Quod Libetの終了" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "再生中の曲をシーク" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "再生順のセットまたは切替" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "リピートのオン/オフまたは切替" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "音量のセット" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "オーディオライブラリの検索" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "ファイルの再生" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "ファイル名" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "再生中の曲をレイティング" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "現在のブラウザをセット" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "新しいブラウザを開く" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "キューの表示/非表示" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "メインソングリストの表示/非表示" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "ランダムな値でフィルタリング" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "タグ" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "タグの値でフィルタリング" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "ファイルまたはクエリの内容をキューに入れる" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "ファイル名" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 #, fuzzy msgid "Unqueue a file or query" msgstr "ファイルまたはクエリの内容をキューから削除" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: 不正な引数'%s'が指定されました。" #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: %s --help を試してみてください。" #: ../quodlibet/devices/_base.py:63 #, fuzzy msgid "Unknown Device" msgstr "不明なデバイス" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s'はユニークなプリフィックスではありません。" #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "不正な値" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "初期化されていない iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "iPodに空のデータベースを新規作成しますか?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "ボリュームゲイン(dB)" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "アルバムのカバーを表示する(_c)" #: ../quodlibet/devices/ipod.py:139 #, fuzzy msgid "Combine tags with _multiple values" msgstr "複数の値に分割する(_v)" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "タイトルにバージョンを含める(_v)" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "アルバムにパートを含める(_p)" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "モデル" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "容量" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "ファームウェア" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "警告: 関連付けされていない iPod トラックを削除します" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "ライブラリの保存に失敗しました" #: ../quodlibet/devices/ipod.py:313 #, fuzzy msgid "Unable to save iPod database" msgstr "ライブラリの保存に失敗しました" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "ファイル名のパターン(_F)" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "使われていないカバーアートとディレクトリを削除(_R)" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainzトラックID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[不正なエンコーディング]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "タイトル" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "オーディオタグ・エディタ" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "タイトルの単語をキャピタライズする(_T)" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "ペインブラウザの設定" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "合計サイズ" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "ディスプレイの編集" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "ウェイト(_W)" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "ディスプレイの編集" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "プレビュー(_P)" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d秒" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "カスタム(_C)" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "プラグインのエラー" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "ミュージックプレイヤー" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "インターネットラジオ" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "場所" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "メインウィンドウを隠す" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "設定" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "タイトル" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "新しいラジオ局はありません" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "新しいラジオ局はありません" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "デバイス:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "名前(_N)" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "その他(_O)" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "アーティスト(_A)" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "ファイル名のパターン(_F)" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "アルバムでランダム選択(_b)" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "アルバム" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "ウェイト(_W)" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "アルバムでランダム選択(_b)" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "プレイリストのインポート" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "再生中の曲はありません" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d曲" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "パターン" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "ディスプレイの編集" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "再生中の曲はありません" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "プレイリスト(_P)" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "プレイヤー" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "プレビュー(_P)" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "再生順(_O)" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "繰り返し(_R)" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "この曲の後で停止" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "ライブラリの参照(_B)" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "タグの編集(_T)" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "情報(_I)" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "プレビュー(_P)" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "アーティストでフィルタリング(_A)" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "カスタム(_C)" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "ジャンルでフィルタリング(_G)" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "アーティストでフィルタリング(_A)" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "オーディオフィード" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "オーディオフィードの場所を入力してください:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "新規プレイリスト" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "キュー(_Q)" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "なし" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "トラックのピーク" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "名前の変更(_R)" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "ライブラリ" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "メインウィンドウを隠す" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "ファイル名" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "曲を保存できません" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "アルバムリスト" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "サイズ" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "検索" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "検索" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "アルバムリスト" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "ブックマークの編集(_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "ブックマークの編集(_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "ブックマーク" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "ファイル名" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "トラック" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "タイトル" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "アーティスト(_A)" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "プラグインが見つかりません" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "" #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz アルバム ID" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "キュー(_Q)" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "検索" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz アルバム ID" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "albumからdiscを分離(_A)" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "ブラウザ" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "フォルダを作成できません" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "トラックリスト" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "時間" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "全て選択(_A)" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, python-format msgid "%(title)s and %(count)d more…" msgid_plural "%(title)s and %(count)d more…" msgstr[0] "" #: ../quodlibet/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "名前の変更(_R)" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "不正なパターン" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "不正な値" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "カスタム(_C)" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "ブラウザの無効化" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "ディスプレイの編集" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "タグの値でフィルタリング" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamerが選択された曲のロードに失敗しました。" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "ジャンルでフィルタリング(_G)" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "キュー(_Q)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "エラー" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "書き込み" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainzトラックID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "ディレクトリ" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "アルバムヘッダ(_A)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "書き込み" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "プレイリストのインポート" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "名前の変更(_R)" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "曲を保存できません" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "プラグインが見つかりません" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "歌詞" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "歌詞" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "プレイリスト" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "プレイリストをインポートできません" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b>のイジェクト失敗。" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d曲" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "タグの編集" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "タグの編集" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "全てのアルバム" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "検索" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "パターン" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "保存されている値を編集..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "ライブラリ" #: ../quodlibet/library/libraries.py:657 #, fuzzy msgid "Checking mount points" msgstr "マウントポイントを確認中" #: ../quodlibet/library/libraries.py:667 #, fuzzy msgid "Scanning library" msgstr "ソングライブラリ読み込み中" #: ../quodlibet/library/libraries.py:722 #, fuzzy, python-format msgid "Scanning %s" msgstr "%sをチェックしています" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "プログラマチックタグの表示(_p)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "説明" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "値" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "オーディオタグ・エディタ" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "曲が選択されていません" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "タグの値でフィルタリング" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "タグの値でフィルタリング" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "時間情報なし" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "ファイル名を変更できません" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "ファイル" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "ラジオ局が見つかりません" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "フォルダを作成できません" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "プラグイン(_P)" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "サポートしているフォーマット: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "オーディオデバイス: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "曲の頭から再生" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "なし" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "時間" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "ブックマーク名" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "分:秒" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "ブックマーク" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "フィルタ(_F)" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "まだ1度も再生していない曲(_N)" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "上位40曲(_T)" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "新規ラジオ局" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "ジャンルでフィルタリング(_G)" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "アーティストでフィルタリング(_A)" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "アルバムでフィルタリング(_b)" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "ジャンルでランダム選択(_G)" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "アーティストでランダム選択(_A)" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "アルバムでランダム選択(_b)" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "再生回数の上位40曲(組になっているものがある場合40曲以上が選択される場合もあり" "ます)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "時間情報なし" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "値(_V)" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "保存された値" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "保存されている値を編集..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "曲" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "残り時間を表示" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "トラック番号ヘッダ(_T)" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "アルバムヘッダ(_A)" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "リプレイの度に音量調整をする(_R)" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "不明" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "タグの値でフィルタリング" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "ファイル" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:90 #, fuzzy msgid "_Delete Files" msgstr "ファイルの削除" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "ゴミ箱へ移動する(_M)" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%d/%d移動中。" #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "ライブラリの保存に失敗しました" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b>のイジェクト失敗。" #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%d/%d 削除中。" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "ファイルを削除できませんでした。" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "%d曲が欠落しています" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "%d曲の内容がそれぞれ異なっています" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "複数の値に分割(_M)" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "albumからdiscを分離(_A)" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "titleからversionを分離(_V)" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "artisitからarrangerを分離(_t)" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "artistからperformer を分離(_P)" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "artistからperformer を分離(_P)" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "titleからversionを分離(_V)" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "タグの追加" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "タグ(_T)" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "タグを追加できません" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "曲を追加できません" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "不正なタグ" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "不正な値" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "プラグイン(_P)" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falsoの設定" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "タグの分割に用いる文字(_o)" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "タグの編集" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "フォルダ" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "新規フォルダ" #: ../quodlibet/qltk/filesel.py:230 #, fuzzy msgid "_Select All Subfolders" msgstr "全て選択(_S)" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "新規フォルダ" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "フォルダ名を入力してください:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "フォルダを作成できません" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "フォルダを削除できません" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "ディスク %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "トラック %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "ディスプレイの編集" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "曲が選択されていません" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "曲がありません" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "情報" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "歌詞" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "アーティスト" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "アーティスト" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "演奏者" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "なし" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 回" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "登録日時" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "最終再生日時" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "再生回数" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "スキップ回数" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "レイティング" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "時間" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "情報" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[不正なエンコーディング]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "ビットレート" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "サイズ" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "修正日時" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d曲選択済み" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "プロデュース %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "演奏者" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "トラック情報が取得できません" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d曲にアルバム情報がありません" #: ../quodlibet/qltk/information.py:490 msgid "Selected Discography" msgstr "選択済みディスコグラフィ" #: ../quodlibet/qltk/information.py:543 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d曲にアーティスト情報がありません" #: ../quodlibet/qltk/information.py:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "アルバム" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "合計時間" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "合計サイズ" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "ファイル" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "ダウンロード(_D)" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "この曲の歌詞は見つかりませんでした。" #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "歌詞を検索中..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "歌詞のダウンロードに失敗しました。" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "タグの変更を破棄しますか?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "タグが変更されましたが、まだ保存されていません。保存しますか?それとも元に戻" "して変更を破棄しますか?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "なし" #: ../quodlibet/qltk/msg.py:85 #, fuzzy msgid "File exists" msgstr "同名のファイルが存在します" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "ファイル名の変更" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "不明" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "並び順" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "並び順(_I)" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "シャッフル" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "シャッフル(_S)" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "ウェイト順" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "ウェイト順(_W)" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "1曲だけ" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "1曲のみ(_O)" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "プラグインのエラー" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "ブラウザの無効化" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "プラグインが見つかりません" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "プラグイン(_P)" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "エラーの表示(_E)" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "ディスク(_D)" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "トラック(_T)" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "グループ" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "アルバム(_b)" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "ファイル名(_F)" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "時間(_L)" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "ソングリスト" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "再生中の曲へ自動的にジャンプする(_J)" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "再生する曲が変わったときにソングリストをスクロールさせます" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "その他(_O)" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "ディスプレイの編集(_E)" #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "表示するカラム" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "タイトルにバージョンを含める(_v)" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "ファイル名にフォルダ名を含める(_f)" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "設定" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "表示するカラム" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "ブラウザ" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "グローバルに適用するフィルタ(_G)" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "検索" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "再生する曲が変わったときにソングリストをスクロールさせます" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "レイティング(_R)" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "アルバムリスト" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "一時停止" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "ボリュームゲイン(dB)" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "ボリュームゲイン(dB)" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "リプレイの度に音量調整をする(_R)" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "リプレイの度に音量調整をする(_R)" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "レイティング(_R)" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "レイティングと再生回数を保存する" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "メールアドレス(_E)" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "レイティングと再生回数はこのメールアドレスにセットされます" #: ../quodlibet/qltk/prefs.py:547 #, fuzzy msgid "Auto-save tag changes" msgstr "タグの変更を破棄しますか?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "タグの編集" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "新規ラジオ局(_N)" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "ライブラリの変更内容をチェックします" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "ライブラリの再読込(_l)" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "ライブラリの再読込(この処理はやや時間がかかるかもしれません)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "スキャンするディレクトリ(_D)" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "曲がありません" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "プロパティ" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "キュー(_Q)" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "キューの曲をすべて削除" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "ランダム(_R)" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "終了したときにプレイリストをリスタートする" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "一時停止" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "ディレクトリの選択" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "曲を追加できません" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b>で使われているプロトコルをサポートしていません。" #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "ミュージック(_M)" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "フォルダの追加(_A)" #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "ファイルの追加(_A)" #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "場所の追加" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "新しいブラウザを開く" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "操作(_C)" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "再生中の曲にジャンプ(_J)" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "表示(_V)" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "ヘルプ(_H)" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "この曲の後で停止" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "ブックマーク" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "ブックマークの編集(_E)" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "検索" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "ソングリスト(_L)" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "場所の追加" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "オーディオファイルのある場所を入力してください:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "場所の追加ができません" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "指定された場所 <b>%s</b> にアクセスできません。" #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "ミュージックの追加" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "このフォルダの新しい曲をチェックする" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "レイティング(_R)" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "スペースをアンダースコアに置き換える(_u)" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Windowsと互換性のない文字を削除する(_W)" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "発音記号を削除する" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "非 ASCII 文字を削除する" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "ファイル名の変更" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "パターン" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "保存されている値を編集..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "プレビュー(_P)" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "新しい名前" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "ファイル名を変更できません" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "エラーの表示(_E)" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "続行する(_C)" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "パス名が絶対パスになっていません" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "入力されたフォルダをライブラリに追加します(複数入力するときは ':' で区切る)" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "ディレクトリの選択" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "保存された値" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "保存されている値を編集..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "検索" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "この曲の後で停止" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "検索結果の上限(_L)" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "ウェイト(_W)" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "%sでフィルタリング(_F)" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "アルバムヘッダ(_A)" #: ../quodlibet/qltk/songlist.py:1072 #, fuzzy msgid "_Track Headers" msgstr "トラック番号ヘッダ(_T)" #: ../quodlibet/qltk/songlist.py:1073 #, fuzzy msgid "_Album Headers" msgstr "アルバムヘッダ(_A)" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Peopleヘッダ" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Dateヘッダ" #: ../quodlibet/qltk/songlist.py:1076 #, fuzzy msgid "_File Headers" msgstr "_Fileヘッダ" #: ../quodlibet/qltk/songlist.py:1077 #, fuzzy msgid "_Production Headers" msgstr "_Productionヘッダ" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Customizeヘッダ" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "プレイリスト" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "キューへ追加(_Q)" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "デバイスへコピー(_C)" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "プレイリストから削除(_R)" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "アンダースコアをスペースに置き換える(_u)" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "タイトルの単語をキャピタライズする(_T)" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "複数の値に分割する(_v)" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "パス名からタグへの変換" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "既存のタグを置き換える" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "既存のタグに追加する" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "不正なタグ" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "ディスプレイの編集" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "トラック番号" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "開始番号(_m)" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "合計トラック数(_T)" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "プレイヤー" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "プレビュー(_P)" #: ../quodlibet/qltk/views.py:803 #, python-format msgid "and %d more…" msgstr "" #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "変更した曲を保存しています。" #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "%d/%d移動中。" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "プレイリスト%sは既に存在します。" #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "ファイルシステム" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "基本的な使い方を表示" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "バージョンと著作権情報を表示" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: オプション'%s'は認識できません。" #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: オプション'%s'には引数が必要です。" #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s'はユニークなプリフィックスではありません。" #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d秒" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d分" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d時間" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d日" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "タイトル" #: ../quodlibet/util/massagers.py:31 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:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "リプレイゲインは'x.yy dB'の形式で入力してください。" #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "リプレイゲインのピークは 'x.yy' の形式で入力してください。" #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainzリリースステータスは'official'、'promotional'、'bootleg'のいずれか" "でなくてはなりません。" #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "曲の編集に失敗しました" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[不正なエンコーディング]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "アルバム" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "アレンジャー" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "アレンジャー" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "アレンジャー" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "著作者" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "著作者" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "作曲者" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "作曲者" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "作曲者" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "指揮者" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "指揮者" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "指揮者" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "連絡先" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "著作権" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "日時" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "説明" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "ジャンル" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "ジャンル" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "グループ" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "言語" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "ライセンス" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "場所" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "作詞者" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "組織" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "タイトル" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "バージョン" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "ウェブサイト" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "アルバムアーティスト" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "ディスク" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "トラック" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "レーベルID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "オリジナルリリース日時" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "オリジナルアルバム" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "オリジナルアーティスト" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "録音日時" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBarainzアーティストID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz album status" msgstr "MusicBrainzアルバムアーティストID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz album type" msgstr "MusicBrainz アルバム ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "トラックのゲイン" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "トラックのピーク" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "アルバムのゲイン" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "アルバムのピーク" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "設定" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "ディスク" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "トラック" #: ../quodlibet/util/tags.py:140 #, fuzzy msgid "last started" msgstr "最終再生開始日時" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "フルネーム" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "マウントポイント" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "ピープル" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "年" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "オリジナルリリース日時" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "ブックマーク" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "フォーマット" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "プレイリスト" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "ファイルのオープンに失敗しました" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "不正な値" #~ msgid "Clear search" #~ 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 "lyricists" #~ 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)" #, fuzzy #~ msgid "Confirm rating" #~ 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 "フォルダの選択(_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.5.3/po/lv.po����������������������������������������������������������������������������0000644�0001750�0001750�00000474254�12646427550�015372� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "audio tagu redaktors" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "mape" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Nosaukums" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Mākslinieks" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Datums" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Žanrs" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Vērtējums" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "_Kārtot pēc:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Iestatījumi" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albumu saraksts" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albumu saraksts" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Visi albumi" #: ../quodlibet/browsers/albums/main.py:473 #, 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:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Dziesmas nav albumā" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, 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:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, 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:66 #, fuzzy msgid "An Example Album" msgstr "Visi albumi" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Albumu saraksta iestatījumi" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Rādīt albumu _vākus" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Iegultajā _meklēšanā tiek iekļauti cilvēki" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[opcijas]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Albuma attēlojums" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Nederīgs paraugs" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Nezināms" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Jauna barotne" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Ievadiet audio barotnes adresi:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio barotnes" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio barotnes" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "Lejupielā_dēt" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Lejupielādēt failus" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Lejupielādēt failu" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Neizdevās pievienot barotni" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "_Atsvaidzināt bibliotēku" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Dzēst failus" #: ../quodlibet/browsers/audiofeeds.py:501 #, fuzzy, python-format 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." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Bibliotēkas pārlūks" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Nezināms" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Sadalīt _vairākās vērtībās" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Pielāgots" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Vērtējums" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tags" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Albumu saraksta iestatījumi" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Atslēgt pārlūku" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "A_tslēgt pārlūku" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Failu sistēma" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Failu sistēma" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Neizdevās pārkopēt dziesmas" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "Pievienot bibliotēk_ai" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Neatbalstīts faila tips" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Neizdevās pievienot staciju" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Interneta radio" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Lejupielādēt failus" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Jauna stacija" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Interneta radio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Jauna stacija" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "Jau_na stacija" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Jauna stacija" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 #, fuzzy msgid "No Category" msgstr "Bez kategorijas" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nav atrasta neviena stacija" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Netika atrasta neviena interneta radiostacija ar adresi %s." #: ../quodlibet/browsers/iradio.py:820 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:837 #, fuzzy msgid "Add to Favorites" msgstr "Pievienot repertuār_am" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "Izņemt no _repertuāra" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Ierīces īpašības" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Ierīce:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Nav piemontēta" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Montēšanas punkts:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nosaukums:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Multivides ierīces" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Multivides ierīces" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "Izgrūz_t" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Īpašības" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "Pā_rdēvēt" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nav pievienots." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopē <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Neizdevās pārkopēt dziesmu" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Nav pietiekami daudz brīvas vietas šajai dziesmai." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nevarēja tikt pārkopēta." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Neizdevās izdzēst dziesmas" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Dzēš <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nevarēja tikt izdzēsta." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Neizdevās izdzēst dziesmu" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Neizdevās izgrūzt <b>%s</b>." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Neizdevās izgrūzt ierīci" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Sadalītais pārlūks" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "Sadalītais _pārlūks" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Iezīmēt visus" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Visi" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Sadalītā pārlūka iestatījumi" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Repertuāri" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "Re_pertuāri" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Izņemt no _repertuāra" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importēt" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Jauns repertuārs" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Neizdevās importēt repertuāru" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Neizdevās pārdēvēt repertuāru" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importēt repertuāru" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "Jau_ns repertuārs" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Ievadiet jaunās mapes nosaukumu:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nav palaists." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "mūzikas bibliotēka un atskaņotājs" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[opcijas]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Izdrukā pašreiz atskaņoto dziesmu un iziet" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Nekavējoties uzsāk atskaņošanu" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Pāriet uz nākamo dziesmu" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Pāriet uz iepriekšējo dziesmu" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Sākt atskaņošanu" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pauzēt atskaņošanu" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Pārslēgt atskaņošanas/pauzes režīmu" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Sākt atskaņošanu" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Palielināt skaļumu" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Samazināt skaļumu" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Izdrukāt atskaņotāja statusu" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Slēpt galveno logu" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Rādīt galveno logu" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Pārslēgt galvenā loga redzamību" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Fokusēties uz darbojošos atskaņotāju" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Noņemt aktīvos pārlūka filtrus" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Atsvaidzināt un pārskenēt bibliotēku" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Atslēgt pārlūku" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Izdrukāt pašreizējo repertuāru" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Izdrukāt rindas saturu" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Izdrukāt rindas saturu" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nav palaists." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Iziet no Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Meklēt pašreizējā dziesmā" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Iestatīt vai pārslēgt atskaņošanas kārtību" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Izslēgt, ieslēgt vai pārslēgt atkārtošanu" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Iestatīt skaļumu" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Meklēt jūsu audio bibliotēkā" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "vaicājums" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Atskaņot failu" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "faila nosaukums" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Novērtēt pašreiz atskaņoto dziesmu" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Iestatīt pašreizējo pārlūku" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Atvērt jaunu pārlūku" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Rādīt vai slēpt rindu" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Rādīt vai slēpt galveno dziesmu sarakstu" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtrēt pēc nejaušas vērtības" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tags" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tags=vērtība" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Ierindot failu vai vaicājumu" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "faila nosaukums" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Atrindot failu vai vaicājumu" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Nederīgs arguments priekš '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Mēģiniet %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Nezināma ierīce" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r nav atbalstīta ierīce." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: neizdevās atrast media-player-info." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Inicializē ierīces aizmuguri." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Mēģina '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Ierīces aizmugure inicializēta." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Neinicializēts iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Vai vēlaties izveidot tukšu datubāzi uz šī iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "S_kaļuma pastiprinājums (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopēt _albumu vākus" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Ko_mbinēt tagus ar vairākām vērtībām" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Nosaukums iekļauj _versiju" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Albums iekļauj _diska apakšnosaukumu" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modelis:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Ietilpība:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Programmatūra:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Dzēš nevajadzīgu iPod celiņu" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Neizdevās saglabāt iPod datubāzi" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Neizdevās saglabāt iPod datubāzi" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Neizdevās importēt python-gpod, iPod atbalsts tiks atslēgts." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Faila nosaukuma paraugs:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Dzēst nevajadzīgos vākus un mapes" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz celiņa ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Nederīgs kodējums]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Nosaukums" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio tagu redaktors" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Tagu reģistrs ir tāds pats, kā nosaukuma reģistrs" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Sadalītā pārlūka iestatījumi" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Kopējais izmērs:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "S_vars" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Izvades līnija:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Priekšskats" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d sekunde" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Pielāgots" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Notīrīt kļūdas" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Mūzikas atskaņotājs" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Interneta radio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "vieta" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Slēpt galveno logu" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Iestatījumi" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Nosaukums" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Ierīce:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nosaukums:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "C_iti:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Mākslinieks" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Faila nosaukuma paraugs:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Nejaušs al_bums" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albumi" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "S_vars" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Nejaušs al_bums" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importēt repertuāru" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Pašreiz neatskaņo" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d dziesma" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "paraugs" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Pašreiz neatskaņo" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Re_pertuāri" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Atskaņotājs" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Priekšskats" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Kārtība" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Atkārtot" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Apstāties pēc šīs dziesmas" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "Pārlūkot _bibliotēku" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Rediģēt _tagus" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informācija" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Priekšskats" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrēt pēc māksliniek_a" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Pielāgots" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrēt pēc žanra" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrēt pēc māksliniek_a" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio barotnes" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Ievadiet audio barotnes adresi:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Jauns repertuārs" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Ierindots" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nekad" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "celiņa maksimums" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "Pā_rdēvēt" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Bibliotēka" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Slēpt galveno logu" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Faila nosaukums" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Neizdevās saglabāt dziesmu" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Albumu saraksts" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Izmērs" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Meklēt:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Meklēt" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Albumu saraksts" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "R_ediģēt grāmatzīmes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "R_ediģēt grāmatzīmes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Grāmatzīmes" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Faila nosaukums" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Celiņš" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Nosaukums" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Izpildītājs" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nav atrasts neviens spraudnis." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format 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..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz albuma tips" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "vaicājums" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Meklēt" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz albuma tips" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Izdalīt disku no _albuma" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Pārlūki" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Neizdevās izveidot mapi" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Celiņu saraksts" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Laiks" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Iezīmēt visus" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "tags" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "Pā_rdēvēt" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "tags" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Nederīgs paraugs" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Nederīga vērtība" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Pielāgots" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Atslēgt pārlūku" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "_Vērtējums" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Vērtējums" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "_Vērtējums" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrēt pēc žanra" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Ierindots" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Kļūdas" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Rakstīt" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz celiņa ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "mape" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Albumu galvenes" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Rakstīt" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importēt repertuāru" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Kļūda ielādējot %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "Pā_rdēvēt" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Neizdevās saglabāt dziesmu" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nav atrasts neviens spraudnis." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Repertuāri" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Neizdevās importēt repertuāru" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "_Atsvaidzināt bibliotēku" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d dziesma" msgstr[1] "%d dziesmas" msgstr[2] "%d dziesmu" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "_Atsvaidzināt bibliotēku" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Rediģēt tagus" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Rediģēt tagus" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Visi albumi" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Meklēt" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "paraugs" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Rediģēt saglabātās vērtības..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Bibliotēka" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Pārbauda montēšanas punktus" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Skenē bibliotēku" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Skenē %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Rādīt programmatūras _tagus" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Par daudz kļūdu" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "apraksts" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Vērtība" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio tagu redaktors" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nav izvēlēta neviena dziesma." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Nav ilguma informācijas" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Neizdevās pārdēvēt failu" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Fails" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nav atrasta neviena stacija" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Nederīga GStreamer izvades līnija, mēģina noklusēto." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Neizdevās izveidot audio izvadi" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "S_praudņi" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Atbalstītie formāti: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Audio ierīce: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Sākums" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/P" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Laiks" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Grāmatzīmes nosaukums" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Grāmatzīmes" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtri" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Nekad nav atskaņots" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "Augšējās _40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Jauna stacija" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrēt pēc žanra" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrēt pēc māksliniek_a" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrēt pēc al_buma" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Nejauš_s žanrs" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Nej_aušs mākslinieks" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Nejaušs al_bums" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Nav ilguma informācijas" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Vērtība:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Saglabātās vērtības" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Rediģēt saglabātās vērtības..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Dziesmas" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Rādīt atlikušo laiku" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Celiņu galvenes" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Albumu galvenes" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Replay Gain skaļuma regulācija" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Nezināms" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Gadījās kļūda" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Faili" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Dzēst failus" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "Pārvietot uz _miskasti" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Pārvieto %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Neizdevās saglabāt iPod datubāzi" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Neizdevās izgrūzt <b>%s</b>." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Dzēš %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Neizdevās izdzēst failu" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Sadalīt _vairākās vērtībās" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Izdalīt disku no _albuma" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Izdalīt _versiju no nosaukuma" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Izdalīt aranžētāju no izpildī_tāja" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Izdalīt iz_pildītāju no mākslinieka" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Izdalīt iz_pildītāju no mākslinieka" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Izdalīt _versiju no nosaukuma" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Pievienot tagu" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tags:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Neizdevās pievienot tagu" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Neizdevās pievienot dziesmu" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Nederīgs tags" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Nederīga vērtība" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "S_praudņi" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso iestatījumi" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Sadalīt _pie:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Tagu rediģēšana" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Mapes" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Jauna mape" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "Izvēlēties vi_sas apakšmapes" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Jauna mape" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Ievadiet jaunās mapes nosaukumu:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Neizdevās izveidot mapi" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Neizdevās izdzēst mapi" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "no %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "%s. disks" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "%s. celiņš" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Rediģēt rādāmo" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nav izvēlēta neviena dziesma." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Nav dziesmu" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informācija" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Dziesmas vārdi" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "mākslinieks" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "mākslinieki" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "izpildītāji" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nekad" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "pievienots" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "Pēdējo reizi atskaņots" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "atskaņojumi" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "izlaidumi" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "vērtējums" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "ilgums" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informācija" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Nederīgs kodējums]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitātrums" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "faila izmērs" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "mainīts" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Producējis %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "izpildītājs" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Celiņš nav pieejams" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Izvēlētā diskogrāfija" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albumi" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Kopējais ilgums:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Kopējais izmērs:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Faili" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "Lejupielā_dēt" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Šajai dziesmai vārdi netika atrasti." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Meklē dziesmas vārdus..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Neizdevās lejupielādēt dziesmas vārdus." #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Izmest tagu izmaiņas?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nekad" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Fails pastāv" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Pārdēvēt failus" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Nezināms" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Pēc kārtības" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "Pē_c kārtības" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Sajaukt" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Sajaukt" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Svērti" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "S_vērti" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Viena dziesma" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "V_iena dziesma" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Spraudņu kļūdas" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Ieslēgts" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Izslēgts" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Bez kategorijas" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nav atrasts neviens spraudnis." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "S_praudņi" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Rādīt _kļūdas" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disks" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Celiņš" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "grupēšana" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bums" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Faila nosaukums" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Ilgums" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Dziesmu saraksts" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Pārlēkt uz atskaņoto dziesmu automātiski" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "C_iti:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "R_ediģēt rādāmo..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Redzamās kolonnas" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Iegultajā _meklēšanā tiek iekļauti cilvēki" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "_Faila nosaukums iekļauj mapi" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Iestatījumi" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Redzamās kolonnas" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Pārlūki" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globālais filtrs:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Meklēt" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Apstiprināt vairākus vērtēju_mus" #: ../quodlibet/qltk/prefs.py:256 #, 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:259 msgid "Enable _one-click ratings" msgstr "Ieslēgt viena klikšķa vērtējumus" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Vērtējumi" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "Izmantot noapaļot_us stūrus sīktēliem" #: ../quodlibet/qltk/prefs.py:274 #, 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ā." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Albumu saraksts" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Pauzēt atskaņošanu" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Izvades žurnāls" #: ../quodlibet/qltk/prefs.py:344 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:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Atkāpšanās pastiprinājums (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Priekšpastiprinājuma pastiprinājums (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "I_eslēgt Replay Gain skaļuma regulāciju" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Replay Gain skaļuma regulācija" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Vērtējumi" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Saglabāt vērtējumus un _atskaņošanu skaitu" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_E-pasts:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Izmest tagu izmaiņas?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Rediģēt tagus" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "Jau_na stacija" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "A_tsvaidzināt bibliotēku, palaižot programmu" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Atsvaidzināt bibliotēku" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Pārbaudīt izmaiņas jūsu bibliotēkā" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Pār_lādēt bibliotēku" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Skenēt _mapes" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Nav dziesmu" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Īpašības" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Rinda" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Izņemt no rindas visas dziesmas" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Nejauši" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Pārstartēt repertuāru, kad pabeigts" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Pauzēt atskaņošanu" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Izvēlieties mapes" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Neizdevās pievienot dziesmas" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> izmanto neatbalstītu protokolu." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Mūzika" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Pievienot mapi..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "Pievienot _failu..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Pievienot vietu" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Atvērt jaunu pārlūku" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Vadība" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Pārlēkt uz atskaņoto dziesmu" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Skats" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Palīdzība" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Apstāties pēc šīs dziesmas" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Grāmatzīmes" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "R_ediģēt grāmatzīmes..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Meklēt" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Dziesmu saraksts" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Pievienot vietu" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Ievadiet audio faila atrašanās vietu:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Neizdevās pievienot vietu" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nav derīga vieta." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Pievienot mūziku" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Vērot šo mapi" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Vērtējums" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Vērtējums" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Vērtējums" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Aizvietot atstarpes ar pa_svītrām" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Izņemt ar Windows nesavietojamas rakstzīmes" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Izņemt _diakritiskās zīmes" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Izņemt ne-ASCII rakstzīmes" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Pārdēvēt failus" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "paraugs" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Rediģēt saglabātās vērtības..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Priekšskats" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Jauns nosaukums" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Neizdevās pārdēvēt failu" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Ignorēt vis_as kļūdas" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Turpināt" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Ceļš nav absolūts" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Izvēlieties mapes" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Saglabātās vērtības" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Rediģēt saglabātās vērtības..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Meklēt" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Meklēt pēc ieraks_tīšanas" #: ../quodlibet/qltk/searchbar.py:122 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:177 msgid "_Limit:" msgstr "_Limits:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "S_vars" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrēt pēc %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Albumu galvenes" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Celiņu galvenes" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Albumu galvenes" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "C_ilvēku galvenes" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Datumu galvenes" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Failu galvenes" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Producēšanas galvenes" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "Pielāg_ot galvenes..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Repertuāri" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Pie_vienot rindai" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "Kopēt uz ierī_ci" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "Izņemt no _repertuāra" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Aizvietot pasvīt_ras ar atstarpēm" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Tagu reģistrs ir tāds pats, kā nosaukuma reģistrs" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Sadalīt _vairākās vērtībās" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tagi no ceļa" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Tagi aizvieto pastāvošos tagus" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tagi tiek pievienoti pastāvošajiem tagiem" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Nederīgi tagi" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Rediģēt rādāmo" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Celiņu numuri" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Sākt _no:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Celiņi kopā:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Atskaņotājs" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Priekšskats" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "un vēl %d..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Saglabā jūsu izmainītās dziesmas." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Pārvieto %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Repertuārs ar nosaukumu %s jau pastāv." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Failu sistēma" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "B: " #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "B: " #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E: " #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Parādīt īsu lietošanas informāciju" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Parādīt versiju un autortiesības" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opcijas]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Opcija %r nav atpazīta." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Opcijai %r nepieciešams arguments." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r nav unikāls prefikss." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:379 #, 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:380 #, 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:381 #, 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:382 #, 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:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "nē" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Neizdevās rediģēt dziesmu" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Nederīgs kodējums]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "albums" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "aranžētājs" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "aranžētāji" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "aranžētājs" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autors" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "komponists" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "komponisti" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "komponists" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "diriģents" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "diriģenti" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "diriģents" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontakts" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "autortiesības" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "datums" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "apraksts" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "žanrs" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "žanrs" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "grupēšana" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "valoda" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "vieta" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "dziesmu vārdu autors" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organizācija" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "nosaukums" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versija" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "tīmekļa vietne" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "albuma mākslinieks" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "sit./min." #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "diska apakšnosaukums" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disks" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "celiņš" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "izdevēja ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "oriģinālais izlaiduma datums" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "oriģinālais albums" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "oriģinālais mākslinieks" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "ierakstīšanas datums" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz celiņa ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz izlaiduma ID" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "MusicBrainz izlaiduma ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz mākslinieka ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz izlaiduma ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz albuma statuss" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz albuma tips" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "celiņa pastiprinājums" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "celiņa maksimums" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "albuma pastiprinājums" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "albuma maksimums" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Iestatījumi" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "diski" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "celiņi" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "pēdējo reizi sākts" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "pilns vārds" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "montēšanas punkts" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "cilvēki" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "gads" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "oriģinālais izlaiduma datums" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "grāmatzīme" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "Nav ilguma informācijas" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Repertuāri" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Notīrīt meklējumu lauku" #~ 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 "lyricists" #~ msgstr "vārdu autori" #~ 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.5.3/po/fr.po����������������������������������������������������������������������������0000644�0001750�0001750�00000502141�12646427550�015343� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# translation of fr.po to Français # Olivier Gambier <dev@viapanda.com>, 2006. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-16 12:54+0100\n" "PO-Revision-Date: 2013-07-20 22:32+0100\n" "Last-Translator: Nick Boultbee <nick.boultbee@googlemail.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: 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 "Éditer les etiquettes 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 "" #: ../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 "É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 "Ecouter, 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 "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Lecteur" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "un éditeur d'étiquettes (tags) audio" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "répertoire" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Titre" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artiste" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Date" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Notation" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "_Trier par..." #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Préférences" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Liste des albums" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Liste des _albums" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Tous les albums" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:640 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Recharger la _jaquettes de l'album" msgstr[1] "Recharger les _jaquettes des albums" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Chansons pas dans un album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d piste" msgstr[1] "%d pistes" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disque" msgstr[1] "%d disques" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Tous les albums" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Préférences de l'affichage liste d'albums" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Montrer les _jaquettes des albums" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Inclure les personnes dans la _recherche" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[options]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Affichage des albums" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Motif invalide" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Inconnu(e)" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nouveau flux" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Saisissez l'adresse d'un flux audio." #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Flux audio" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Flux audio" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Télécharger" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Télécharger les fichiers" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Télécharger le fichier" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Impossible d'importer le flux" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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'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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Rafraîchir la bibliothèque" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Supprimer les fichiers" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "Impossible d importer %s. Désactivation de navigateur de flux audio." #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Navigateur de bibliothèque" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d chanson (%(time)s)" msgstr[1] "%(count)d chansons (%(time)s)" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Inconnu(e)" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Séparer en _plusieurs valeurs" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Autre" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Supprimer les doublons" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Étiquette" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Préférences de l'affichage liste d'albums" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Désactiver le navigateur" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Désactiver le navigateur" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Système de fichiers" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Système de fichiers" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Impossible de copier les chansons" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Les fichiers selectionnés ne peuvent pas être copiés vers une autre liste de " "chanson ou la file." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "A_jouter à la bibliothèque" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Type de fichier non supporté" #: ../quodlibet/browsers/iradio.py:171 #, 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 seulement des emplacements de radio, " "pas d'autres listes de radio ou des listes de lecture. Il est impossible de " "charger ces emplacements:\n" "%s" #: ../quodlibet/browsers/iradio.py:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Impossible d'ajouter la radio" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Radio Internet" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Télécharger les fichiers" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nouvelle radio Internet" #: ../quodlibet/browsers/iradio.py:336 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 "" #: ../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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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 "_Nouvelle radio internet" #: ../quodlibet/browsers/iradio.py:483 msgid "_Internet Radio" msgstr "_Radio Internet" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nouvelle radio Internet" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Nouvelle radio internet" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Nouvelle radio Internet" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Favoris" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Aucune catégorie" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Aucune radio trouvée." #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Aucune radio ne correspond à %s." #: ../quodlibet/browsers/iradio.py:820 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:837 msgid "Add to Favorites" msgstr "_Ajouter à la liste des favoris" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Supprimer des Favoris" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Propriétés du périphérique" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Périphérique :" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Pas monté" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Point de montage :" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nom :" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Périphériques multimedia" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "Périphériques _multimedia" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Éjecter" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Propriétés" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "Re_nommer" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> utilisé(s), <b>%s</b> disponible(s)" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> n'est pas connecté." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copie de <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Impossible de copier la chanson" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Il n'y a pas assez de place pour cette chanson" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> n'a pas pu être copié." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Impossible de supprimer les chansons" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Suppression de <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> ne peut pas être supprimé." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Impossible de supprimer la chanson" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "L'éjection de <b>%s</b> a échoué." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Impossible d'éjecter le périphérique" #: ../quodlibet/browsers/media.py:601 #, fuzzy msgid "No device backend, Media Devices browser disabled." msgstr "" "Impossible de se connecter à un gestionnaire de périphérique, désactivation " "du navigateur de Périphériques Multimédias." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Navigateur à panneaux" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "Navigateur à _panneaux" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Choisir _tous" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Tous" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Préférences du navigateur à panneaux" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Listes de lecture" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Listes de lecture" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Supp_rimer de la liste de lecture" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importer" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Créer une liste de lecture" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Impossible d'importer la liste de lecture" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Impossible de renommer la liste de lecture" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importer une liste de lecture" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Créer une liste de lecture..." #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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] "" "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?" #: ../quodlibet/browsers/playlists/menu.py:87 #, fuzzy, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Confirmez la suppression de la liste de lecture" #: ../quodlibet/browsers/playlists/util.py:31 #, fuzzy, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" "Vous êtes sur le point de supprimer la liste de lecture '<i>%s</i>'.\n" "Voulez-vous continuer?" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 msgid "Enter a name for the new playlist:" msgstr "Saisissez un nom pour la nouvelle liste de lecture:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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 chansons ajoutées." #: ../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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet n'est pas en fonctionnement." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "un lecteur et une bibliothèque de musique" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[option]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Afficher la chanson en cours de lecture et quitter" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Commencer la lecture immédiatement" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Aller à la chanson suivante" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "Aller à la chanson précédente ou recommencer si près du début" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Aller à la chanson précédente" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Commencer la lecture" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Suspendre la lecture" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Basculer entre le mode lecture et pause" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Commencer la lecture" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Augmenter le volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Diminuer le volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Afficher l'état du lecteur" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Cacher la fenêtre principale" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Afficher la fenêtre principale" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Basculer la visibilité de la fenêtre principale" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Focaliser le lecteur en fonction" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Enlever les filtres actifs du navigateur" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Rafraîchir la bibliothèque" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Désactiver le navigateur" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Imprimer la liste de lecture" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Montrer le contenu de la file " #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Montrer le contenu de la file " #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Démarrer sans greffons" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet n'est pas en fonctionnement." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Quitter Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Se déplacer dans la chanson en cours de lecture" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Définir ou basculer d'un ordre de lecture à un autre" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Activer, désactiver ou basculer le mode répétition" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Régler le volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Rechercher dans votre bibliothèque de musique" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "recherche" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Lire un fichier" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "nom de fichier" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Noter la chanson en cours de lecture" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Définir le navigateur courant" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Démarrer un nouveau navigateur" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Montrer ou cacher la file" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Montrer ou cacher la liste principale des chansons" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtrer au hasard" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Étiquette" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrer sur la valeur d'une étiquette" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "étiquette=valeur" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Mettre un fichier ou le résultat d'une recherche dans la file" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nom de fichier" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Enlever un fichier ou le résultat d'une recherche de la file" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argument non valide pour '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Essayez %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Périphérique inconnu" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' n'est pas un préfixe unique." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Impossible de trouver %s." #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Valeur non valide" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Tentative avec '%s'" #: ../quodlibet/devices/__init__.py:617 #, fuzzy msgid "Couldn't connect to a device backend." msgstr "" "Impossible de se connecter à un gestionnaire de périphérique, désactivation " "du navigateur de Périphériques Multimédias." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Gestionnaire de périphériques initialisé." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod non initialisé" #: ../quodlibet/devices/ipod.py:34 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 ?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Gain du _volume (dB) :" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copier les jaquettes des _albums" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combiner les tags à valeurs _multiples" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Le titre contient la _version" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "L'album contient la sous-titre du _disque" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modèle :" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacité :" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware :" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "W: suppression d'une piste orpheline de l'iPod" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Impossible d'enregistrer la base de données de l'iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Impossible d'enregistrer la base de données de l'iPod" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Impossible d importer %s. Désactivation de navigateur de flux audio." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Motif du nom de _fichier" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Enleve_r les jaquettes et les dossiers inutilisés" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "Identifiant MusicBrainz - piste " #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Codage invalide]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "_Titre" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Éditeur d'étiquettes audio (tags)" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Mettre une _majuscule aux valeurs résultantes" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Préférences du navigateur à panneaux" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Taille totale :" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Éditer l'affiche des informations" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Pondéré" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "Pipeline de s_ortie" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Éditer l'affiche des informations" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "A_perçu" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matique" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matique" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%.1f secondes" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Autre" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Nettoyer les erreurs" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Lecteur" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Radio Internet" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "endroit" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Cacher la fenêtre principale" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Préférences" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "_Titre" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "" "Impossible de se connecter à un gestionnaire de périphérique, désactivation " "du navigateur de Périphériques Multimédias." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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 "" "Impossible de se connecter à un gestionnaire de périphérique, désactivation " "du navigateur de Périphériques Multimédias." #: ../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:461 #, fuzzy msgid "_Service:" msgstr "Périphérique :" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nom :" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "Au_tres :" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artiste" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Motif du nom de _fichier" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Al_bum aléatoire" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albums" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Pondéré" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Al_bum aléatoire" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importer une liste de lecture" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importer" #: ../quodlibet/ext/events/screensaver.py:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Pas de lecture en cours" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d chanson" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "motif" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Éditer l'affiche des informations" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Pas de lecture en cours" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Listes de lecture" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Lecteur" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "A_perçu" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Ordre :" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Répéter" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Arrêter après cette chanson" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Parcourir la bibliothèque" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Éditer les éti_quettes" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Paroles" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Paroles" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Fichiers" #: ../quodlibet/ext/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "A_perçu" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrer sur cet _artiste" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Autre" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrer sur ce _genre" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrer sur cet _artiste" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Flux audio" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Saisissez l'adresse d'un flux audio." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Supprimer les doublons" #: ../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] "Vous allez supprimer %d chanson." msgstr[1] "Vous allez supprimer %d chanson." #: ../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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Créer une liste de lecture" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_File de chansons" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Jamais" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "pic de la piste" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "" "Impossible de se connecter à un gestionnaire de périphérique, désactivation " "du navigateur de Périphériques Multimédias." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "Re_nommer" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Bibliothèque" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Cacher la fenêtre principale" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Nom de fichier" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Impossible de sauvegarder la chanson" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Jaquettes d'Album" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Taille" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Rechercher :" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Rechercher" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Jaquettes d'Album" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Modifier les signets" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Modifier les signets" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Signets" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nom de fichier" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Piste" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "_Titre" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artiste" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Pas de greffon trouvé." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "et %d de plus..." msgstr[1] "et %d de plus..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Type MusicBrainz de l'album" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "recherche" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Rechercher" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Type MusicBrainz de l'album" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Séparer le disque de l'_album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Navigateurs" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Impossible de créer le dossier" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Liste de pistes" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Temps" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Choisir _tous" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "etiquette" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "Re_nommer" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "etiquette" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Motif invalide" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Valeur non valide" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Autre" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Impossible de copier les chansons" #: ../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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Désactiver le navigateur" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Supprimer les doublons" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Supprimer les doublons" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Supprimer les doublons" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "Supprimer les doublons" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Éditer l'affiche des informations" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Supprimer les doublons" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Supprimer les doublons" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Supprimer les doublons" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrer sur la valeur d'une étiquette" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrer sur ce _genre" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_File de chansons" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Erreurs" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Écrire" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "Identifiant MusicBrainz - piste " #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "répertoire" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Colonnes « _Album »" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Écrire" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importer une liste de lecture" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Erreur au chargement de %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "Re_nommer" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Impossible de sauvegarder la chanson" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Pas de greffon trouvé." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Paroles" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Paroles" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Listes de lecture" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Impossible d'importer la liste de lecture" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "L'éjection de <b>%s</b> a échoué." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Rafraîchir la bibliothèque" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d chanson" msgstr[1] "%d chansons" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Rafraîchir la bibliothèque" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Éditer les étiquettes" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Éditer les étiquettes" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Tous les albums" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Rechercher" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "motif" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Editer les recherches sauvegardées..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, fuzzy msgid "Configure searches…" msgstr "Colorer les terme_s de recherche" #: ../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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Bibliothèque" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Vérification des points de montage" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Parcours de la bibliothèque" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Parcours de %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Montrer les commentaires de _programmation" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Trop d'erreurs" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "description" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Valeur" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Éditeur d'étiquettes audio (tags)" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Aucune chanson n'est sélectionnée." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "Supprimer les doublons" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Supprimer les doublons" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtrer sur la valeur d'une étiquette" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtrer sur la valeur d'une étiquette" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Aucun renseignement de durée" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Impossible de renommer le fichier" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Supprimer les doublons" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Fichier" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, fuzzy msgid "Display help information" msgstr "Afficher des informations d'utilisation succinctes " #: ../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'est pas un chemin valide." #: ../quodlibet/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, fuzzy, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Le canal de sortie n'a pas pu être initialisée." #: ../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 "" #: ../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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Aucune radio trouvée." #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Canal de sortie GStreamer invalide, utilisation du canal pardéfaut." #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Impossible de créer le dossier" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Greffons" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Formats supportés : %s" #: ../quodlibet/qltk/about.py:59 #, 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:25 msgid "Beginning" msgstr "Début de la piste" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "Non disponible" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Temps" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nom du signet" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Signets" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtres" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "Récemment _Jouées" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Récemment _Ajoutées" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Nouvelle radio Internet" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrer sur ce _genre" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrer sur cet _artiste" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrer sur cet al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "_Genre aléatoire" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "_Artiste aléatoire" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Al_bum aléatoire" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Les 40 chansons que vous avez le plus jouées (plus de 40 peuvent être " "choisies en cas d'égalité)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Aucun renseignement de durée" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Valeur :" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Entrées sauvegardées" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Éditer les entrées sauvegardées..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Chansons" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Montrer la durée restante" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_matique" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Colonnes « _Piste »" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Colonnes « _Album »" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajustement du volume par Replay Gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Inconnu(e)" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrer sur la valeur d'une étiquette" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Une erreur est survenue" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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é " "sauvé dans <b>%s</b>, il nous aidera à trouver la cause du problème. " "Veuillez remplir un rapport de bug à http://code.google.com/p/quodlibet/" "issues/list et attachez-y ce fichier ou son contenu. Ce fichier peut " "contenir certaines informations vous identifiant, telles qu'une liste de " "chansons récemment écoutées. Si ceci est inacceptable, envoyez à la place <b>" "%s</b> accompagné d'une description de ce que vous faisiez au moment où ce " "message est apparu.\n" "\n" "Quod Libet est maintenant peut-être instable. Il est recommandé de fermer et " "redémarrer l'application. Votre librairie va être sauvegardée." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Fichiers" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Supprimer les fichiers" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mettre à la corbeille" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Déplacement de %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Impossible d'enregistrer la base de données de l'iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "L'éjection de <b>%s</b> a échoué." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Suppression de %(current)d/%(total)d" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Impossible de supprimer le fichier" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, fuzzy msgid "Deleting one or more files failed." msgstr "La suppression de <b>%s</b> a échoué." #: ../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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "manquant dans %d chanson" msgstr[1] "manquant dans %d chansons" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "différent parmi %d chanson" msgstr[1] "différent dans les %d chansons" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "Séparer en _plusieurs valeurs" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Séparer le disque de l'_album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Séparer la _version du titre" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Séparer l'arrangeur de l'ar_tiste" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Séparer l'intér_prète de l'artiste" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Séparer l'intér_prète de l'artiste" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Séparer la _version du titre" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Ajouter une nouvelle étiquette (\"tag\")" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "É_tiquette :" #: ../quodlibet/qltk/edittags.py:409 msgid "Edit Tags" msgstr "Éditer les étiquettes" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Montrer les commentaires de _programmation" #: ../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 "Jamais" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:657 msgid "Unable to add tag" msgstr "Impossible d'ajouter l'étiquette" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Impossible d'ajouter la chanson" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Étiquette non valide" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Valeur non valide" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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 #, 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> semble avoir été changée pendant le fonctionnement du programme. " "Sauvegarder maintenant sans réactualiser votre bibliothèque pourrait écraser " "d'autres modifications à la chanson.\n" "\n" "Sauvegarder tout de même cette étiquette?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Impossible de sauvegarder la chanson" #: ../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 "" "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/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Plus d'options..." #: ../quodlibet/qltk/entry.py:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Greffons" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Préférences d'Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Séparer _sur:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Édition d'étiquettes (\"tags\")" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Dossiers" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Nouveau dossier" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Sélectionner tous les sous-dossiers" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nouveau dossier" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Saisissez un nom pour le nouveau dossier :" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Impossible de créer le dossier" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Impossible de supprimer le dossier" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "par %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disque %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Piste %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Éditer l'affiche des informations" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Aucune chanson n'est sélectionnée." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Pas de chansons" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Paroles" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artiste" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artistes" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "interprètes" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Jamais" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "ajoutée" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "dernière écoute" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "joué" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "sauté" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "notation" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "durée" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Information" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Codage invalide]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "débit des données" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "taille du fichier" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modifiée" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Produit par %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "interprète" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Piste indisponible" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d chanson sans album" msgstr[1] "%d chansons sans album" #: ../quodlibet/qltk/information.py:490 msgid "Selected Discography" msgstr "Discographie sélectionnée" #: ../quodlibet/qltk/information.py:543 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d chanson sans artiste" msgstr[1] "%d chansons sans artiste" #: ../quodlibet/qltk/information.py:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Durée totale :" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Taille totale :" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Fichiers" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Télécharger" #: ../quodlibet/qltk/lyrics.py:37 #, fuzzy msgid "_Edit" msgstr "_Éditer l'affichage des informations..." #. 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Des paroles n'ont pas été trouvées pour cette chanson." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Recherche de paroles..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Impossible de télécharger des paroles." #: ../quodlibet/qltk/maskedbox.py:19 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "Vous allez supprimer %d chanson." #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Abandonner les modifications apportées aux étiquettes ?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Jamais" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Le fichier existe" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Renommer les fichiers" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d tâches en cours" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Inconnu(e)" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Dans l'ordre" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "Dans l'_ordre" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Mélangé" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Mélangé" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Mélangé et pondéré" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "Mélangé et _pondéré" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Une chanson" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Une chanson" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Erreurs de greffon" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Activé" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Désactivé" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Aucune catégorie" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Pas de greffon trouvé." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Greffons" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Montrer les _erreurs" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disque" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "Pis_te" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "groupage" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Nom de _fichier" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "D_urée" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Liste de chansons" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Sauter à la chanson courante automatiquement" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Quand la chanson jouée change, défiler jusqu'à elle dans la liste des " "chansons" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "Au_tres :" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Éditer l'affichage des informations..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Colonnes visibles" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Inclure les personnes dans la _recherche" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Le nom de _fichier contient le répertoire" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Préférences" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Colonnes visibles" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Navigateurs" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Filtre _global :" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Rechercher" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Confirmer les notations _multiples" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Demander une confirmation avant de changer la notation de plusieurs chansons " "en une fois" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "Activer les n_otations en un clic" #: ../quodlibet/qltk/prefs.py:261 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Activer la notation des chansons par un clic dans la colonne de la liste de " "chansons" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Notation" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Utiliser des coins arrondis pour les vignettes" #: ../quodlibet/qltk/prefs.py:274 #, 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." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Jaquettes d'Album" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Lecture" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Journal" #: ../quodlibet/qltk/prefs.py:344 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 une chanson, " "multiplier le volume par cette valeur" #: ../quodlibet/qltk/prefs.py:347 msgid "_Fall-back gain (dB):" msgstr "Gain par _défaut (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Multiplier le volume pour toutes les chansons par cette valeur, tant que le " "résultat ne sature pas" #: ../quodlibet/qltk/prefs.py:361 msgid "_Pre-amp gain (dB):" msgstr "Gain _global (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Activer l'ajustement de volume par les valeurs Replay Gain" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Ajustement du volume par Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Notation" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Enregistrer la notation et le _nombre d'écoutes" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "Courri_el :" #: ../quodlibet/qltk/prefs.py:532 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:547 msgid "Auto-save tag changes" msgstr "Sauvegarder les changements " #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 msgid "Tags" msgstr "Étiquettes" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Nouvelle radio internet" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "Ra_fraîchir la bibliothèque au démarrage" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Ra_fraîchir la bibliothèque" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Chercher des changements faits dans la bibliothèque" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Re_charger la bibliothèque" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "" "Recharger toutes les chansons de votre bibliothèque (peut durer longtemps)" #: ../quodlibet/qltk/prefs.py:640 msgid "Scan Directories" msgstr " _Répertoires à scanner" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Pas de chansons" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Propriétés" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_File de chansons" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Supprimer toutes les chansons de la queue" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Aléatoire" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "" "Recommencer la liste de lecture après que toutes les chansons ont été jouées" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Lecture" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Choisir des répertoires" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Impossible d'ajouter les chansons" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> utilise un protocole non supporté." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Musique" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Ajouter un dossier..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Ajouter un fichier..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Ajouter un chemin" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Démarrer un nouveau navigateur" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Contrôle" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Aller à la chanson en cours" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "Afficha_ge" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Aide" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Arrêter après cette chanson" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Signets" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Modifier les signets" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Rechercher" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Liste de chansons" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Ajouter un chemin" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Saisissez le chemin vers un fichier audio:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Impossible d'ajouter le chemin" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> n'est pas un chemin valide." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Ajouter de la musique" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Surveiller les modifications sur ce dossier" #: ../quodlibet/qltk/ratingsmenu.py:23 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "Vous êtes sur le point de changer la notation de %d chansons.\n" "Voulez-vous continuer?" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Notation" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "Supprimer les doublons" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "Supprimer les doublons" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Remplacer les espaces par des _soulignés" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Remplacer les caractères incompatibles avec _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Enlever les signes _diacritiques" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Remplacer les caractères non-_ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Utiliser uniquement des caractères minuscules" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Renommer les fichiers" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "motif" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Éditer les motifs sauvegardés..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "A_perçu" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nouveau nom" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Impossible de renommer le fichier" #: ../quodlibet/qltk/renamefiles.py:253 #, 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 "" "Le renommage de <b>%s</b> en <b>%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:261 msgid "Ignore _All Errors" msgstr "Ignorer _toutes les erreurs" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continuer" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Le chemin n'est pas absolu" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Les chansons placées dans ces répertoires (séparées par ':') seront\n" "ajoutées à votre bibliothèque" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "Choisir des répertoires" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Recherches sauvegardées" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Editer les recherches sauvegardées..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Rechercher" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Rechercher après avoir _tapé" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limite:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Pondéré" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrer sur %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Colonnes « _Album »" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Colonnes « _Piste »" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Colonnes « _Album »" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Colonnes « Ar_tistes »" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Colonnes « _Date »" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Colonnes « _Fichier »" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Colonnes « _Production »" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Configurer les colonnes..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Listes de lecture" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "A_jouter à la file" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copier sur le périphérique" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "Supp_rimer de la liste de lecture" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Remplacer les so_ulignés par des espaces" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Mettre une _majuscule aux valeurs résultantes" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Séparer en plusieurs _valeurs" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Étiquettes par chemin" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Les étiquettes remplacent celles existantes" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Les étiquettes sont ajoutées à celles existantes" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Étiquettes non valides" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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 entré est invalide. Assurez-vous d'avoir entré < et > comme " "\\< et \\> et que vos balises sont bien balancées.\n" "%s" #: ../quodlibet/qltk/textedit.py:154 msgid "Edit Display" msgstr "Éditer l'affiche des informations" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Numéros de pistes" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Com_mencer à:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "Nombre _total de pistes :" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Lecteur" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "A_perçu" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "et %d de plus..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Sauvegarde des chansons que vous avez modifiées." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d chansons sauvées\n" "(%(remaining)s restantes)" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Déplacement de %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, 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:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Système de fichiers" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "A:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "A:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E: " #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Afficher des informations d'utilisation succinctes " #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Afficher la version et le copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[options]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "L'option %r n'est pas reconnue." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "L'option %r nécessite un argument" #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r n'est pas un préfixe unique." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d seconde" msgstr[1] "%d secondes" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minute" msgstr[1] "%d minutes" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d heure" msgstr[1] "%d heures" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d jour" msgstr[1] "%d jours" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "no_capitalize" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 msgid "MusicBrainz IDs must be in UUID format." msgstr "" "Les identificateurs de pistes 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:103 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:113 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:102 msgid "Unable to edit song" msgstr "Impossible d'éditer la chanson" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Codage invalide]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arrangeur" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangeurs" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arrangeur" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "auteur" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "auteurs" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "compositeur" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "compositeurs" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "compositeur" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "chef d'orchestre" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "chefs d'orchestre" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "chef d'orchestre" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "date" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "description" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "genre" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "groupage" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "langue" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "endroit" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "parolier" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organisation" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "titre" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "site web" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "Artiste de l'album" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "sous-titre du disque" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disque" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "piste" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "numéro catalogue" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "date de première publication " #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "Nom de la première édition " #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "Artiste (première édition)" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "date d'enregistrement " #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "Identifiant MusicBrainz - piste " #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "Identifiant MusicBrainz - piste " #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "Identifiant MusicBrainz - piste " #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "Identifiant MusicBrainz - artiste" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "Identifiant MusicBrainz - piste " #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "Identifiant MusicBrainz - trm" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "Identifiant MusicBrainz - puid" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Statut MusicBrainz de l'album" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Type MusicBrainz de l'album" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "gain pour la piste" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "pic de la piste" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "gain pour l'album" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "pic de l'album" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Préférences" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "disques" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "pistes" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "dernier lancement" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "chemin complet" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "point de montage" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "personnes" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "année" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "année de première publication " #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "signet" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "format de fichier" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Listes de lecture" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, 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 "Clear search" #~ msgstr "Effacer la chaîne de recherche" #~ 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 "lyricists" #~ msgstr "paroliers" #~ 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.5.3/po/gl_ES.po�������������������������������������������������������������������������0000644�0001750�0001750�00000511165�12646427550�015733� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Ex Falso / Quod Libet's galician (RAG) translation. # Copyright (C) 2005 - 2010, Johám-Luís MIguéns Vila <galiza.ceive@gmail.com>, 2010. # This file is distributed under the same license as the Ex Falso / Quod Libet package. # msgid "" msgstr "" "Project-Id-Version: Ex Falso / Quod Libet SVN\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-16 12:54+0100\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_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" "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 "Edita as etiquetas dos teus arquivos 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 música" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Escoita, examina ou edita a túa 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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "un editor de etiquetas de música" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "cartafol" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Título" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Estilo" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Puntuación" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Ordenar _por:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferencias" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Lista de álbuns" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Lista de álbuns" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Todos os álbuns" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d álbum" msgstr[1] "%d álbuns" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Amosar as _portadas dos álbuns" msgstr[1] "Amosar as _portadas dos álbuns" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Cancións sen álbum" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d pista" msgstr[1] "%d pistas" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d discos" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Todos os álbuns" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Preferencias da lista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Amosar as _portadas dos álbuns" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "A procura _inclúi os componentes" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[opcións]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Vista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Padrón inválido" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Descoñecido" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nova fonte" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Insire o enderezo dunha fonte de audio (feed)" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Fontes de audio" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Fontes de audio" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Baixar" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Baixar os arquivos" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Baixar o arquivo" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Non se puido engadir a fonte" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "Non foi posíbel engadir <b>%s</b>. Pode ser que o servidor estea caído ou\n" "que o enderezo introducido non sexa o dunha fonte de audio (feed)." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Actualizar a colección" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Eliminar os arquivos" #: ../quodlibet/browsers/audiofeeds.py:501 #, fuzzy, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "Non se puido importar o python-feedparser. Desactivóuse o navegador de " "fontes (feeds)." #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "A infraestrutura de audio activada non soporta URLs. Desactivóuse o " "navegador de fontes (feeds)." #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Navegador da colección" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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 cancións (%(time)s)" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Colección de álbuns" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Colección de álbuns" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Descoñecido" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Extraer valores múltiplos" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Personalizada" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Eliminar duplicados" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etiqueta" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Xuntar" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferencias da lista de álbuns" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Desactivar o navegador" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Desactivar o navegador" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Non se puideron copiar as cancións" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Os arquivos seleccionados non se puideron copiar a outra lista ou á fileira." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "_Engadir á colección" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Tipo de arquivo non admitido" #: ../quodlibet/browsers/iradio.py:171 #, 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ó poden conter enderezos de emisoras, non outras " "listas de emisoras nen listas de reproducción. Os seguintes enderezos non se " "puideron cargar:\n" "%s" #: ../quodlibet/browsers/iradio.py:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Non se puido engadir a emisora" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Radio por Internet" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Baixar os arquivos" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nova emisora" #: ../quodlibet/browsers/iradio.py:336 msgid "Enter the location of an Internet radio station:" msgstr "Insire o enderezo dunha 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 "Éxitos antigos" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Xaponesa" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "India" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Relixiosa" #: ../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 "Reggae / 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 "Faladoiro / Novas" #: ../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:41 msgid "Classical" msgstr "Clásica" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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 "Novas" #: ../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:34 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:483 msgid "_Internet Radio" msgstr "_Radio por Internet" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nova emisora" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Nova emisora" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Nova emisora" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Preferidos" #: ../quodlibet/browsers/iradio.py:591 #, fuzzy msgid "No Category" msgstr "Sen categoría" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Non se atoparon emisoras" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Non se atoparon emisoras de radio por Internet en %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Todas as emisoras relacionadas xa están na túa colección." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "Engadir á _lista" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Eliminar da lista" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Propiedades do dispositivo" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Dispositivo:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Sen montar" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Ponto de montaxe:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nome:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Dispositivos externos" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Dispositivos externos" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Expulsar" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Propiedades" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "Muda_r o nome" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "Utilizado <b>%s</b>, disponíbel <b>%s</b>" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "Non se puido copiar <b>%s</b>." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "A copiar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Non se puido copiar a canción" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Non hai espazo libre dabondo para esa canción." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "Non se puido copiar <b>%s</b>." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Non foi posíbel eliminar as cancións" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "A eliminar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "Non se puido eliminar <b>%s</b>." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Non foi posíbel eliminar a canción" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Erro ao expulsar <b>%s</b>." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Non foi posíbel expulsar o dispositivo" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" "Sen infraestrutura de dispositivos. O navegador de dispositivos foi " "desactivado." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Vista por paneis" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Vista por paneis" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Seleccionar _todo" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Todo" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Preferencias da vista por paneis" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Listas" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Listas" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Eliminar da lista" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importar" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nova lista" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Non se puido importar a lista de reproducción" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "O Quod Libet só pode importar listas nos formatos M3U e PLS." #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "Non se puido mudar o nome da lista" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importar lista" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Nova lista" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s e %(count)d máis" msgstr[1] "%(title)s e %(count)d máis" #: ../quodlibet/browsers/playlists/menu.py:83 #, 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 piques de mudar a puntuación de %d cancións.\n" "Desexas continuar?" msgstr[1] "" "Estás a piques de mudar a puntuación de %d cancións.\n" "Desexas continuar?" #: ../quodlibet/browsers/playlists/menu.py:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, fuzzy, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Estás a piques de eliminar a lista <i>%s</i>.\n" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Toda a información sobre a lista seleccionada váise eliminar e non se poderá " "repor." #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Insire un nome para o novo cartafol" #: ../quodlibet/browsers/playlists/util.py:95 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "A importar a lista de reproducción.\n" "\n" "%(current)d/%(total)d cancións engadidas." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limitar os resultados" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Procurar na colección" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Procurar na colección" #: ../quodlibet/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "O Quod Libet non se está a executar." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "un xestor de música e reproductor de son" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[opcións]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Amosa a canción que se está a reproducir" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Comezar a tocar inmediatamente" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Ir á canción seguinte" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Ir á canción anterior ou, de estarmos próximos ao inicio, recomezar a " "presente" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Ir á canción anterior" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Comezar a reproducción" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Parar a reproducción" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Alternar entre tocar e parar" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Comezar a reproducción" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Aumentar o volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Diminuir o volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Amosar o estado da reproducción" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Agochar a fiestra principal" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Amosar a fiestra principal" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Alternar entre mostrar ou non a fiestra principal" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Centrarse no reproductor activo" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Eliminar os filtros de navegación activos" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Reler e actualizar a colección" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Desactivar o navegador" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Amosar a lista de reproducción activa" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Amosar o contido da fileira " #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Amosar o contido da fileira " #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Comezar sen extensións" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "O Quod Libet non se está a executar." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Saír do Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Avanzar na canción activa" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Configurar ou alternar a orde de reproducción" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Activar ou desactivar o modo de repetición" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Axustar o volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Procurar na colección de música" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "procura" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Reproducir un arquivo" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "nome" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Puntuar a canción actual" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Configurar o navegador activo" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Abrir un novo navegador" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Amosar ou agochar a fileira" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Amosar ou agochar a lista de reproducción" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtrar nun valor aleatorio" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Etiqueta" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrar nun valor da etiqueta" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "etiqueta=valor" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Pór un arquivo ou unha procura na fileira" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Engadir á fileira os arquivos (separados por comas)" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nome" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Mostrar os resultados da procura na saída estándard" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Tirar da fileira un ficheiro ou unha procura" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumento inválido para '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Proba %s --help" #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Dispositivo descoñecido" #: ../quodlibet/devices/__init__.py:26 #, fuzzy, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "Non se puido importar o dbus-python, necesario para o soporte de " "dispositivos." #: ../quodlibet/devices/__init__.py:148 #, python-format msgid "%r is not a supported device." msgstr "%r non é un dispositivo admitido." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Non se puido atopar o media-player-info." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "A activar a infraestrutura de dispositivos." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "A tentar '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Non se puido conectar a unha infraestrutura de dispositivos." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Infraestrutura de dispositivos activa." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod sen configurar" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Ques crear unha base de datos baleira no iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Ganancia de _volume (dB)" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copiar as _portadas dos álbuns" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combinar as etiquetas con valores múltiples" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "O título inclúe a _versión" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "O álbum inclúe a _parte" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modelo:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacidade:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "A eliminar ficheiros orfos do iPod" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Non se puido gardar a base de datos do iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Non se puido gardar a base de datos do iPod" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "" "Non se puido importar a biblioteca python-gpod. Desactivóuse a interacción " "co iPod." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Padrón do nome do arquivo:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Eliminar portadas e cartafoles non utilizados" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID do MusicBrainz da pista" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Codificación inválida]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Título" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor de etiquetas de música" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Maiúsculas nas etiquetas (title-case)" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Preferencias da vista por paneis" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Tamaño total:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Editar a vista" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Importancia" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "Infraestrutura de _saída:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editar a vista" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Antever" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_mática" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_mática" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "A infraestrutura de audio activada non soporta URLs. Desactivóuse o " "navegador de fontes (feeds)." #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d segundo" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Personalizada" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Limpar os erros" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Reproductor de música" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Radio por Internet" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "localización" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Agochar a fiestra principal" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferencias" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Título" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Non se puido conectar a unha infraestrutura de dispositivos." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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 "Non se puido conectar a unha infraestrutura 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:461 #, fuzzy msgid "_Service:" msgstr "Dispositivo:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nome:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Outras:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Padrón do nome do arquivo:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Ál_bum aleatorio" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "álbuns" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Importancia" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Ál_bum aleatorio" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importar lista" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Sen reproducción" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d canción" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "patrón" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Editar a vista" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Sen reproducción" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Listas" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Reproductor" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Antever" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Seguinte" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Orde:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repetición" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Parar despois desta canción" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Examinar a colección" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Editar as e_tiquetas" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Información" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Antever" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtro no _artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Predefinida" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Personalizada" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtro no _estilo" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtro no _artista" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Fontes de audio" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Insire o enderezo dunha fonte de audio (feed)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Eliminar duplicados" #: ../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 piques de mudar a puntuación de %d cancións.\n" "Desexas continuar?" msgstr[1] "" "Estás a piques de mudar a puntuación de %d cancións.\n" "Desexas continuar?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "As cancións duplicadas serán eliminadas da lista '%s'." #: ../quodlibet/ext/playlist/shuffle.py:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Nova lista" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Na fileira" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nunca" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "pico de ganancia da pista" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Non se puido conectar a unha infraestrutura de dispositivos." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "Muda_r o nome" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Colección" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Agochar a fiestra principal" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Nome" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Non se puido gardar a canción" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Lista de álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamaño" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Procurar:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Lista de álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Editar os marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editar os marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Marcadores" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nome" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Pista" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Título" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Non se atoparon extensións." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "e %d máis..." msgstr[1] "e %d máis..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo de álbum no MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "procura" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo de álbum no MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Extraer o disco do _álbum" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Navegadores" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Non se puido crear o cartafol" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Lista de pistas" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Intre" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Seleccionar _todo" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, python-format msgid "%(title)s and %(count)d more…" msgid_plural "%(title)s and %(count)d more…" msgstr[0] "%(title)s e %(count)d máis" msgstr[1] "%(title)s e %(count)d máis" #: ../quodlibet/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "Muda_r o nome" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Padrón inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Valor inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Personalizada" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Non se puideron copiar as cancións" #: ../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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Desactivar o navegador" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Eliminar duplicados" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Eliminar duplicados" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Eliminar duplicados" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "Eliminar duplicados" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Editar a vista" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Extraer as imaxes incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Extraer as imaxes incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Eliminar duplicados" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrar nun valor da etiqueta" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtro no _estilo" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Na fileira" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Erros" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Gardar" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID do MusicBrainz da pista" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "cartafol" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Cabeceiras do á_lbum" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Gardar" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Erro ao cargar %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "Muda_r o nome" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Non se puido gardar a canción" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Non se atoparon extensións." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Letra" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Letra" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Listas" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Non se puido importar a lista de reproducción" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "Actualizar a colección" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d canción" msgstr[1] "%d cancións" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Actualizar a colección" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Todos os álbuns" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "patrón" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Editar os valores gardados..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, fuzzy msgid "Configure searches…" msgstr "C_or nos termos de 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Colección" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "A comprobar os pontos de montaxe" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "A analisar a colección" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "A analisar %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Imposíbel carregar o arquivo: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Mostrar as etiquetas" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Mostrar a saída para depuración" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Colunas e orde para mostralas no modo depuración (%s)" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostrar mensaxes de depuración" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Sen argumentos dabondo" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Demasiados erros" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "descrición" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Valor" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Mostrar todas as etiquetas habituais" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Copiar as etiquetas dun arquivo a outro" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Mostrar as mudanzas, sen aplicalas" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Saltar as etiquetas que nom se poidan escreber" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Non se puido copiar a etiqueta %r ao arquivo: %r" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor de etiquetas de música" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Non foi seleccionada ningunha canción." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Estabelece unha etiqueta e elimina os valores existentes" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Non se puido estabelecer %r" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "Eliminar duplicados" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "O valor é unha expresión regular" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Eliminar duplicados" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "Non se pode combinar '--all' con '--regexp'" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "Non se pode eliminar %r de %r" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtrar nun valor da etiqueta" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtrar nun valor da etiqueta" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Non consta a duración" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Imposíbel carregar o arquivo: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Extraer as imaxes incrustadas" #: ../quodlibet/operon/commands.py:552 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extraer as imaxes incrustadas" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "Mudar o nome dos arquivos baseándose nas etiquetas" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "Crear as etiquetas baseándose na rota ao arquivo" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Arquivo" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Crear os números de pista para todos os arquivos" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "Mostrar as etiquetas coincidentes co padrón indicado" #: ../quodlibet/operon/commands.py:752 #, fuzzy msgid "Display help information" msgstr "Amosar indicacións sumarias sobre o modo de utilización" #: ../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 é un enderezo válido." #: ../quodlibet/player/gstbe/player.py:92 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "A encher o buffer" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Non se puido crear a pipeline predefinida do GStreamer" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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 do GStreamer utilizada para a reproducción, e.g. 'alsasink " "device=default'.\n" "Deixa-o en 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 "Duración 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Non se atoparon emisoras" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Saída do GStreamer inválida, tentaráse a predeterminada." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Non se puido crear a saída de audio" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Non se atopou o dispositivo de son %r. Verifica as opcións do Xine en ~/." "quodlibet/config." #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Non se puido enlazar a pipeline GStreamer: '%s'" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Extensións" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Formatos admitidos: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Dispositivo de son: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Comezo" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Intre" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nome do marcador" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Marcadores" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtros" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Nunca tocadas" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Engadidas _recentemente" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Principais 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Nova emisora" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtro no _estilo" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtro no _artista" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtro no ál_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Estilo _aleatorio" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Ar_tista aleatorio" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Ál_bum aleatorio" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "As 40 cancións máis tocadas (aparecerán máis de corenta se hai cancións " "tocadas o mesmo número de veces)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Non consta a duración" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Valor:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Valores gardados" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Editar os valores gardados..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Cancións" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Amosar o tempo restante" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_mática" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Cabeceiras da pista" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Cabeceiras do á_lbum" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Axuste do Replay Gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Descoñecido" #: ../quodlibet/qltk/data_editors.py:349 #, fuzzy msgid "Tag expression" msgstr "O valor é unha expresión regular" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrar nun valor da etiqueta" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Producíuse un erro" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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 erro no Quod Libet. Gardóuse un arquivo de depuración en <b>%s</" "b> que nos axudará a analizar o problema. \n" "Por favor crea un novo asunto en http://code.google.com/p/quodlibet/issues/" "list e inclue dito arquivo ou o seu contido. \n" "Ese ficheiro pode conter información do teu sistema, como a lista das " "cancións reproducidas recentemente. \n" "Se non o consideras aceptábel, envía no seu lugar <b>%s</b> coa descrición " "do que estabas a facer." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" "Pode ser que o QuodLibet estea inestábel. É recomendábel fechálo e " "reiniciálo. Gardaráse a colección." #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Arquivos" #: ../quodlibet/qltk/delete.py:59 #, fuzzy msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "As cancións duplicadas serán eliminadas da lista '%s'." #: ../quodlibet/qltk/delete.py:68 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "As cancións duplicadas serán eliminadas da lista '%s'." #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Eliminar os arquivos" #: ../quodlibet/qltk/delete.py:105 #, fuzzy msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "As cancións duplicadas serán eliminadas da lista '%s'." #: ../quodlibet/qltk/delete.py:114 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "As cancións duplicadas serán 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mover para o lixo" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "A mover %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Non se puido gardar a base de datos do iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Erro ao expulsar <b>%s</b>." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "A eliminar %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Non se puido eliminar o arquivo" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, fuzzy msgid "Deleting one or more files failed." msgstr "Erro ao 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "non se atopou de %d canción" msgstr[1] "non se atopou de %d cancións" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "diferente en %d canción" msgstr[1] "diferente en %d cancións" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "Extraer valores múltiplos" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Extraer o disco do _álbum" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Extraer a _versión do título" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Extraer o arranxista do a_rtista" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Extraer o intér_prete do artista" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Extraer o intér_prete do artista" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Extraer a _versión do título" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Engadir unha etiqueta" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Etiqueta" #: ../quodlibet/qltk/edittags.py:409 msgid "Edit Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Mostrar mensaxes de depuración" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Acceder a todas as etiquetas, mesmo a aquelas xeradas automaticamente, p.ex. " "as etiquetas MusicBrainz ou 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:657 msgid "Unable to add tag" msgstr "Non se puido engadir a etiqueta" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Non se puido engadir a canción" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Non se puido engadir <b>%s</b>\n" "\n" "Os arquivos seleccionados non admiten valores múltiples." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Etiqueta inválida" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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 ficheiros seleccionados non permiten a edición desa etiqueta." #: ../quodlibet/qltk/edittags.py:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Valor inválido" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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 non 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 "" "Mentres o programa estaba a ser executado <b>%s</b> mudou. Gardar sen " "actualizar a colección podería eliminar outras modificacións na canción.\n" "\n" "Gardar a canción de todos xeitos?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Non se puido gardar a 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 "" "Erro ao gardar <b>%s</b>. Pode ser que o arquivo sexa de só lectura, estea " "corrompido ou que non teñas permisos para editalo." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Máis opcións..." #: ../quodlibet/qltk/entry.py:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Extensións" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Preferencias do Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "E_xtraer por::" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Edición de etiquetas" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Cartafoles" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Novo cartafol" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Seleccionar todos os cartafoles subordinados" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Novo cartafol" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Insire un nome para o novo cartafol" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Non se puido crear o cartafol" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Non se puido eliminar o cartafol" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "por %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Pista %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Editar a vista" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Non foi seleccionada ningunha canción." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Sen cancións" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Información" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Letra" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artistas" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "intérpretes" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nunca" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d vez" msgstr[1] "%d veces" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "engadida" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "última vez tocada" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "contador" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "saltada" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "puntuación" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "duración" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Información" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Ascendente" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "tamaño" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modificada" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d seleccionada" msgstr[1] "%d seleccionadas" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Producido por %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "intérprete" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Pista non disponíbel" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d canción sen álbum" msgstr[1] "%d cancións sen álbum" #: ../quodlibet/qltk/information.py:490 msgid "Selected Discography" msgstr "Discografía seleccionada" #: ../quodlibet/qltk/information.py:543 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d canción sen artista" msgstr[1] "%d cancións sen artista" #: ../quodlibet/qltk/information.py:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "álbuns" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Duración total:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Tamaño total:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Arquivos" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Baixar" #: ../quodlibet/qltk/lyrics.py:37 #, fuzzy msgid "_Edit" msgstr "_Editar 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Non se atopou a letra desta canción." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "A procurar a letra da canción..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Non se puido baixar a letra." #: ../quodlibet/qltk/maskedbox.py:19 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "" "Estás a piques de mudar a puntuación de %d cancións.\n" "Desexas continuar?" #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "As cancións duplicadas serán eliminadas da lista '%s'." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Descartar as modificacións nas etiquetas?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "As etiquetas mudaron pero non se gardaron. Gardar os arquivos ou descartar " "as mudanzas?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nunca" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "O arquivo existe" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Mudar o nome dos arquivos" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Tarefas activas" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "Número de tarefas activas: %d" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Descoñecido" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "En orde" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_En orde" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Barallar" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Barallar" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Dinámica" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Dinámica" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Unha canción" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Unha canción" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Erros nas extensións" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Activado" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Desactivado" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Sen categoría" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Non se atoparon extensións." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Extensións" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Mostrar os _erros" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Pista" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "agrupación" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Ál_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Nome" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Duración" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Lista de cancións" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Ir á canción reproducida automaticamente" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "Ao mudar a canción reproducida, rolar cara ela na lista" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "Comportamento" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Outras:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Editar vista..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Engadir ou eliminar colunas de información adicional" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Colunas visíbeis" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "A procura _inclúi os componentes" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "O nome inclúe o carta_fol" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferencias" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Aplicar a configuración actual á lista, engadindo as novas colunas ao final" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Colunas adicionais" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Navegadores" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Filtro _global:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "Aplicar esta procura engadíndoa ás demais" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Procurar" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Confirmar a puntuación _múltipla" #: ../quodlibet/qltk/prefs.py:256 #, fuzzy msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Obter confirmación antes de mudar as puntuacións de varias cancións á vez" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "Activar as puntuacións c_un click" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Posibilitar a mudanza das puntuacións ao facer click na coluna de puntuacións" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Puntuacións" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Empregar cantos redondeados nas miniaturas" #: ../quodlibet/qltk/prefs.py:274 #, fuzzy msgid "Round the corners of album artwork thumbnail images." msgstr "" "Redondear os cantos das miniaturas das portadas. Pode requirir reiniciar a " "aplicación." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Preferir as portadas _incrustadas" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Escoller utilizar as portadas incrustadas no ficheiro de audio (de estaren " "disponíbeis) antes que doutras fontes" #: ../quodlibet/qltk/prefs.py:287 #, fuzzy msgid "_Fixed image filename:" msgstr "_Forzar o nome do arquivo de imaxe" #: ../quodlibet/qltk/prefs.py:289 #, fuzzy msgid "The single image filename to use if selected" msgstr "O nome de ficheiro da imaxe da portada para usar forzosamente" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "O nome de ficheiro da imaxe da portada para usar forzosamente" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Lista de álbuns" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Parar a reproducción" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Rexistro da saída" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "De non existir información sobre o axuste Replay Gain para a canción, " "multiplicar o volume por este valor" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Ganancia por defecto (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Multiplicar o volume de todas as cancións por este valor, sempre que non se " "produzan cortes" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Ganancia de _volume (dB)" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Activar o axuste do Replay Gain" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Axuste do Replay Gain" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Predefinida" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Puntuacións" #: ../quodlibet/qltk/prefs.py:512 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 as puntuacións acumuladas.\n" "0 significa unha media convencional, valores máis elevados significan que " "álbuns \n" "con poucas pistas terán menor puntuación extrema. Mudar este valor executa " "un recálculo \n" "para todos os álbuns." #: ../quodlibet/qltk/prefs.py:517 msgid "_Bayesian averaging amount:" msgstr "Cantidade de media _Bayesiana:" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Gardar as puntuacións e o _contador" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Correo-e:" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "" "Determinaránse as calificacións e o contador para este enderezo de correo-e" #: ../quodlibet/qltk/prefs.py:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Descartar as modificacións nas etiquetas?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Gardar as mudanzas nas etiquetas sen solicitar confirmación individual ao se " "editaren varios arquivos" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Relación de separadores para seren empregados ao extraer os valores das " "etiquetas. A lista está separada por espazos." #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Nova emisora" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "_Actualizar a colección ao iniciar" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Actualizar a colección" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Escrutar por modificacións na colección de música" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Reler a colección" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "" "Cargar de novo todas as cancións da colección (pode levar moito tempo, hora " "de prepararse un cafe?)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "Analisar os _cartafoles" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Sen cancións" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Propiedades" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Fileira" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Eliminar todas as cancións da fileira" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Aleatorio" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Comezar de novo a lista de reproducción ao rematar" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Parar a reproducción" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Seleccionar cartafoles" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Non se puideron engadir as cancións" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> utiliza un protocolo non admitido." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Música" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Engadir un cartafol..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Engadir un arquivo..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Engadir un enderezo" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Abrir un novo navegador" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Ir á canción reproducida" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Ver" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Axuda" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Parar despois desta canción" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Marcadores" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editar os marcadores..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Axuda en Internet" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Procurar" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Lista de can_cións" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Engadir un enderezo" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Insire o enderezo dun arquivo de música:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Non se puido engadir o enderezo" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> non é un enderezo válido." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Engadir música" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Escrutar este cartafol á procura de novas cancións" #: ../quodlibet/qltk/ratingsmenu.py:23 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "Estás a piques de mudar a puntuación de %d cancións.\n" "Desexas continuar?" #: ../quodlibet/qltk/ratingsmenu.py:25 #, fuzzy msgid "The saved ratings will be removed" msgstr "As cancións duplicadas serán eliminadas da lista '%s'." #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Mudaráse a puntuación de todas as cancións seleccionadas a '%s'" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Puntuación" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "Eliminar duplicados" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "Eliminar duplicados" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Substituír os espazos por trazos _baixos" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Eliminar os caracters non compatíbeis co _Windows(tm)" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Eliminar as marcas diacríticas" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Eliminar os caracteres non-_ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Empregar unicamente caracteres de caixa-_baixa" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Mudar o nome dos arquivos" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "patrón" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Editar os valores gardados..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Antever" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Novo nome" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Non se puido mudar o nome do arquivo" #: ../quodlibet/qltk/renamefiles.py:253 #, 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 mudar o nome de <b>%s</b> a <b>%s</b>. Pode ser que o arquivo de " "destino xa exista\n" "ou que non teñas permisos para crear o novo ou eliminar o antigo." #: ../quodlibet/qltk/renamefiles.py:261 msgid "Ignore _All Errors" msgstr "Ignorar todos os _erros" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continuar" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "O enderezo non é absoluto" #: ../quodlibet/qltk/renamefiles.py:294 #, 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 patrón\n" "\t<b>%s</b>\n" "contén / pero non comeza na raíz (/). Para evitar cartafoles mal indicados, " "comeza o teu padrón por / ou ~/" #: ../quodlibet/qltk/scanbox.py:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "As cancións que se atopen neses cartafoles (separados por ':') engadiránse á " "colección" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "Seleccionar cartafoles" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Valores gardados" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Editar os valores gardados..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Procurar" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "Procurar na colección, empregando texto ou procuras QL" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "_Procurar despois de escreber" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Mostrar os resultados despois de rematar de escreber" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limite:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Importancia" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrar por %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Cabeceiras do á_lbum" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Cabeceiras da pista" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Cabeceiras do á_lbum" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Cabeceiras dos _componentes" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Cabeceiras da _data" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Cabeceiras do _arquivo" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Cabeceiras de p_rodución" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizar as cabeceiras..." #: ../quodlibet/qltk/songlist.py:1097 #, fuzzy msgid "_Expand Column" msgstr "Colunas adicionais" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Listas" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Engadir á _fileira" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copiar ao dispositivo" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Eliminar da lista" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Substituir os trazos _baixos por espazos" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Maiúsculas nas etiquetas (title-case)" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Extraer valores _múltiplos" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Etiquetas a partires do enderezo" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "As etiquetas reemprazan ás anteriores" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "As etiquetas engádense ás anteriores" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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 patrón\n" "\t<b>%s</b>\n" "non é válido. Pode que conteña a mesma etiqueta dúas veces ou que teña " "parénteses ou chaves desaxustadas (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:213 msgid "Invalid tags" msgstr "Etiquetas inválidas" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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 non permiten a edición das etiquetas." #: ../quodlibet/qltk/textedit.py:138 #, 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 patrón que introduciches era inválido. Asegúrate de que insires < e " "> como \\< e \\> e que as etiquetas están equilibradas.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:154 msgid "Edit Display" msgstr "Editar a vista" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Números de pista" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Comezar de_nde:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "Pistas _totais:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Reproductor" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Antever" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "e %d máis..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "A gardar as cancións modificadas." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d cancións gardadas\n" "(restan %(remaining)s)" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "A mover %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Xa existe unha lista chamada %s." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Sistema de arquivos" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "A:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "A:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Amosar indicacións sumarias sobre o modo de utilización" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Amosar a versión e o copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opcións]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Non se recoñeceu a opción %r." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "A opción %r require un argumento." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r non é un prefixo único." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d día" msgstr[1] "%d días" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Sen title-case en galego" #: ../quodlibet/util/massagers.py:31 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "A data há ser inserida nos formatos 'YYYY', 'YYYY-MM-DD' ou 'YYYY-MM-DD HH:" "MM:SS'." #: ../quodlibet/util/massagers.py:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "As ganancias do Replay Gain han ser inseridas no formato 'x.yy dB'." #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Os limites do Replay Gain han ser inseridos no formato 'x.yy'." #: ../quodlibet/util/massagers.py:82 msgid "MusicBrainz IDs must be in UUID format." msgstr "Os ID do MusicBrainz deben utilizar un formato UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "O estatus do lanzamento do MusicBrainz debe ser 'official', 'promotional' ou " "'bootleg'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "O idioma debe ser un código de tres letras ISO 639-2" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Non se puido editar a canción" #: ../quodlibet/util/songwrapper.py:103 #, 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 gardar <b>%s</b>. Pode ser que o arquivo sexa de só lectura, estea " "corrompido ou que non teñas permisos para editalo." #: ../quodlibet/util/string/__init__.py:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Codificación inválida]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "álbum" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arranxista" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arranxistas" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arranxista" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor/a" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autoras/es" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "compositor/a" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "compositoras/es" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "compositor/a" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "director/a" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "directoras/es" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "director/a" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contacto" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "descrición" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "estilo" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "estilo" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "agrupación" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "idioma" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licenza" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "localización" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "letrista" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "compañía" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "título" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versión" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "página de Internet" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "artista do álbum" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "subítulo / parte" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "pista" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "número ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "data da publicación orixinal" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "álbum orixinal" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "artista orixinal" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "data de gravación" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID do MusicBrainz da pista" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID do MusicBrainz da publicación" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "ID do MusicBrainz da publicación" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID do MusicBrainz do artista" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID do MusicBrainz da publicación" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "ID do MusicBrainz do TRM" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "PUID do MusicIP" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Estado do álbum no MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Tipo de álbum no MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "ganancia de volume da pista" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "pico de ganancia da pista" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "ganancia de volume do álbum" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "pico de ganancia do álbum" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Preferencias" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discos" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "pistas" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "última vez comezada" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "nome completo" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "ponto de montaxe" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "componentes" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "ano" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "data da publicación orixinal" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "marcador" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "Non consta a duración" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Listas" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ msgid "Unable to open input files" #~ msgstr "Non se puideron abrir os arquivos seleccionados" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "O GStreamer non dispón de ningún elemento para ler arquivos. \n" #~ "Verifica as opcións de instalación do GStreamer." #~ msgid "Invalid audio backend" #~ msgstr "A infraestrutura de son non é válida" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "A infraestrutura de son %r non está instalada" #~ msgid "ql-save" #~ msgstr "Gardar" #, fuzzy #~ msgid "ql-revert" #~ msgstr "_Eliminar da colección" #~ msgid "Clear search" #~ msgstr "Limpar a procura" #~ 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 arroxadas por 'dump'" #~ msgid "command|filename" #~ msgstr "arquivo" #~ msgid "command|tag" #~ msgstr "etiqueta" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Non se puido atopar o media-player-info." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Procurar" #~ msgid "%d of %d" #~ msgstr "%d de %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Utilización: %s %s" #~ msgid "_Download..." #~ msgstr "_Baixar..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nova emisora" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Sobreescreber <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Saída do erro" #~ 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 "" #~ "A saída do GStreamer non se puido activar. Pode ser que non sexa válida " #~ "ou\n" #~ "que o dispositivo estea a ser utilizado. Verifica a configuración do " #~ "reproductor." #~ msgid "Quod Libet is already running." #~ msgstr "O Quod Libet xa se está a executar" #~ msgid "No song is currently playing." #~ msgstr "Non se está a reproducir ningunha canción" #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Non foi posíbel escribir a %s. Eliminándoo." #~ 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 vista..." #~ msgid "Output Log" #~ msgstr "Rexistro da saída" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d emisora" #~ msgid "_Add a Location..." #~ msgstr "_Engadir un enderezo..." #~ msgid "_Output Log" #~ msgstr "_Registro de saída" #~ msgid "Invalid command %r received." #~ msgstr "Recibíuse o comando %r, que non é válido." #~ msgid "Unknown browser %r." #~ msgstr "Navegador descoñecido %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ás a piques de mudar a puntuación de %d cancións.\n" #~ "Desexas continuar?" #~ msgstr[1] "" #~ "Estás a piques de mudar a puntuación de %d cancións.\n" #~ "Desexas 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 piques de mudar a puntuación de %d cancións.\n" #~ "Desexas continuar?" #~ msgstr[1] "" #~ "Estás a piques de mudar a puntuación de %d cancións.\n" #~ "Desexas continuar?" #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Cabeceiras da pista" #, fuzzy #~ msgid "People Headers" #~ msgstr "Cabeceiras dos _componentes" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Cabeceiras do á_lbum" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Cabeceiras da _data" #, fuzzy #~ msgid "File Headers" #~ msgstr "Cabeceiras do _arquivo" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Cabeceiras de p_rodución" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Etiqueta" #~ msgid "Descending" #~ msgstr "Descendente" #~ msgid "Too Many Errors" #~ msgstr "Demasiados erros" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "A deter a reproducción por se sucederon %d erros seguidos." #~ msgid "Warnings" #~ msgstr "Advertencias" #~ msgid "General" #~ msgstr "Xeral" #~ msgid "No log available." #~ msgstr "Sen rexistros" #~ 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 álbum" #~ msgid "errors" #~ msgstr "erros" #~ msgid "lyricists" #~ msgstr "letristas" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Erro ao ler a portada \"%s\"" #~ msgid "Permanently delete this file?" #~ msgstr "Eliminar este arquivo?" #~ msgid "Permanently delete these files?" #~ msgstr "Eliminar estes arquivos?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s e %(count)d máis..." #~ msgstr[1] "%(title)s e %(count)d máis..." #, fuzzy #~ msgid "Version:" #~ msgstr "versión" #~ msgid "_Cause an Error" #~ msgstr "_Provocar un erro" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s non se puido engadir á colección.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Erro ao se 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 erro no Quod Libet. Gardóuse un arquivo de depuración en <b>" #~ "%s</b> que nos axudará a analizar o problema. \n" #~ "Por favor crea un novo asunto en http://code.google.com/p/quodlibet/" #~ "issues/list e inclue dito arquivo ou o seu contido. \n" #~ "Ese ficheiro pode conter información do teu sistema, como a lista das " #~ "cancións reproducidas recentemente. \n" #~ "Se non o consideras aceptábel, envía no seu lugar <b>%s</b> coa " #~ "descrición do que estabas a facer.\n" #~ "\n" #~ "Pode que o Quod Libet se torne inestábel a partires deste momento. " #~ "Recomendamos fechalo e abrilo de novo.Gardaráse a túa colección." #~ msgid "Could not import python-gpod, iPod support disabled." #~ msgstr "" #~ "Non se puido importar a biblioteca python-gpod. Desactivóuse a " #~ "interacción co iPod." #, fuzzy #~ msgid "_Output device:" #~ msgstr "Infraestrutura de _saída:" #~ msgid "Search your library" #~ msgstr "Procurar na colección" #~ msgid "No eject command found." #~ msgstr "Non se atopou o comando eject." #~ msgid "Unable to start web browser" #~ msgstr "Non se puido iniciar un 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 "" #~ "Non se atopou un navegador de Internet. Por favor, configura a variábel " #~ "$BROWSER\n" #~ " ou asegúrate de que existe /usr/bin/navegador." #, fuzzy #~ msgid "Library Error" #~ msgstr "Navegador da colección" #~ msgid "translator-credits" #~ msgstr "ashtophet" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Outras colunas para seren mostradas, separadas por espazos" #~ 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ás a piques de mudar a puntuación de %d cancións.\n" #~ "Desexas continuar?" #~ msgstr[1] "" #~ "Estás a piques de mudar a puntuación de %d cancións.\n" #~ "Desexas continuar?" #~ msgid "Confirm rating" #~ msgstr "Confirmar 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 aplicativo é software libre, accede ao código fonte para " #~ "verificares\n" #~ "as condicións de copia. NON HÁ garantía, nen sequera da súa\n" #~ "APTITUDE PARA O COMERCIO nun DE SER AXEITADO PARA UN USO DETERMINADO.\n" #~ "\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r non contén ningún navegador" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Tamaño total:" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r non contén ningún dispositvo" #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: Non se puido importar ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: Non se puido atopar o media-player-info." #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: Non se puido atopar o media-player-info." #~ msgid "Quod Libet Plugins" #~ msgstr "Extensións do Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Amosar as procuras simples en azul, as avanzadas en verde e as inválidas " #~ "en vermello" #~ msgid "_Select" #~ msgstr "_Seleccionar" #~ msgid "Separators for splitting tags" #~ msgstr "Separadores para dividir as etiquetas" #~ msgid "Quod Libet Preferences" #~ msgstr "Preferencias do Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Non tocadas ho_xe" #~ msgid "Not Played in a _Week" #~ msgstr "Non tocadas nunha _semana" #~ msgid "Not Played in a _Month" #~ msgstr "Non tocadas nun _mes" #~ 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 cancións menos tocadas (aparecerán máis de corenta se hai cancións " #~ "tocadas o mesmo número de veces)" #~ msgid "gtk-media-next" #~ msgstr "_Seguinte" #~ msgid "gtk-media-previous" #~ msgstr "_Anterior" #~ msgid "gtk-media-play" #~ msgstr "_Tocar" #~ msgid "gtk-media-pause" #~ msgstr "_Parar" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #~ msgid "Date" #~ msgstr "Data" #~ msgid "Choose New Stations" #~ msgstr "Escolle 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 son (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "A cargar a colección principal (%s)" #~ msgid "Unable to save library" #~ msgstr "Non se puido gardar a colección" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "Non se puido crear a tubería para a saída de audio %r. Verifica as " #~ "configuracións do GStreamer en ~/.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 "Letras fornecidas 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 "" #~ "Non se atoparon as letras.\\nPodes premer no botón \"Baixar\" para que o " #~ "Quod Libet os procureonline. Tamén podes escribilos ti mesm@ e premer " #~ "\"Gardar\"." #~ msgid "Recommend" #~ msgstr "Recomendados" #~ msgid "_LastFM webservice URL: http://" #~ msgstr "URL do servizo _LastFM: http://" #~ msgid "The main url for lastfm webservices. Must end in a trailing /" #~ msgstr "A URL principal para os servizos do LastFM. Debe rematar cun /" #~ msgid "LastFM _similar artist webservice: " #~ msgstr "Artistas _similares no LastFM:" #~ msgid "" #~ "Enter here the xml webservice lookup that gets appended to the main " #~ "service url" #~ msgstr "" #~ "Insire o ficheiro xml de procura que se engadirá á URL principal do " #~ "LastFM." #~ msgid "LastFM top _tracks webservice: " #~ msgstr "Princi_pais cancións do LastFM:" #~ msgid "LastFM top _albums webservice: " #~ msgstr "Principais _álbuns do LastFM:" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/po/sv.po����������������������������������������������������������������������������0000644�0001750�0001750�00000500647�12646427550�015375� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "en ljudtaggsredigerare" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "mapp" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Titel" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Datum" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Betyg" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Sortera _på..." #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Inställningar" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albumlista" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albumlista" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Alla album" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:640 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Ladda om omslaget" msgstr[1] "Ladda om omslagen" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Låtar utan album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d spår" msgstr[1] "%d spår" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d skiva" msgstr[1] "%d skivor" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Alla album" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Inställningar för albumlista" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Visa album_omslag" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Sökning inkluderar personer" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[alternativ]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Albumvisning" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Ogiltigt mönster" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Okänd" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Ny feed" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Ange platsen för en ljud-feed:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Ljudfeeds" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Ljudfeeds" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Hämta" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Hämta filer" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Hämta fil" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Kunde ej lägga till feed" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Uppdatera biblioteket" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Ta bort filer" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "Kunde inte importera %s. Ljudströmsbläddraren avaktiverad." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Biblioteksbläddrare" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, python-format msgid "Unknown %s" msgstr "Okänd %s" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "Multipla %s-värden" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Anpassad" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Ta bort taggar" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tagg" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Slå samman" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Inställningar för skivsamling" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Inaktivera bläddrare" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Inaktivera bläddrare" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Filsystem" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Filsystem" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Kunde ej kopiera låtar" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "Lägg _till i bibliotek" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Filtypen stödjs ej" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Kunde ej lägga till station" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internetradio" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Ladda hem stationslista" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Ny station" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Klassiskt" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internetradio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Ny station" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "_Uppdatera stationer" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Alla stationer" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Favoriter" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Ingen kategori" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Inga stationer funna" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Inga internetradiostationer hittades på %s" #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Alla listade stationer finns redan i biblioteket" #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "_Lägg till som favorit" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Ta bort från favoriter" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Enhetsinställningar" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Enhet:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Ej monterad" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Monteringspunkt:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Namn:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Mediaenheter" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Mediaenheter" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Mata ut" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Egenskaper" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Byt namn" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> is ej ansluten." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopierar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Kunde ej kopiera låt" #: ../quodlibet/browsers/media.py:512 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:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> kunde inte kopieras." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Kunde ej ta bort låtar." #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Tar bort <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> kunde inte tas bort." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Kunde ej ta bort låt" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Utmatning av <b>%s</b> misslyckades." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Kunde inte mata ut enhet" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "Ingen enhetsdrivrutin. Mediaenheter avaktiverade." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Panelbläddrare" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Panelbläddrare" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Välj _alla" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Alla" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Inställningar för panelbläddrare" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Spellistor" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "Spellistor" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Ta _bort från spellista" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importera" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Ny spellista" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Kan ej importera spellistor" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Kan ej byta namn på spellista" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importera spellista" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Ny spellista" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 msgid "Enter a name for the new playlist:" msgstr "Ange ett namn på den nya spellistan:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet körs inte" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "musikbibliotek och -spelare" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[alternativ]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Skriver ut den låt som spelas och avslutar" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Börja spela omgående" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Hoppa till nästa låt" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Hoppa till föregående låt" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Starta uppspelning" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pausa uppspelning" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Växla spelnings-/paus-läge" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Stoppa uppspelning" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Höj volymen" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Sänk volymen" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Skriv ut spelarstatus" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Dölj huvudfönstret" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Visa huvudfönstret" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Växla synlighet för huvudfönstret" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Fokuserar på den spelare som körs" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Ta bort aktuella bläddrarfilter" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Uppdatera och skanna om biblioteket" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Inaktivera bläddrare" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Skriv ut nuvarande spellista" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Skriv ut innehållet i kön" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Skriv ut innehållet i kön" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Starta utan insticksmoduler" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet körs inte" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Avsluta Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Sök innom spelande låt" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Ange eller växla spelordningen" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Stäng av, på eller växla repetering" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Ställ in volymen" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Sök i ljudbiblioteket" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "fråga" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Spela en fil" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "filnamn" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Betygsätt den spelande låten" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Ange nuvarande bläddrare" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Öppna ny bläddrare" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Visa eller dölj bläddraren" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Visa eller dölj huvudlåtfönstret" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtrera på slumpvis värde" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "tagg" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrera på ett taggvärde" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tagg=värde" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Kölägg en fil eller fråga" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Kölägg kommaseparerad lista" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "filnamn" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Skriv ut filnamnen på sökresultatet till stdout" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Ta bort fil eller fråga från kö" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Ogiltigt argument för '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Försök med %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Okänd enhet" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r stöds inte. " #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Kan inte hitta %s." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Initialiserar enhetsdrivrutin." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Testar '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Enhetsdrivrutin initierad." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod ej initierad" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Vill du skapa en tom databas på den här iPoden?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Volymsförstärkning (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopiera _omslag" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Lägg ihop taggar med _multipla värden" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Titel innehåller _version" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Album innehåller skivunderrubrik" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modell:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Kapacitet:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Tar bort överblivna iPod-låtar" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Kunde ej iPod-databas" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Kunde ej iPod-databas" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Kunde inte importera python-gpod, iPodstöd avaktiverat." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Filnamn mönster:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Ta bort oanvända omslag och kataloger" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz spår-ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Oglitig kodning]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "_Titel" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editera taggar i redigerare" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Första bokstaven i varje ord _versal" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Inställningar för panelbläddrare" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Total storlek:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Redigera visning" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Vikt" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Utgångspipeline" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Redigera visning" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Förhandsgranska" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matisk" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matisk" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%.1f sekunder" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Anpassad" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Rensa fel" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Musikspelare" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internetradio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "plats" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Dölj huvudfönstret" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Inställningar" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "_Titel" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "Inga nya stationer" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "Inga nya stationer" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Enhet:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Namn:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Andra:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Filnamn mönster:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Slumpvis al_bum" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "album" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Vikt" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Slumpvis al_bum" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importera spellista" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Spelar ej" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d låt" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Sökvägsmönster" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Skrollhjulet justerar volymen\n" "Skift och skrollhjulet byter låt" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Skrollhjulet byter låt\n" "Skift och skrollhjulet justerar volymen" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Rullhjul" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Hjälptextvisning" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Spelar ej" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "Inställningar för notifieringsikon" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Spellistor" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Spela upp/pausera" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Föregående" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Nästa" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "Spel_ordning" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repetera" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Stoppa efter denna låt" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Bläddra i bibliotek" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Redigera _taggar" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Text" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Text" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Förhandsgranska" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrera på _artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Förval" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "Anpassad sortering" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrera på _genre" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrera på _artist" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Ljudfeeds" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Ange platsen för en ljud-feed:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Ny spellista" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Köad" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Aldrig" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "spårtopp" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Byt namn" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Bibliotek" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Avlusa" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Dölj huvudfönstret" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Filnamn" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Kunde ej spara låt" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Albumomslag" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Storlek" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Sök:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Sök" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Albumomslag" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Redigera bokmärken" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Redigera bokmärken" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Bokmärken" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filnamn" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Spår" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "_Titel" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Artist" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Inga insticksmoduler hittades." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "och %d till..." msgstr[1] "och %d till..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album typ" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "fråga" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Sök" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album typ" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Hämta skiva ur _album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Bläddrare" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Kunde ej skapa mapp" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Spårlista" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Tid" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Välj _alla" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "tagg" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Byt namn" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "tagg" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Ogiltigt mönster" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Ogiltigt värde" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "Anpassad sortering" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Inaktivera bläddrare" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Ta bort dubletter" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Ta bort dubletter" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Ta bort dubletter" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "Ta bort taggar" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Redigera visning" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Extrahera inbäddade bilder" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Extrahera inbäddade bilder" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Ta bort alla taggar" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrera på ett taggvärde" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrera på _genre" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Köad" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Visa fel" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Skriv" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz spår-ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "mapp" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Albumläge" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Skriv" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importera spellista" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Fel vid läsning av %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Byt namn" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Kunde ej spara låt" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Inga insticksmoduler hittades." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Text" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Text" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Spellistor" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Kan ej importera spellistor" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "Uppdatera biblioteket" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d låt" msgstr[1] "%d låtar" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Uppdatera biblioteket" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Redigera taggar" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Redigera taggar" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Alla album" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Sök" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Sökvägsmönster" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Redigera sparade sökningar..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Bibliotek" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Kontrollerar monteringspunkter" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Kontrollerar bibliotek" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Kontrollerar %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Kunde inte ladda filen: %r" #: ../quodlibet/operon/commands.py:33 #, fuzzy msgid "List tags" msgstr "Lista alla taggar." #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Koncis utmatning" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, 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:43 msgid "Also list programmatic tags" msgstr "Lista även programmatiska taggar" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Inte nog många argument" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "För många argument" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 msgid "Description" msgstr "Beskrivning" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Värde" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Visa alla gemensamma taggar" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Kopiera taggar från en fil till en annan" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Visa förändringar, verkställ dem inte" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Hoppa över taggar som inte kan skrivas" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Kan ej kopiera tagen %r till filen: %r" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editera taggar i redigerare" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Inga låtar är valda." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Sätt en tagg och ta bort alla existerande värden" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Kunde inte sätta %r" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "Ta bort taggar" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "Värdet är ett reguljärt uttryck" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "Ta bort alla taggar" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "Kan inte kombinera '--all' med '--regexp'" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "Kan inte ta bort %r från %r" #: ../quodlibet/operon/commands.py:369 msgid "Remove a tag value" msgstr "Ta bort ett taggvärde" #: ../quodlibet/operon/commands.py:418 msgid "Add a tag value" msgstr "Lägg till ett taggvärde" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Visa filinformation" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Kunde inte ladda filen: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Extrahera inbäddade bilder" #: ../quodlibet/operon/commands.py:552 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extrahera inbäddade bilder" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Fil" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Ström" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Buffrar" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Kunde inte skapa förvald GStreamer pipeline." #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Inga stationer funna" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Ogiltig GStreamer output pipeline, försöker med förvalt värde." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Kunde ej skapa audiodata" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Kunde inte länka GStreamer-pipeline: '%s'" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Insticksmoduler" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Format som stödjs: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Ljudenhet: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Början" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Tid" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Bokmärkesnamn" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Bokmärken" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filter" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "Nyligen _spelad" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Nyligen _tillagda" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 _högsta" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Alla stationer" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrera på _genre" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrera på _artist" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrera på al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Slumpvis _genre" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Slumpvis _artist" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Slumpvis al_bum" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Ingen tidsinformation" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Värde:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Sparade värden" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Redigera sparade värden..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Låtar" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Visa återstående tid" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_matisk" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "_Spårläge" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "_Albumläge" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Replay Gain volymjusterning" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Okänd" #: ../quodlibet/qltk/data_editors.py:349 #, fuzzy msgid "Tag expression" msgstr "Värdet är ett reguljärt uttryck" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrera på ett taggvärde" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Ett fel har inträffat" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Filer" #: ../quodlibet/qltk/delete.py:59 #, 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:68 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Ta bort filer" #: ../quodlibet/qltk/delete.py:105 #, 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:114 #, 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Flytta till papperskorgen" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Flyttar %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Kunde ej flytta till papperskorg" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, 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:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Tar bort %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Kunde ej ta bort fil" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Dela till flera värden" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Hämta skiva ur _album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Hämta _version ur titel" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Hämta arrangör ur ar_tist" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Hämta _uppträdande ut artist" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "Hämta _framträdanden från titel" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "Hämta _originalartist från titel" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Lägg till en tagg" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tagg:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Kunde ej lägga till tagg" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Kunde ej lägga till låt" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Ogiltig tall" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Ogiltigt värde" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Insticksmoduler" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso inställningar" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Dela _på:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Taggredigering" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Mappar" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Ny mapp" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "Välj _alla rekursivt" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Ny mapp" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Namn på den nya mappen:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Kunde ej skapa mapp" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Kunde ej ta bort mapp" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "av %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Skiva %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Spår %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Redigera visning" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Inga låtar är valda." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Inga låtar" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Text" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artister" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "uppträdande" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Aldrig" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "tillagd" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "senast spelad" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "spelningar" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "överhoppningar" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "betyg" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "längd" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Information" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Ökande" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "filstorlek" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "ändrad" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d vald" msgstr[1] "%d valda" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Producerad av %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "uppträdande" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Spår otillgängligt" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Vald discografi" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Total längd:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Total storlek:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Filer" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Hämta" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../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:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Söker efter text..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Kunde ej hämta text." #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 #, 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:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Förkasta taggändringar?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Aldrig" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Filen existerar" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Byt namn på filer" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Aktiva uppgifter" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d uppgifter körs" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Okänd" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "I ordning" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_I ordning" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Blanda" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Blanda" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Viktad" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Viktad" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "En låt" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_En låt" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Insticksmodulfel" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Aktiverad" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Inaktiverad" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Ingen kategori" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Inga insticksmoduler hittades." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Insticksmoduler" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Visa _fel" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Skiva" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "Sp_år" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "gruppering" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Filnamn" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Längd" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Låtlista" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Hoppa automatiskt till spelande låt" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Beteende" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Andra:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Redigera visning..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Synliga kolumner" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Sökning inkluderar personer" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Filnamn innehåller _mapp" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Inställningar" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Synliga kolumner" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Bläddrare" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globalt filter:" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Sök" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Bekräfta _multipla betyg" #: ../quodlibet/qltk/prefs.py:256 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:259 msgid "Enable _one-click ratings" msgstr "Aktivera_ enklicksbetyg" #: ../quodlibet/qltk/prefs.py:261 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Betyg" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Använd rundande hörn på miniatyrbilder" #: ../quodlibet/qltk/prefs.py:274 #, 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" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Föredra _inbäddade bilder" #: ../quodlibet/qltk/prefs.py:282 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:287 #, fuzzy msgid "_Fixed image filename:" msgstr "_Tvinga bildfilnamn:" #: ../quodlibet/qltk/prefs.py:289 #, fuzzy msgid "The single image filename to use if selected" msgstr "Albumbild som ska tvunget ska användas" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Albumbild som ska tvunget ska användas" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Albumomslag" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Uppspelning" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Utkonfiguration" #: ../quodlibet/qltk/prefs.py:344 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:347 msgid "_Fall-back gain (dB):" msgstr "_Fall-back förstärkning (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 msgid "_Pre-amp gain (dB):" msgstr "_Pre-amp förstärkning (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Aktivera Replay Gain volymjusterning" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Replay Gain volymjusterning" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Förval" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Betyg" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "_Bayesisk medelvärdesfaktor" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Spara betyg och antalet _spelningar" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Epost:" #: ../quodlibet/qltk/prefs.py:532 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:547 msgid "Auto-save tag changes" msgstr "Spara taggförändringar automatiskt" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. 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:579 msgid "Tags" msgstr "Taggar" #: ../quodlibet/qltk/prefs.py:600 msgid "Updating for new ratings" msgstr "Uppdaterar betyg" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "_Uppdatera biblioteket vid programstart" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Uppdatera biblioteket" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Kontrollera ändringar i biblioteket" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Ladda om biblioteket" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 msgid "Scan Directories" msgstr "Skanna mappar" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Inga låtar" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Egenskaper" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Kö" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Ta bort alla låtar från kön" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Slumpvis" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Starta om spellistan vid slut" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Uppspelning" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Välj mappar" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Kunde ej lägga till låtar" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, 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:800 msgid "_Music" msgstr "_Musik" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "Lägg _till mapp.." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "Lägg _till fil..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Lägg till en plats" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Öppna ny bläddrare" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Kontroll" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Hoppa till spelande låt" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Visa" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Hjälp" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Stoppa efter denna låt" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Bokmärken" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Redigera bokmärken" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Onlinehjälp" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Sök i hjälpen" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Låt_lista" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Lägg till en plats" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Ange platsen för en ljudfil:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Kan lägga till plats" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> är ej en giltig plats." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Lägg till musik" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Vaka över denna mapp för nya låtar" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 #, fuzzy msgid "The saved ratings will be removed" msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 #, fuzzy msgid "Change _Rating" msgstr "_Betyg" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "Ta bort taggar" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "Ta bort taggar" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Ersätt mellanslag med _understreck" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Ta bort _Windows-inkompatibla " #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Ta bort diakritiska tecken" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Ta bort icke-ASCII-tecken" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Använd enbart _gemener" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Byt namn på filer" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Sökvägsmönster" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Redigera sparade mönster" #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Förhandsgranska" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nytt namn" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Kunde ej byta namn på fil" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Ignorera _alla fel" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Fortsätt" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Sökvägen är ej absolut" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 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:108 msgid "Select Directories" msgstr "Välj mappar" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Sparade sökningar" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Redigera sparade sökningar..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Sök" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Sök när man slutat skriva" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Visa sökresultat när användaren har slutat skriva" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Gräns:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Vikt" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrera på %s" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "Alla _Kolumner" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Spårkolumner" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Albumkolumner" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Personkolumner" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Datumkolumner" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Filkolumner" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Produktionskolumner" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Kolumninställningar..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Spellistor" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Lägg till i _kö" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopiera till enhet" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "_Ta bort från bibliotek" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Ersätt _understreck med mellanslag" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Första bokstaven i varje ord _versal" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Dela till flera _värden" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Taggar från sökväg" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Taggar ersätter redan existerande" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Taggar läggs till till redan existerande" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Ogiltiga taggar" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Redigera visning" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Spårnummer" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Börja frå_n" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Antal spår:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Spela upp/pausera" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Föregående" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "och %d till..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Sparar låtarna du ändrade." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Flyttar %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "En spellista med namnet %s finns redan." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Filsystem" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "D:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "W:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Visa kortfattad användningsinformation" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Visa version och copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[alternativ]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Alternativet %r känns ej igen." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Alternativet %r kräver ett argument." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r är ej ett unikt prefix." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbit/s" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekund" msgstr[1] "%d sekunder" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minut" msgstr[1] "%d minuter" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d timma" msgstr[1] "%d timmar" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dag" msgstr[1] "%d dagar" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "svenne" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz utgivningsstatus måste vara 'official', 'promotional' eller " "'bootleg'." #: ../quodlibet/util/massagers.py:113 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:102 msgid "Unable to edit song" msgstr "Kunde ej redigera låt" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Oglitig kodning]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arrangör" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangörer" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arrangör" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "författare" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "författare" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "kompositör" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "kompositörer" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "kompositör" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dirigenter" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "dirigent" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "datum" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "beskrivning" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "genre" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "gruppering" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "språk" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licens" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "plats" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "lyrist" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organisation" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "titel" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "webbsida" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "album artist" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "Skivunderrubrik" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "skiva" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "spår" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "katalognummer" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "ursprungligt släppdatum" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "ursprungligt album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "ursprunglig artist" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "inspelningsdatum" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz spår-ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist-ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz album typ" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "spårförstärkning" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "spårtopp" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "albumförstärkning" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "albumtopp" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "Referensljudstyrka" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "skivor" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "spår" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "senast spelad" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "fullt namn" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "monteringspunkt" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "personer" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "år" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "ursprungligt släppdatum" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "Bokmärke" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "filformat" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Spellistor" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Töm sökning" #~ 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 "lyricists" #~ msgstr "lyrister" #~ 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.5.3/po/ro.po����������������������������������������������������������������������������0000644�0001750�0001750�00000461454�12646427550�015367� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "un editor de etichete audio" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "director" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Titlu" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Dată" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "gen" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "E_valuare" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Sortează după dată" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferinţe" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Listă albume" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Listă _albume" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Toate albumele" #: ../quodlibet/browsers/albums/main.py:473 #, 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:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Piese ce nu aparţin unui album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, 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:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, 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:66 #, fuzzy msgid "An Example Album" msgstr "Toate albumele" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Preferinţe listă albume" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Arată _coperţile albumelor" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[opţiuni]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Afişare albume" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Şablon invalid" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Necunoscut" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Flux nou" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Introduceţi locaţia unui flux audio:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Fluxuri audio" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "Fluxuri a_udio" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Caută" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Descarcă fişierele" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Descarcă fişierul" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Nu s-a putut adăuga fluxul" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Reactualizare c_olecţie" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Ştergere fişiere" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Navigator colecţie" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Necunoscut" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Separă în valori _multiple" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Personalizat" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "E_valuare" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etichetă" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferinţe listă albume" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Dezactivează navigatorul" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Dezactivează navigatorul" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Sistem de fişiere" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "Sistem de _fişiere" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Nu s-au putut copia piesele" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Adaugă la colecţie" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Tip nesuportat de fişier" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Nu s-a putut adăuga staţia" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Radio Internet" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Descarcă fişierele" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Staţie nouă" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "Radio _Internet" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Staţie nouă" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "Staţie _nouă" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Staţie nouă" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nici s-a găsit nici o staţie" #: ../quodlibet/browsers/iradio.py:812 #, 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:820 msgid "All stations listed are already in your library." msgstr "Toate staţiile listate sunt deja în colecţie." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Adaugă în listă" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "Şte_rge din listă" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Proprietăţi dispozitiv" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Dispozitiv:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Nu este montat" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Punct de montare:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nume:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Dispozitive media" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "Dispozitive _media" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Ejectare" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Proprietăţi" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Redenumeşte" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nu este conectat." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copiez <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Nu s-a putut copia piesa" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Nu există suficient spaţiu disponibil pentru această piesă." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nu a putut fi copiat." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Nu s-au putut şterge piesele" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Şterg <b>%s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nu a putut fi şters." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Nu s-a putut şterge piesa" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Ejectarea <b>%s</b> a eşuat." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Nu s-a putut ejecta dispozitivul" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Navigator încastrat" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Navigator încastrat" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Selectează t_ot" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Toate" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Preferinţe navigator încastrat" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Liste" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Liste" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Şte_rge din listă" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importă" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Listă nouă" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Nu s-a putut importa lista de redare" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Nu s-a putut redenumi lista" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importă lista" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "Listă _nouă" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Introduceţi un nume pentru noul director:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nu este pornit." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "redare audio pentru colecţii de muzică" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[opţiuni]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Afişare piesă redată curent" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Cu pornire imediată a redării" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Salt la piesa următoare" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Salt la piesa precedentă" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Start redare" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pauză redare" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Comutare între start şi pauză redare" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Start redare" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Volum mai mare" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Volum mai mic" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Afişare status curent" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Ascundere fereastră principală" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Afişare fereastră principală" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Comutare a vizibilităţii ferestrei principale" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Focalizare a ferestrei de redare" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "Reactualizare c_olecţie" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Dezactivează navigatorul" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Afişare a listei curente" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Afişare a cozii curente" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Afişare a cozii curente" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nu este pornit." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Ieşire Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Derulare în piesa redată curent" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Setare ori comutare a ordinii de redare" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Anulare, activare sau comutare a repetării" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Setare volum" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Căutare în colecţia muzicală" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "căutare" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Redare fişier" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "nume" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Evaluare a piesei redate curent" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Setare a navigatorului web utilizat" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Deschidere nou navigator web" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Afişare/ascundere a cozii" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Afişare/ascundere a listei principale de piese" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtrare după o valoare aleatoare" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Etichetă" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "etichetă=valoare" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Punere fişier în coadă sau căutare" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nume" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 #, fuzzy msgid "Unqueue a file or query" msgstr "Punere fişier în coadă sau căutare" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Argument invalid pentru „%s”." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Încercaţi %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Dispozitiv necunoscut" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: „%s” nu este un prefix unic." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Valoare invalidă" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod neiniţializat" #: ../quodlibet/devices/ipod.py:34 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?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copiază coperţile _albumelor" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combină etichetele cu valori m_ultiple" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Titlul include ver_siunea" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Albumul include pa_rtea" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacitate:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "W: sterg pista orfană din iPod" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Nu s-a putut salva baza de date iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Nu s-a putut salva baza de date iPod" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Model nume _fişier:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Ş_terge directoarele şi coperţile nefolosite" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID pistă MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Codare invalidă]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Titlu" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor pentru etichete audio" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Prima literă _majusculă" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Preferinţe navigator încastrat" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Mărime totală:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Editare afişare" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Pondere" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editare afişare" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Previzualizare" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d secundă" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Personalizat" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Erori module" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Redare audio" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Radio Internet" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "locaţie" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Ascundere fereastră principală" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferinţe" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Titlu" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Dispozitiv:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nume:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "Alt_ele:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Model nume _fişier:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "A_lbum aleator" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albume" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Pondere" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "A_lbum aleator" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importă lista" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Oprit" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d piesă" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "şablon" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Editare afişare" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Oprit" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Liste" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Redare" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Previzualizare" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Ordine:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repetare" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Stop după această piesă" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Navigare în colecţie" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Editare _etichete" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informaţii" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Versuri" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Versuri" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Previzualizare" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrare după _artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Personalizat" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrare după _gen" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrare după _artist" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Fluxuri audio" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Introduceţi locaţia unui flux audio:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Listă nouă" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_Coadă" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Niciodată" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "vârf pistă" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Redenumeşte" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Colecţie" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Ascundere fereastră principală" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Nume fişier" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Nu s-a putut salva piesa" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Listă albume" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Mărime" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Caută:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Caută" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Listă albume" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Editare favorite..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editare favorite..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Favorite" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nume fişier" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Pistă" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Titlu" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Artist" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nici un modul nu a fost găsit." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "şi alte %d..." msgstr[1] "şi alte %d..." msgstr[2] "şi alte %d..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tip album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "căutare" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Caută" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tip album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Separă discul de _album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Navigatoare" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Nu s-a putut crea directorul" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Listă piste" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Timp" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Selectează t_ot" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "comandă|etichetă" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Redenumeşte" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "comandă|etichetă" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Şablon invalid" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Valoare invalidă" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Personalizat" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Dezactivează navigatorul" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "E_valuare" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "E_valuare" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Editare afişare" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "E_valuare" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrare după _gen" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Coadă" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Arată _erorile" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Scrie" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID pistă MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "director" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Coloane _album" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Scrie" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importă lista" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Redenumeşte" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Nu s-a putut salva piesa" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nici un modul nu a fost găsit." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Versuri" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Versuri" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Liste" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Nu s-a putut importa lista de redare" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "Reactualizare c_olecţie" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d piesă" msgstr[1] "%d piese" msgstr[2] "%d de piese" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Reactualizare c_olecţie" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Editare etichete" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Editare etichete" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Toate albumele" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Caută" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "şablon" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Editare valori salvate..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Colecţie" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Se verifică punctele de montare" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Se verifică colecţia" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Se verifică %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Arată etichetele _programatice" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "descriere" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Valoare" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor pentru etichete audio" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nici o piesă nu este selectată." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Durată necunoscută" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Nu s-a putut redenumi fişierul" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Fişier" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nici s-a găsit nici o staţie" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Nu s-a putut crea directorul" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Module" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Formate suportate: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Dispozitiv audio: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Început" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Timp" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nume favorit" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Favorite" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtre" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "Nu a fost _niciodată redat" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Primele 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Staţie nouă" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrare după _gen" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrare după _artist" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrare după al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "_Gen aleator" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "A_rtist aleator" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "A_lbum aleator" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Durată necunoscută" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Valoare:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Valori salvate" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Editare valori salvate..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Piese" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Arată timpul rămas" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Coloane _pistă" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Coloane _album" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajustare de volum _replay gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Necunoscut" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Fişiere" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Ştergere fişiere" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mută la Gunoi" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Mut %d/%d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Nu s-a putut salva baza de date iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Ejectarea <b>%s</b> a eşuat." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Se şterge %d/%d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Nu s-a putut şterge fişierul" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Separă în valori _multiple" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Separă discul de _album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Separă _versiunea de titlu" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Separă aranjorul de ar_tist" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Separă _interpretul de artist" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Separă _interpretul de artist" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Separă _versiunea de titlu" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Adaugă o etichetă" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Etichetă:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Nu s-a putut adăuga eticheta" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Nu s-a putut adăuga piesa" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Etichetă invalidă" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Valoare invalidă" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Module" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Preferinţe Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Separare _la:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Editare etichete" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Directoare" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Director nou" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Selectează toate subdirectoarele" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Director nou" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Introduceţi un nume pentru noul director:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Nu s-a putut crea directorul" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Nu s-a putut şterge directorul" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "de către %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Discul %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Pista %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Editare afişare" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nici o piesă nu este selectată." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Nici o piesă" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informaţii" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Versuri" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artişti" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "interpreţi" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Niciodată" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "adăugat" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "ultima redare" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "redări" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "întreruperi" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "evaluare" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "durată" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informaţii" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Codare invalidă]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "rată de biţi" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "mărime fişier" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modificat" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Produs de către %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "interpret" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Pistă nedisponibilă" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Discografie selectată" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albume" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Durată totală:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Mărime totală:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Fişiere" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Caută" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../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:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Se caută versurile..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Nu s-au putut descărca versurile." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Anulaţi modificarea etichetelor?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Niciodată" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Fişierul există" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Redenumire fişiere" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Necunoscut" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "În ordine" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "În _ordine" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Aleator" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Aleator" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Ponderat" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Ponderat" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "O singură piesă" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "O _singură piesă" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Erori module" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Dezactivează navigatorul" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nici un modul nu a fost găsit." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Module" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Arată _erorile" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "Di_sc" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Pistă" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "grupare" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Nume _fişier" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "D_urată" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Listă piese" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Sări automat la piesa redată" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "Alt_ele:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Editare afişare..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Coloane vizibile" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Titlul include ver_siunea" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Numele de fişier include dire_ctorul" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferinţe" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Coloane vizibile" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Navigatoare" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Filtru _global:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Caută" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "E_valuare" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Listă albume" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Pauză redare" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "Ajustare de volum _replay gain" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "Ajustare de volum _replay gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "E_valuare" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Salvează evaluarile şi numărul de redări" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Adresă de mail:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Anulaţi modificarea etichetelor?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Editare etichete" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "Staţie _nouă" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "Reactualizare c_olecţie" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Reactualizare c_olecţie" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Caută noutăţi în colecţie" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Reîn_cărcare colecţie" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "_Directoare indexate" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Nici o piesă" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Proprietăţi" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Coadă" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Şterge toate piesele din coadă" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Aleator" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Repetă lista" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Pauză redare" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Selectare directoare" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Nu s-au putut adăuga piesele" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> foloseşte un protocol nesuportat." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Muzică" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "Adăugare _director..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "Adăugare _fişier..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Adăugare locaţie" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Deschidere nou navigator web" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Sări la piesa redată" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Vizualizare" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Ajutor" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Stop după această piesă" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Favorite" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editare favorite..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Caută" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Listă _piese" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Adăugare locaţie" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Introduceţi locaţia unui fişier audio:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Nu s-a putut adăuga locaţia" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nu este o locaţie validă." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Adăugare muzică" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Monitorizează acest director pentru piese noi" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "E_valuare" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "E_valuare" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "E_valuare" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Înlocuieşte spaţiile cu liniuţe de _subliniere" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Şterge caracterele incompatibile cu sistemele _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Şterge semnele _diacritice" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Şterge caracterele non-_ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Redenumire fişiere" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "şablon" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Editare valori salvate..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Previzualizare" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nume nou" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Nu s-a putut redenumi fişierul" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "Arată _erorile" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continuă" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Calea nu este una absolută" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Selectare directoare" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Valori salvate" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Editare valori salvate..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Caută" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Stop după această piesă" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limită:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Pondere" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrare după %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Coloane _album" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Coloane _pistă" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Coloane _album" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Coloane _persoane" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Coloane _dată" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Coloane _fişier" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Coloane _producţie" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizează coloanele..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Liste" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Adaugă în _coadă" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copiază către dispozitiv" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "Şte_rge din listă" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Înlocuieşte liniuţele de _subliniere cu spaţii" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Prima literă _majusculă" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Separă în valori m_ultiple" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Etichetare din cale" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Etichetele le înlocuiesc pe cele actuale" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Etichetele sunt adăugate la cele actuale" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Etichete invalide" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Editare afişare" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Număr piste" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start _de la:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Total piste:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Redare" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Previzualizare" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "şi alte %d..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Se salvează piesele modificate." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Mut %d/%d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "O listă cu numele „%s” există deja." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Sistem de fişiere" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Arată pe scurt informaţiile de utilizare" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Arată versiunea şi drepturile de autor" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opţiuni]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Opţiunea „%s” nu a fost recunoscută." #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Opţiunea „%s” necesită un argument." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: „%s” nu este un prefix unic." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, 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:380 #, 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:381 #, 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:382 #, 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:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "fără_capitalizare" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Nu s-a putut edita piesa" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Codare invalidă]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "aranjor" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "aranjori" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "aranjor" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "compozitor" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "compozitori" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "compozitor" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dirijor" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dirijori" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "dirijor" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "drepturi de autor" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "dată" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "descriere" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "gen" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "gen" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "grupare" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "limbaj" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licenţă" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "locaţie" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "textier" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organizaţie" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "titlu" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versiune" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "adresă internet" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "artist album" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "pistă" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "ID etichetă" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "dată iniţială de lansare" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "album iniţial" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "artist iniţial" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "dată de înregistrare" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID artist MusicBrainz" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "ID TRM MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "ID PUID MusicBrainz" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Status album MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Tip album MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "corecţie pistă" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "vârf pistă" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "corecţie album" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "vârf album" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Preferinţe" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discuri" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "piste" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "ultima lansare" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "nume complet" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "punct de montare" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "persoane" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "an" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "dată iniţială de lansare" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Favorite" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "format" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Liste" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Nu s-au putut deschide fişierele" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Valoare invalidă" #~ msgid "Clear search" #~ msgstr "Şterge căutarea" #~ 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 "lyricists" #~ msgstr "textieri" #~ 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ă" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Informaţii" #~ 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.5.3/po/nb.po����������������������������������������������������������������������������0000644�0001750�0001750�00000454607�12646427550�015350� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Norwegian translation of Quod Libet 1.1 # Copyright (C) 2004-2007 Joe Wreschnig # This file is distributed under the same license as the Quod Libet package. # # Eirik Haatveit <haatveit@gmail.com>, 2007. msgid "" msgstr "" "Project-Id-Version: nb\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-16 12:54+0100\n" "PO-Revision-Date: 2013-07-20 22:31+0100\n" "Last-Translator: Eirik Haatveit <haatveit@gmail.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.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Endre 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 "" #: ../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 "Lydtaggredigering" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Hør på, bla gjennom, eller gjør endringer i 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 "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Musikkspiller" #: ../exfalso.py:29 #, fuzzy msgid "an audio tag editor" msgstr "Lydtaggredigering" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "mappe" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Tittel" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Dato" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "sjanger" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Vurdering" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Sorter etter dato " #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Instillinger" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albumliste" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albumliste" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Alle album" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Vis album_omslag" msgstr[1] "Vis album_omslag" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Sanger uten album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d spor" msgstr[1] "%d spor" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disk" msgstr[1] "%d disker" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Alle album" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Instillinger for albumliste" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Vis album_omslag" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[valg]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Albumvisning" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Ugyldig mønster" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Ukjent" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Ny kilde" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Skriv inn adressen til en lydkilde: " #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Lydkilder" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Lydkilder" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Last ned" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Last ned filer" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Last ned fil" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Klarte ikke å legge til kilde" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, fuzzy, 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 <b>%s</b>. Tjeneren kan være nede, eller adressen er " "kanskje ikke en lydkilde." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "_Oppdater bibliotek" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Slett filer" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Bibliotekvisning" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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 sanger (%(time)s)" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Ukjent" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Splitt til _flere verdier" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Tilpasset" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Vurdering" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tagg" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Instillinger for albumliste" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Deaktiver visning" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Deaktiver utforsker" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Filsystem" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Filsystem" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Klarte ikke å legge til sanger" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "De valgte filene kan ikke kopieres til andre sanglister, eller til køen." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "_Legg til i bibliotek" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Filtype ikke støttet" #: ../quodlibet/browsers/iradio.py:171 #, 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 kan nå kun inneholde adresser til stasjoner, ikke andre " "stasjonslister eller spillelister. De følgende adressene kan ikke åpnes: \n" "%s" #: ../quodlibet/browsers/iradio.py:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Klarte ikke å legge til stasjon" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internettradio" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Last ned filer" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Ny stasjon" #: ../quodlibet/browsers/iradio.py:336 msgid "Enter the location of an Internet radio station:" msgstr "Skriv inn adressen til en Internettradiostasjon:" #: ../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 "vurdering" #: ../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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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 "_Ny stasjon" #: ../quodlibet/browsers/iradio.py:483 msgid "_Internet Radio" msgstr "_Internettradio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Ny stasjon" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Ny stasjon" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Ny stasjon" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Ingen stasjoner funnet" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Ingen Internettradiostasjoner ble funnet på %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Alle de oppførte stasjonene er allerede i ditt bibliotek." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Legg til spilleliste" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Fjern fra spillelisten" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Enhetsegenskaper" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Enhet:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Ikke montert" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Monteringspunkt:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Navn:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Medieenheter" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Medieenheter" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Løs ut" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Egenskaper" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Gi nytt navn" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> brukt, <b>%s</b> tilgjengelig" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> er ikke tilkoblet." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopierer <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Klarte ikke å kopiere sang" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Det er ikke nok ledig plass til denne sangen." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "Klarte ikke å kopiere <b>%s</b>" #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Klarte ikke å slette sanger" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Sletter <b>%s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "Klarte ikke å slette <b>%s</b>." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Klarte ikke å slette sang" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Å løse ut <b>%s</b> mislyktes." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Klarte ikke å løse ut enhet" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Rutevisning" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Rutevisning" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Velg alle" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Alle" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Instillinger for rutevisning" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Spillelister" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Spillelister" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Fjern fra spillelisten" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importer" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Ny spilleliste" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Klarte ikke å importere spilleliste" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Klarte ikke å gi nytt navn til spillelisten" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importer spilleliste" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Ny spilleliste" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, fuzzy, python-format 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" #: ../quodlibet/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Skriv inn et navn til den nye mappen:" #: ../quodlibet/browsers/playlists/util.py:95 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importerer spilleliste.\n" "\n" "%d/%d sanger 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet kjører ikke." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "musikkbibliotek og -spiller" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[valg]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Skriv ut den spillende sangen og avslutt" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Begynn avspilling med en gang" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Hopp til neste sang" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Hopp til forrige sang" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Start avspilling" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pause avspilling" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Skift mellom avspilling/pause-modus" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Start avspilling" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Skru opp volumet" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Skru ned volumet" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Skriv ut spillerens status" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Skjul hovedvinduet" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Vis hovedvinduet" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Slå av/på hovedvinduets synlighet" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Fokusér på den kjørende spilleren" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Fjern aktive visningsfiltere" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "_Oppdater bibliotek" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Deaktiver visning" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Skriv ut den gjeldende spilleplanen" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Skriv ut innholdet i køen" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Skriv ut innholdet i køen" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet kjører ikke." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Avslutt Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Søk inni sangen som spilles av" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Velg eller veksle på avspillingsrekkefølgen" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Slå gjentagelse av, på, eller skift mellom disse" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Still inn volumet" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Søk i musikkbiblioteket" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "spørring" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Spill av en fil" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "filnavn" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Vurdér sangen som spilles av" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Velg visningsmodus for det gjeldende vinduet" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Åpne nytt visningsvindu" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Vis eller skjul køen" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Vis eller skjul hovedsanglisten" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtrer på en tilfeldig verdi" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tagg" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrer på en taggverdi" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tagg=verdi" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Sett en fil eller spørring i køen" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "filnavn" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Fjern en fil eller spørring fra køen" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Ugyldig argument for «%s»." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Prøv %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Ukjent enhet" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "%r er ikke et unikt prefiks." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Ugyldig verdi" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod ikke klartgjort" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Vil du opprette en tom database på denne iPoden?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Volumnivå (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopier _albumomslag" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Kombiner tagger med _flere verdier" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Tittel inkluderer _versjon" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Album inkluderer _del" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modell:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Kapasitet:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Fastvare:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Fjerner foreldreløst iPod-spor" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Klarte ikke å lagre iPod-database" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Klarte ikke å lagre iPod-database" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Filnavnmønster:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Fjern ubrukte omslag og mapper" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz spor-ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Ugyldig tegnkoding]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Tittel" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Lydtaggredigering" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Tittelversaliser taggene" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Instillinger for rutevisning" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Total størrelse:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Rediger visning" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Innflytelse" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Rediger visning" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Forhåndsvisning" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d sekund" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Tilpasset" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Fjern feilmeldinger" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Musikkspiller" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internettradio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "sted" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Skjul hovedvinduet" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Instillinger" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Tittel" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Enhet:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Navn:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Annet:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Filnavnmønster:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Tilfeldig al_bum" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "album" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Innflytelse" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Tilfeldig al_bum" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importer spilleliste" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importer" #: ../quodlibet/ext/events/screensaver.py:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Ingenting avspilles" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d sang" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "mønster" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Rediger visning" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Ingenting avspilles" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Spillelister" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Spiller" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Forhåndsvisning" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Rekkefølge:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Gjenta" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Stopp etter denne sangen" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Utforsk bibliotek" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Rediger _tagger" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informasjon" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Sangtekst" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Sangtekst" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Forhåndsvisning" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrer på _artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Tilpasset" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrer på _sjanger" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrer på _artist" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Lydkilder" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Skriv inn adressen til en lydkilde: " #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "_Fjern fra spillelisten" #: ../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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Ny spilleliste" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_Kø" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Aldri" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "sportoppunkt" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Gi nytt navn" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Bibliotek" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Skjul hovedvinduet" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Filnavn" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Klarte ikke å lagre sangen" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Albumliste" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Størrelse" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Søk:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Søk" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Albumliste" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Rediger bokmerker..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Rediger bokmerker..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Bokmerker" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filnavn" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Spor" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Tittel" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Artist" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Ingen programtillegg funnet" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "og %d flere..." msgstr[1] "og %d flere..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz-albumtype" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "spørring" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Søk" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz-albumtype" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Splitt disk ut av _album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Utforskere" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Klarte ikke å opprette mappen" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Sporliste" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Tid" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Velg alle" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, python-format 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" #: ../quodlibet/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "kommando|tagg" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Gi nytt navn" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "kommando|tagg" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Ugyldig mønster" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Ugyldig verdi" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Tilpasset" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Klarte ikke å legge til sanger" #: ../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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Deaktiver visning" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "_Vurdering" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Vurdering" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Rediger visning" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "_Vurdering" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrer på en taggverdi" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrer på _sjanger" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Kø" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Feil" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Skriv" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz spor-ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "mappe" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Albumkolonner" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Skriv" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importer spilleliste" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Gi nytt navn" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Klarte ikke å lagre sangen" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Ingen programtillegg funnet" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Sangtekst" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Sangtekst" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Spillelister" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Klarte ikke å importere spilleliste" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Å løse ut <b>%s</b> mislyktes." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "_Oppdater bibliotek" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d sang" msgstr[1] "%d sanger" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "_Oppdater bibliotek" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Rediger tagger" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Rediger tagger" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Alle album" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Søk" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "mønster" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Rediger lagrede verdier..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, fuzzy msgid "Configure searches…" msgstr "Farg _søkebetingelser" #: ../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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Bibliotek" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Sjekker monteringspunkt" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Skanner bibliotek" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Skanner %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Vis programmatiske tagger" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "beskrivelse" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Verdi" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Lydtaggredigering" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Ingen sanger er valgt." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtrer på en taggverdi" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtrer på en taggverdi" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Ingen tidsinformasjon" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Klarte ikke å endre navn på filen" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Fil" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, fuzzy msgid "Display help information" msgstr "Vis kortfattet bruksinformasjon" #: ../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> er ikke en gyldig adresse." #: ../quodlibet/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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 sekund" #: ../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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Ingen stasjoner funnet" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Klarte ikke å opprette mappen" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Programtillegg" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Støttede formater: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Lydenhet: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Begynnelse" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "–" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Tid" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Bokmerkenavn" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "mm:ss" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Bokmerker" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtere" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Aldri spilt" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 på _topp" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Ny stasjon" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrer på _sjanger" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrer på _artist" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrer på al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Tilfeldig _sjanger" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Tilfeldig _artist" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Tilfeldig al_bum" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "De 40 mest spilte sangene i biblioteket (det kan være mer enn 40 valgte, om " "det er flere som har vært hørt på like mange ganger)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Ingen tidsinformasjon" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Verdi:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Lagrede verdier" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Rediger lagrede verdier..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Sanger" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Vis gjenværende tid" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Sporkolonner" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Albumkolonner" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Volumjustering med _Replay Gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Ukjent" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrer på en taggverdi" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Filer" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Slett filer" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Flytt til papirkurven" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Flytter %d/%d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Klarte ikke å lagre iPod-database" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Å løse ut <b>%s</b> mislyktes." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Sletter %d/%d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Klarte ikke å slette fil" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, fuzzy msgid "Deleting one or more files failed." msgstr "Å slette <b>%s</b> 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "mangler fra %d sang" msgstr[1] "mangler fra %d sanger" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "forskjellig på %d sang" msgstr[1] "forskjellig over %d sanger" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "Splitt til _flere verdier" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Splitt disk ut av _album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Splitt _versjon ut av tittel" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Splitt arrangør ut av ar_tist" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Splitt _utøver ut av artist" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Splitt _utøver ut av artist" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Splitt _versjon ut av tittel" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Legg til en tagg" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tagg:" #: ../quodlibet/qltk/edittags.py:409 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 "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Aldri" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:657 msgid "Unable to add tag" msgstr "Klarte ikke å legge til tagg" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Klarte ikke å legge til sangen" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Klarte ikke å legge til <b>%s</b>\n" "\n" "De valgte filene støtter ikke flere verdier." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Ugyldig tagg" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Ugyldig tagg <b>%s</b>\n" "\n" "De valgte filene støtter ikke redigering av denne taggen." #: ../quodlibet/qltk/edittags.py:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Ugyldig verdi" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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 #, 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> ble endret mens programmet kjørte. Å lagre uten å oppdatere " "biblioteket kan overskrive endringer i sangen.\n" "\n" "Lagre denne sangen likevel?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Klarte ikke å lagre sangen" #: ../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 "" "Å lagre <b>%s</b> mislyktes. Filen kan være skrivebeskyttet, korrupt, eller " "det kan være at du ikke har rettigheter til å redigere den." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Flere instillinger..." #: ../quodlibet/qltk/entry.py:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Programtillegg" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso-instillinger" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Splitt _på:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Taggredigering" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Mapper" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Ny mappe" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Velg alle undermapper" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Ny mappe" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Skriv inn et navn til den nye mappen:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Klarte ikke å opprette mappen" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Klarte ikke å slette mappen" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "av %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Spor %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Rediger visning" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Ingen sanger er valgt." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Ingen sanger" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informasjon" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Sangtekst" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artister" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "utøvere" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Aldri" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d gang" msgstr[1] "%d ganger" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "lagt til" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "sist spilt" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "ganger spilt" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "hoppet over" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "vurdering" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "lengde" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informasjon" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Ugyldig tegnkoding]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "filstørrelse" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modifisert" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d valgt" msgstr[1] "%d valgte" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Produsert av %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "utøver" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Spor utilgjengelig" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d sang uten album" msgstr[1] "%d sanger uten album" #: ../quodlibet/qltk/information.py:490 msgid "Selected Discography" msgstr "Valgt diskografi" #: ../quodlibet/qltk/information.py:543 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d sang uten artist" msgstr[1] "%d sanger uten artist" #: ../quodlibet/qltk/information.py:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Total lengde:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Total størrelse:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Filer" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Last ned" #: ../quodlibet/qltk/lyrics.py:37 #, fuzzy msgid "_Edit" msgstr "_Rediger 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ingen sangtekst funnet for denne sangen." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Søker etter sangtekst..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Klarte ikke å laste ned sangtekst." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Avvis taggendringer?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Taggene har blitt endret, men ikke lagret. Lagre disse filene, eller " "tilbakestill og avvis endringene?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Aldri" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Filen ekisterer" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Endre navn på filer" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Ukjent" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "I rekkefølge" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_I rekkefølge" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Omstokket" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Omstokket" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Vektet" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Etter vurdering" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Én sang" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Én sang" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Programtilleggfeil" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Deaktiver visning" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Ingen programtillegg funnet" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Programtillegg" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Vis _feil" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Spor" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "gruppering" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Filnavn" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Lengde" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Sangliste" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Hopp til den spillende sangen automatisk" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Når den spillende sangen endres, vil den automatisk blit hoppet til i " "sanglisten" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Annet:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Rediger visning..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Synlige kolonner" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Tittel inkluderer _versjon" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Filnavn inkluderer _mappe" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Instillinger" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Synlige kolonner" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Utforskere" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globalt filter:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Søk" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Når den spillende sangen endres, vil den automatisk blit hoppet til i " "sanglisten" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "_Vurdering" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Albumliste" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Pause avspilling" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "_Utdatalogg" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Volumnivå (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Volumnivå (dB):" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "Volumjustering med _Replay Gain" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "Volumjustering med _Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "_Vurdering" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Lagre vurderinger og statistikk" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_E-post:" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "Vurderinger og statistikk vil bli satt til denne e-postadressen" #: ../quodlibet/qltk/prefs.py:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Avvis taggendringer?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Rediger tagger" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Ny stasjon" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "_Oppdater bibliotek" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Oppdater bibliotek" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Se etter endringer i biblioteket" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "_Gjenlast bibliotek" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Laster inn alle sangene i biblioteket på nytt (dette kan ta lang tid)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "Skann _mapper" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Ingen sanger" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Egenskaper" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Kø" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Fjern alle sanger fra køen" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Tilfeldig" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Begynn spillelisten på nytt når den er ferdig" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Pause avspilling" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Velg mapper" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Klarte ikke å legge til sanger" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> bruker en protokoll som ikke er støttet." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Musikk" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Legg til en mappe..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Legg til en fil..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Legg til en adresse" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Åpne nytt visningsvindu" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Kontroll" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Hopp til spillende sang" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Visning" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Hjelp" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Stopp etter denne sangen" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Bokmerker" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Rediger bokmerker..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Søk" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Sang_liste" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Legg til en adresse" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Skriv inn adressen til en lydfil:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Klarte ikke å legge til adressen" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> er ikke en gyldig adresse." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Legg til musikk" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Overvåk denne mappen for nye sanger" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Vurdering" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Vurdering" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Vurdering" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Erstatt mellomrom med _understreker" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Fjern _Windows-inkompatible tegn" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Fjern diakritiske merker" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Fjern tegn som ikke er en del av _ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Endre navn på filer" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "mønster" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Rediger lagrede verdier..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Forhåndsvisning" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nytt navn" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Klarte ikke å endre navn på filen" #: ../quodlibet/qltk/renamefiles.py:253 #, 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 "" "Å endre navn på <b>%s</b> til <b>%s</b> feilet. Kanskje målfilen allerede " "eksisterer, eller at du ikke har rettigheter til å lage den nye filen eller " "å fjerne den gamle." #: ../quodlibet/qltk/renamefiles.py:261 #, fuzzy msgid "Ignore _All Errors" msgstr "Vis _feil" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Fortsett" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Stien er ikke absolutt" #: ../quodlibet/qltk/renamefiles.py:294 #, 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 root. For å unngå feil navngivning av " "mapper, må du begynne mønsteret med / eller ~/." #: ../quodlibet/qltk/scanbox.py:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Sanger plassert i disse mappene (separert med «:»), vil bli lagt til i " "biblioteket" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "Velg mapper" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Lagrede verdier" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Rediger lagrede verdier..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Søk" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Stopp etter denne sangen" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Grense:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Innflytelse" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrer på %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Albumkolonner" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Sporkolonner" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Albumkolonner" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Personkolonner" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Datokolonner" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Filkolonner" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Produksjonskolonner" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "Kolonne_instillinger..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Spillelister" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Legg til _køen" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopier til enhet" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Fjern fra spillelisten" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Erstatt _understreker med mellomrom" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Tittelversaliser taggene" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Splitt til flere _verdier" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tagger fra sti" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Tagger erstatter de eksisterende" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tagger legges til de eksisterende" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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 kanskje den samme taggen flere ganger, eller har " "ubalanserte parenteser (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:213 msgid "Invalid tags" msgstr "Ugyldige tagger" #: ../quodlibet/qltk/tagsfrompath.py:214 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Ugyldige tagger <b>%s</b>\n" "\n" "De valgte filene støtter ikke redigering av disse taggene." #: ../quodlibet/qltk/textedit.py:138 #, 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 balanserte.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:154 msgid "Edit Display" msgstr "Rediger visning" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Spornummer" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start fr_a:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Totalt antall:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Spiller" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Forhåndsvisning" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "og %d flere..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Lagrer sangene du endret." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Flytter %d/%d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "En spilleliste ved navnet %s eksisterer allerede." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Filsystem" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Vis kortfattet bruksinformasjon" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Vis versjon og opphavsrett" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[valg]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Kommandovalget %r gjenkjennes ikke." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Kommandovalget %r krever et argument." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r er ikke et unikt prefiks." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbit/s" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekund" msgstr[1] "%d sekunder" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minutt" msgstr[1] "%d minutter" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d time" msgstr[1] "%d timer" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dag" msgstr[1] "%d dager" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "sjekk|tittelversaler" #: ../quodlibet/util/massagers.py:31 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Datoen må skrives inn i formatet «YYYY', 'YYYY-MM-DD», eller «YYYY-MM-DD hh:" "mm:ss»." #: ../quodlibet/util/massagers.py:43 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:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain-toppunkt må skrives inn i formatet «x.yy dB»." #: ../quodlibet/util/massagers.py:82 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz-IDer må være i UUID-formatet." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz-ugivelsesstatus må være «official», «promotional» eller " "«bootleg»." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Klarte ikke å redigere sang" #: ../quodlibet/util/songwrapper.py:103 #, 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 "" "Å lagre <b>%s</b> mislyktes. Filen kan være skrivebeskyttet, korrupt, eller " "det kan være at du ikke har rettigheter til å redigere den." #: ../quodlibet/util/string/__init__.py:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Ugyldig tegnkoding]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arrangør" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangører" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arrangør" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "opphavsmann" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "opphavsmenn" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "komponist" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "komponister" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "komponist" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dirigenter" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "dirigent" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "opphavsrett" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "dato" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "beskrivelse" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "sjanger" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "sjanger" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "gruppering" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "språk" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "lisens" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "sted" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "sangtekstforfatter" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organisasjon" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "tittel" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versjon" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "nettsted" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "album-artist" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "spor" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "katalognummer" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "original utgivelsesdato" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "originalt album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "original artist" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "innspillingsdato" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz spor-ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz spor-ID" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz spor-ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist-ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz spor-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM-ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP-PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz-albumstatus" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz-albumtype" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "sporforsterkning" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "sportoppunkt" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "albumforsterkning" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "albumtoppunkt" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Instillinger" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "disker" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "spor" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "sist startet" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "fullt navn" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "monteringspunkt" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "personer" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "år" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "original utgivelsesdato" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Bokmerker" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "format" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Spillelister" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Klarte ikke å åpne filer" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Ugyldig verdi" #~ msgid "Clear search" #~ msgstr "Fjern søk" #~ 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 sang." #~ 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 "lyricists" #~ msgstr "sangtekstforfattere" #~ 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 eksisterer." #, 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 sangene 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 "Sangtekster 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 sangtekst funnet\n" #~ "\n" #~ "Du kan trykke på «Last ned»-knappen for å få Quod Libet til å søke etter " #~ "sangtekster 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 sanger lagret" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz album-ID" #~ msgid "Unable to open audio device" #~ msgstr "Klarte ikke å åpne lydenheten" #~ 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.5.3/po/pt.po����������������������������������������������������������������������������0000644�0001750�0001750�00000534625�12646427550�015373� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "um editor de informações de músicas" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "diretório" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Título" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Gênero" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "N_ota" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Ordenar por:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferências" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Lista de álbuns" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Lista de á_lbuns" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Todos os álbuns" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d álbum" msgstr[1] "%d álbuns" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Mostrar _capas" msgstr[1] "Mostrar _capas" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Músicas sem álbum" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d faixa" msgstr[1] "%d faixas" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d discos" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Todos os álbuns" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Preferências da lista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Mostrar _capas" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Bu_sca inline inclui pessoa" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[opções]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Lista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Padrão inválido" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Desconhecido" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Novo feed" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Entre a localização de um feed de áudio:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Feeds de áudio" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Feeds de áudio" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Download" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Baixar arquivos" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Baixar arquivo" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Impossível adicionar feed" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Atuali_zar biblioteca" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Apagar arquivos" #: ../quodlibet/browsers/audiofeeds.py:501 #, fuzzy, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "Não foi possível importar python-feedparser, navegador de feeds de áudio " "desabilitado." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Navegador de biblioteca" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Desconhecido" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Divide em vári_os valores" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Personalizado" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Remover Estação" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etiqueta" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferências da lista de álbuns" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Desabilitar navegador" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Desabilitar navegador" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Impossível copiar músicas" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Adicionar à biblioteca" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Tipo de arquivo não suportado" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Impossível adicionar estação" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Rádio via Internet" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Baixar arquivos" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nova estação" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "Rádio via _Internet" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nova estação" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Nova estação" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Nova estação" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 #, fuzzy msgid "No Category" msgstr "Nenhuma categoria" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nenhuma estação encontrada" #: ../quodlibet/browsers/iradio.py:812 #, 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:820 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:837 #, fuzzy msgid "Add to Favorites" msgstr "_Adicionar à lista de reprodução" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Remover da lista de reprodução" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Propriedades do aparelho" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Aparelho:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Não montado" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Ponto de montagem:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nome:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Aparelhos externos" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Aparelhos externos" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Ejetar" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Propriedades" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Renomear" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> não está conectado." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copiando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Impossível copiar a música" #: ../quodlibet/browsers/media.py:512 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:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> não pôde ser copiado." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Impossível remover músicas" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Apagando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> não pôde ser apagado." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Impossível apagar música" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Falha ao ejetar <b>%s</b> ." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Impossível ejetar aparelho" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Navegador" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Navegador" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Selecionar _todos" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Todos" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Preferências do navegador" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Listas de reprodução" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "Listas de re_produção" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Remover da lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importar" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nova lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Impossível importar lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Impossível renomear lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importar lista de reprodução" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Nova lista de reprodução" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 msgid "Enter a name for the new playlist:" msgstr "Digite o nome da nova lista de reprodução:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet não está em execução." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "uma biblioteca e um reprodutor de músicas" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[opções]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Exibe a música que está tocando e sai" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Começar a tocar imediatamente" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Ir para a próxima música" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Ir para a música anterior" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Começar a tocar" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pausar reprodução" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Altera o estado tocando/pausado" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Começar a tocar" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Aumenta o volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Diminui o volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Escreve o status (tocando/pausado)" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Oculta a janela principal" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Mostra a janela principal" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Altera a visibilidade da janela principal" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Focaliza o player que está rodando" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Remover filtros de navegador ativo" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Atualizar e re-escanear biblioteca" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Desabilitar navegador" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Mostra a playlist atual" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Mostra conteúdo da fila" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Mostra conteúdo da fila" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet não está em execução." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Sair do Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Avança/retorna na música atual" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Define ou altera a ordem de reprodução" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Liga, desliga ou alterar o modo repetir" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Ajusta o volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Buscar na sua biblioteca" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "busca" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Reproduz um arquivo" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "nome de arquivo" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Avaliar música atual" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Editar o navegador atual" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Abre um novo navegador" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Mostrar ou ocultar a fila" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Mostrar ou ocultar a lista de músicas" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtrar por um valor aleatório" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=valor" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Enfileirar um arquivo ou busca" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nome de arquivo" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Desenfileirar um arquivo ou busca" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumento inválido para '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Tente %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Aparelho desconhecido" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r não é um dispositivos com suporte." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Não foi possível encontrar o media-player-info." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Inicializando o backend de dispositivo." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Tentando '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Não foi possível conectar ao backend de dispositivo." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Backend de dispositivos inicializado." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod não-inicializado" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Você deseja criar uma base de dados vazia nesse iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Ganho de _Volume (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Mostrar _capas" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combinar etiquetas com _múltiplos valores" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Título inclui _versão" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Álbum inclui legenda do _disco" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modelo:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacidade:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Removendo faixa órfã do iPod" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Impossível gravar biblioteca do iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Impossível gravar biblioteca do iPod" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Não foi possível importar python-gpod, suporte ao iPod desabilitado." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Formato do _nome de arquivo:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Remover capas e diretórios não-utilizados" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Codificação Inválida]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Título" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor de informações de músicas" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Valores dependentes da caixa do título" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Preferências do navegador" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 #, fuzzy msgid "Animated On-Screen Display" msgstr "_On-Screen Display" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Tamanho total:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Editar exibição" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Ponderado" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "Saída d_o pipeline:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editar exibição" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Visualizar" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 #, fuzzy msgid "Party" msgstr "_Part" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "1 second" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Personalizado" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Limpar _erros" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Reprodutor de músicas" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Rádio via Internet" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "localização" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Oculta a janela principal" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferências" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Título" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "Nenhuma estação nova" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Não foi possível conectar ao backend de dispositivo." #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "Nenhuma estação nova" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 #, 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:461 #, fuzzy msgid "_Service:" msgstr "Aparelho:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nome:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Outros:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Formato do _nome de arquivo:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "álbums" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Ponderado" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importar lista de reprodução" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Play _song" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 #, fuzzy msgid "Plain text for status when there is no current song" msgstr "Pause/resume the current song" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d música" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Roda do mouse ajusta volume;\n" "Shift e roda do mouse troca de música" #: ../quodlibet/ext/events/trayicon.py:50 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" #: ../quodlibet/ext/events/trayicon.py:56 #, fuzzy msgid "Scroll _Wheel" msgstr "Roda do Mouse" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Mostrar Dicas" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Não tocando" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "Preferências do Ícone" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Reprodutor" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "_Pause" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Pre_vious" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "_Next" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "_Ordem de Reprodução" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repetir" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Parar após essa música" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Navegar pela biblioteca" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Editar Etique_tas" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informação" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Letras" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Letras" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Visualizar" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Set Rating" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Personalizado" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrar por _gênero" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Feeds de áudio" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Entre a localização de um feed de áudio:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Nova lista de reprodução" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Enfileirada" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nunca" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "pico da faixa" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, 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:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Renomear" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Biblioteca" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Oculta a janela principal" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Nome de arquivo" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Impossível gravar música" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Lista de álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamanho" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Busca:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Lista de álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Editar marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editar marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Marcadores" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nome de arquivo" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Faixa" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Título" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nenhum plug-in foi encontrado." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "e %d mais..." msgstr[1] "e %d mais..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo de álbum MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "busca" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo de álbum MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Separar disco de á_lbum" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Navegadores" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Impossível criar pasta" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Lista de faixas" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Tempo" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Selecionar _todos" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Renomear" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 msgid "pattern" msgstr "padrão" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Valor inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Personalizado" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Desabilitar navegador" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Remover Estação" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "New/Edit Playlist" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 #, fuzzy msgid "Skip Count" msgstr "pular contagem" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrar por _gênero" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Enfileirada" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Erros" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Escrever" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "diretório" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Cabeçalhos de á_lbuns" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Escrever" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importar lista de reprodução" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Erro carregando %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Renomear" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Impossível gravar música" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nenhum plug-in foi encontrado." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Letras" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Letras" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Ver e editar tags na música atual" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Listas de reprodução" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Impossível importar lista de reprodução" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "Atuali_zar biblioteca" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d música" msgstr[1] "%d músicas" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Atuali_zar biblioteca" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Todos os álbuns" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Editar valores gravados..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Biblioteca" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Verificando pontos de montagem" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Lendo biblioteca" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Checando %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostrar etiquetas _programáticas" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Muitos erros" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "description" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Valor" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor de informações de músicas" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nenhuma música selecionada." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_Remover Estação" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Remove tag selecionada" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Nenhuma informação de tempo" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Impossível renomear arquivo" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Remove tag selecionada" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Arquivo" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nenhum dispositivo de som encontrado" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Saída do pipeline do GStreamer inválida, tentando o padrão." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Impossível criar saída de áudio" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Plug-ins" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Formatos suportados: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Dispositivo de som: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Início" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Tempo" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nome do marcador" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Marcadores" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtros" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Nunca reproduzidas" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 _mais" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "All songs" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrar por _gênero" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrar por _artista" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrar por ál_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "_Gênero aleatório" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "_Artista aleatório" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Ál_bum aleatório" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Nenhuma informação de tempo" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Valor:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Valores gravados" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Editar valores gravados..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Músicas" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Mostra tempo restante" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Cabeçalhos de Faixa" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Cabeçalhos de á_lbuns" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajuste de volume de ganho de reprodução" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Desconhecido" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Houve um erro" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Arquivos" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Apagar arquivos" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mover para a lixeira" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Movendo %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Impossível gravar biblioteca do iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Falha ao ejetar <b>%s</b> ." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Apagando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Impossível apagar arquivo" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Divide em vári_os valores" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Separar disco de á_lbum" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Separar _versão de título" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Separar arranjador de ar_tista" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Separar _intérprete de artista" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Separar _intérprete de artista" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Separar _versão de título" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Adicionar uma etiqueta" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "Etique_ta:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Impossível adicionar etiqueta" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Impossível adicionar música" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Etiqueta inválida" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Valor inválido" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Plug-ins" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Preferências do Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Separar _em:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Edição de etiquetas" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Pastas" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Nova pasta" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Selecionar todas as subpastas" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nova pasta" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Entre com o nome da nova pasta:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Impossível criar pasta" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Impossível remover pasta" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "por %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Faixa %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Editar exibição" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nenhuma música selecionada." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Nenhuma música" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informação" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Letras" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artistas" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "intérpretes" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nunca" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "adicionado" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "reproduzida pela última vez" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "reproduz" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "pula" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "classificação" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "duração" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informação" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Codificação Inválida]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "taxa de bits" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "tamanho do arquivo" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modificado" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selecionado" msgstr[1] "%d selecionados" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Produzido por %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "intérprete" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Faixa indisponível" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Discografia selecionada" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "álbums" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Duração total:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Tamanho total:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Arquivos" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Letras dessa música não encontradas" #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Buscando letras..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Impossível baixar letras" #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Descartar mudanças?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nunca" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Arquivo existe" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Renomear arquivos" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet está rodando" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Desconhecido" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Em ordem" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "Em _ordem" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Embaralhar" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Embaralhado" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Ponderado" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Ponderado" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Uma música" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Uma música" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Erros dos plug-ins" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Habilitado" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Desabilitado" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Nenhuma categoria" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nenhum plug-in foi encontrado." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Plug-ins" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Mostrar _erros" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Faixa" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "agrupamento" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Ál_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Nome de arquivo" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "Du_ração" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Lista de músicas" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Pular automaticamente para a música atualmente sendo reproduzida" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Outros:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Editar display..." #: ../quodlibet/qltk/prefs.py:95 #, fuzzy msgid "Add or remove additional column headers" msgstr "Set and save column headers" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Colunas visíveis" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Bu_sca inline inclui pessoa" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Nome de arquivo inclui _pasta" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferências" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Colunas visíveis" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Navegadores" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Filtro global:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Buscar" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Confirmar _múltiplas classificações" #: ../quodlibet/qltk/prefs.py:256 #, 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:259 msgid "Enable _one-click ratings" msgstr "Habilitar classificação de u_m clique" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Classificações" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Usar cantos arredondados nas miniaturas" #: ../quodlibet/qltk/prefs.py:274 #, 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." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Lista de álbuns" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Pausar reprodução" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Registro de saída" #: ../quodlibet/qltk/prefs.py:344 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:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Ganho de fall-back (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Ganho de pre-amp (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "Habilitar o ajuste de volume de ganho de _replay" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Ajuste de volume de ganho de reprodução" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Set Rating" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Classificações" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Salvar _classificações e contagem de reproduções" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Descartar mudanças?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Nova estação" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "Atuali_zar biblioteca ao iniciar" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Atuali_zar biblioteca" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Checar por mudanças na biblioteca" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Re_carregar biblioteca" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Escanear _diretórios" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Nenhuma música" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Propriedades" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Fila de reprodução" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Remover todas as músicas da fila de reprodução" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "A_leatório" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Reiniciar a lista de reprodução quando acabado" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Pausar reprodução" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Selecionar diretórios" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Impossível adicionar músicas" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> utiliza um protocolo não-suportado." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Música" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Adicionar uma pasta..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Adicionar um arquivo..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Adicionar uma localização" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Abre um novo navegador" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Controle" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Ir para a música atual" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Ver" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "A_juda" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Parar após essa música" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Marcadores" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editar marcadores..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "_About" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Buscar" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Lista de músicas" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Adicionar uma localização" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Entre a localização de um arquivo de som:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Impossível adicionar estação" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, 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:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Adicionar música" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Buscar nessa pasta por novas músicas" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "N_ota" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Remover Estação" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Remover Estação" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Substituir espaços por _underscores" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Substituir caracteres incompatíveis com o _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Retirar _marcas diacríticas" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Substituir caracteres não-_ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Renomear arquivos" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "Invalid Pattern" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Editar valores gravados..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Visualizar" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Novo nome" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Impossível renomear arquivo" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Ignorar _todos os erros" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continue" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Caminho não é absoluto" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Selecionar diretórios" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Valores gravados" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Editar valores gravados..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Buscar" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Procurar após digi_tar" #: ../quodlibet/qltk/searchbar.py:122 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:177 msgid "_Limit:" msgstr "_Limite:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Ponderado" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrar em %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Cabeçalhos de á_lbuns" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Cabeçalhos de Faixa" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Cabeçalhos de á_lbuns" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Cabeçalhos de _pessoas" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Cabeçalhos de _data" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Cabeçalhos de _filtros" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Cabeçalhos de p_rodução" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "Per_sonalizar cabeçalhos" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Listas de reprodução" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Adicionar à _fila" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copiar para o aparelho" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Remover da Biblioteca" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Substituir _underscores por espaços" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Valores dependentes da caixa do título" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "_Separar em múltiplos valores" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Etiquetas do caminho do arquivo" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Etiquetas substituem outras preexistentes" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Etiquetas são adicionadas a outras" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Etiquetas inválidas" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Editar exibição" #: ../quodlibet/qltk/tracknumbers.py:37 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:53 msgid "_Total tracks:" msgstr "Faixas ao _todo:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "_Pause" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "Pre_vious" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "e %d mais..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Gravando as músicas alteradas." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Movendo %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, 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:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Sistema de arquivos" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "W: " #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "W: " #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E: " #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Mostra breve instrução de uso" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Mostra versão e copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opções]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Opção %r não reconhecida." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Opção %r requer um parâmetro." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r não é um prefixo único." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dia" msgstr[1] "%d dias" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Impossível editar música" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Codificação Inválida]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "álbum" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arranjador" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arranjadores" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arranjador" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autores" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "compositor" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "compositores" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "compositor" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "condutor" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "condutores" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "condutor" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contato" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "descrição" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "gênero" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "gênero" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "agrupamento" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "língua" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licença" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "localização" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "compositor" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organização" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "título" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versão" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "site" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "artista do álbum" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "legenda do álbum" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "faixa" # label ID #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "identificador de rótulo" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "data original de lançamento" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "álbum original" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "artista original" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "data de gravação" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID de artista MusicBrainz" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "ID de TRM MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "ID de álbum MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Tipo de álbum MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "ganho da faixa" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "pico da faixa" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "ganho do álbum" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "pico do álbum" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "referência de loudness" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discos" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "faixas" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "reproduzida pela última vez" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "nome completo" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "ponto de montagem" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "pessoas" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "ano" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "data original de lançamento" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "favoritos" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "formato" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Listas de reprodução" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Limpar busca" #~ 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 "lyricists" #~ msgstr "letristas" #~ 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.5.3/po/es.po����������������������������������������������������������������������������0000644�0001750�0001750�00000535522�12646427550�015354� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "un editor de etiquetas de audio" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "ruta" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Título" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "F_echa" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Estilo" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Puntuación" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Ordenar _por:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferencias" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Lista de álbumes" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Lista de á_lbumes" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Todos los álbumes" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d álbum" msgstr[1] "%d álbumes" #: ../quodlibet/browsers/albums/main.py:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Canciones sin álbum" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d pista" msgstr[1] "%d pistas" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d discos" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Todos los álbumes" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Preferencias de la lista de álbumes" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Mostrar _carátulas" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "La _búsqueda incluye los \"componentes\"" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[opciones]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Vista de álbumes" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Patrón inválido" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Desconocido" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nueva fuente (feed)" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Introduce la direcciónde la fuente de audio (feed)" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Fuentes de audio" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "Fuentes de _audio" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Descargar" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Descargar archivos" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Descargar archivo" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "No ha sido posible añadir la fuente" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Ac_tualizar la colección" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Eliminar los archivos" #: ../quodlibet/browsers/audiofeeds.py:501 #, fuzzy, python-format 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." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Navegador de la colección" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Desconocido" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Extraer en valores _múltiples" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Personalizada" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Eliminar la emisora" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etiqueta" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Unir" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferencias de la lista de álbumes" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Desactivar el navegador" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Desactivar el Navegador" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Sistema de archvos" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "Sistema de _archivos" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "No ha sido posible copiar las canciones" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Añadir a la colección" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Tipo de archivo no admitido" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "No se ha podido añadir la emisora" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Radio por Internet" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Descargar archivos" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nueva emisora" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Clásica" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "Radio por _Internet" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nueva emisora" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Nueva emisora" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Nueva emisora" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Favoritos" #: ../quodlibet/browsers/iradio.py:591 #, fuzzy msgid "No Category" msgstr "Sin categoría" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "No se han encontrado emisoras" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "No se han encontrado emisoras en %s." #: ../quodlibet/browsers/iradio.py:820 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:837 #, fuzzy msgid "Add to Favorites" msgstr "_Añadir a la lista" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Eliminar de la lista" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Propiedades del dispositivo" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Dispositivo:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "No montado" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Punto de montaje:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nombre" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Dispositivos externos" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "Dispositivos _externos" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Expulsar" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Propiedades" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Cambiar el nombre" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> no está conectado." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copiando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "No se ha podido copiar la canción" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "No hay espacio libre suficiente para esta canción" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "No se ha podido copiar <b>%s<b>." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "No se han podido eliminar las canciones" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Eliminando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "No ha podido eliminarse <b>%s</b>.." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "No se ha podido eliminar la canción" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Error al expulsar <b>%s</b>." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "No ha sido posible expulsar el dispositivo" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Vista en paneles" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Vista en paneles" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Seleccionar _todo" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Todo" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Preferencias de la vista por paneles" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Listas" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Listas" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Eliminar de la lista" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importar" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nueva lista" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "No ha sido posible importar la lista de reproducción" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "No ha sido posible cambiar el nombre de la lista" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importar lista" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Nueva lista" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Introduce un nombre para la nueva carpeta" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet no está siendo ejecutado" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "un gestor y reproductor de música" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[opciones]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Muestra la canción reproducida y termina" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Comenzar a reproducir de inmediato" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Saltar hasta la siguiente canción" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Volver a la canción anterior" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Comenzar la reproducción" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Parar la reproducción" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Alternar reproducir y parar" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Comenzar la reproducción" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Subir el volumen" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Bajar el volumen" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Mostrar el estado del reproductor" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Esconder la ventana principal" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Mostrar la ventana principal" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Alternar la visibilidad de la ventana principal" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Centrarse en el reproductor" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Eliminar los filtros de navegación activos" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Actualizar y analizar de nuevo la colección" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Desactivar el navegador" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Mostrar la lista de reproducción" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Mostrar las canciones en la cola de reproducción" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Mostrar las canciones en la cola de reproducción" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Comenzar sin extensiones" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet no está siendo ejecutado" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Salir de Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Avanzar en la canción activa" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Configurar o alternar el orden de reproducción" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Activar o desactivar el modo repetición" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Ajustar el volumen" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Buscar en la colección" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "búsqueda" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Reproducir un archivo" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "nombre del archivo" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Puntuar la canción activa" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Configurar el navegador actual" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Abrir un nuevo navegador" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Mostrar o esconder la cola de reproducción" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Mostrar o esconder la lista principal de canciones" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtro en un valor aleatorio" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "etiqueta" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "etiqueta=valor" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Poner en cola un archivo o búsqueda" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Añadir nombres de archivo separados por comas a la cola" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nombre del archivo" #: ../quodlibet/cli.py:135 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:137 msgid "Unqueue a file or query" msgstr "Eliminar de la cola un archivo o búsqueda" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumento inválido para '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Intenta %s --help" #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Dispositivo desconocido" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r no es un dispositivo admitido." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: no se ha podido encontrar media-player-info" #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Activando la infraestructura de dispositivos." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Intentando '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "No se ha podido conectar a una infraestructura de dispositivos" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "La infraestructura de dispositivos ha sido iniciada." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod sin configurar" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Deseas crear una base de datos vacía en este iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Ganancia de _volumen (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copiar las _carátulas del álbum" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combinar las etiquetas con valores _múltiples" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "El título incluye la _versión" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "El álbum incluye el _subtítulo" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modelo:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacidad:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Eliminando pistas huérfanas del iPod" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "No ha sido posible guardar la base de datos del iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "No ha sido posible guardar la base de datos del iPod" #: ../quodlibet/devices/ipod.py:455 #, 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." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Patrón para el nombre de _archivo:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Eliminar las portadas de discos y las carpetas sin utilizar" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID MusicBrainz de la pista" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Codificación inválida]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Título" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor de etiquetas de audio" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "C_on mayúscula inicial los valores resultantes" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Preferencias de la vista por paneles" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Tamaño total:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Editar la vista" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Importancia" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Infraestructura de salida de sonido:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editar la vista" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Prever" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_mática" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_mática" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d segundo" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Personalizada" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Eliminar errores" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Reproductor de música" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Radio por Internet" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "ubicación" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Esconder la ventana principal" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferencias" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Título" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "No existen emisoras nuevas" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "No se ha podido conectar a una infraestructura de dispositivos" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "No existen emisoras nuevas" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Dispositivo:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nombre" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Otras:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Patrón para el nombre de _archivo:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Ál_bum aleatorio" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "álbumes" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Importancia" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Ál_bum aleatorio" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importar lista" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Sin reproducción" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d canción" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "patrón" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" 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.py:50 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" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Rueda del _Ratón" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Editar vista" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Sin reproducción" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "Preferencias del Icono" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Listas" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Reproductor" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Prever" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Siguiente" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "_Orden de reproducción" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repetir" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Parar después de esta canción" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Examinar la colección" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Editar las _etiquetas" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Información" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Prever" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Predefinida" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Personalizada" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrar por _género" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Fuentes de audio" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Introduce la direcciónde la fuente de audio (feed)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Nueva lista" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "En cola" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nunca" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "pico de ganancia de la pista" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, 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:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Cambiar el nombre" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Colección" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Esconder la ventana principal" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Nombre del archivo" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "No ha sido posible guardar la canción" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Lista de álbumes" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamaño" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Buscar" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Lista de álbumes" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Editar los marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editar los marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Marcadores" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nombre del archivo" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Pista" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Título" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "No se ha encontrado extensión alguna" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "y %d más..." msgstr[1] "y %d más..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo de álbum según MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "búsqueda" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo de álbum según MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Extraer el disco del ál_bum" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Navegadores" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "No se ha podido crear la carpeta" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Lista de pistas" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Posición" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Seleccionar _todo" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Cambiar el nombre" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Patrón inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Valor inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Personalizada" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Desactivar el navegador" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Eliminar la emisora" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Editar la vista" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 #, fuzzy msgid "Skip Count" msgstr "saltar el contador" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrar por _género" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "En cola" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Errores" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Guardar" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID MusicBrainz de la pista" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "ruta" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Cabeceras de _álbumes" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Guardar" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Error al cargar %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Cambiar el nombre" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "No ha sido posible guardar la canción" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "No se ha encontrado extensión alguna" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Letra" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Letra" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Ver y editar las etiquetas de la canción reproducida" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Listas" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "No ha sido posible importar la lista de reproducción" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "Ac_tualizar la colección" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d canción" msgstr[1] "%d canciones" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Ac_tualizar la colección" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Todos los álbumes" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "patrón" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Editar los valores guardados..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Colección" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Comprobando los puntos de montaje" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Analizando la colección" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Analizando %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Error al abrir el archivo: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Mostrar las etiquetas" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Mostrar salida para depuración" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, 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:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostrar _mensajes adicionales para depuración" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Sin argumentos suficientes" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Demasiados errores" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "descripción" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Valor" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Mostrar las etiquetas habituales" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Copiar las etiquetas de un archivo a otro" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Mostrar los cambios, sin aplicarlos" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Saltar las etiquetas que no se puedan escribir" #: ../quodlibet/operon/commands.py:135 #, 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:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor de etiquetas de audio" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "No se ha seleccionado canción alguna" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Establecer una etiqueta y eliminar los valores existentes" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "No se ha podido establecer %r" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_Eliminar la emisora" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "El valor es una expresión regular" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "No se puede combinar '--all' con '--regexp'" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "No se ha podido eliminar %r de %r" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "No existe información sobre la duración" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Error al abrir el archivo: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/operon/commands.py:552 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "Renombrar los archivos según las etiquetas" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "Rellenar las etiquetas según la ruta al archivo" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Archivo" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Rellenar los números de pista de todos los archivos" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "Mostrar las etiquetas basándose en el patrón indicado" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Llenando el buffer" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "No se ha podido crear la pipeline GStreamer predefinida" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "No se encontró dispositivo de sonido" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Salida de GStreamer inválida, intentando la predeterminada." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "No fue posible generar salida de audio" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, 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:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Extensiones" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Formatos admitidos: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Dispositivo de sonido: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Comienzo" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Posición" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nombre del marcador" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Marcadores" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtros" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Nunca reproducidas" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Añadidas _recientemente" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 más _eschuchadas" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Nueva emisora" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrar por _género" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrar por _artista" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrar por ál_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "_Género aleatorio" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "_Artista aleatorio" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Ál_bum aleatorio" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "No existe información sobre la duración" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Valor:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Valores guardados" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Editar los valores guardados..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Canciones" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Mostrar el tiempo restante" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_mática" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Cabeceras de _fichero" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Cabeceras de _álbumes" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajuste de volumen _replay gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Desconocido" #: ../quodlibet/qltk/data_editors.py:349 #, fuzzy msgid "Tag expression" msgstr "El valor es una expresión regular" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Ha ocurrido un error" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 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." #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Archivos" #: ../quodlibet/qltk/delete.py:59 #, 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:68 #, 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:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Eliminar los archivos" #: ../quodlibet/qltk/delete.py:105 #, 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:114 #, 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mover a la papelera" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Moviendo %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "No ha sido posible guardar la base de datos del iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Error al expulsar <b>%s</b>." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Eliminando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "No se ha podido eliminar el archivo" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Extraer en valores _múltiples" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Extraer el disco del ál_bum" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Extraer la _versión del título" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Extraer el arreglista del ar_tista" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Extraer el _intérprete del artista" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Extraer el _intérprete del artista" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Extraer la _versión del título" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Añadir una etiqueta" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Etiqueta:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "No se ha podido añadir la etiqueta" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "No a sido posible añadir la canción" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Etiqueta inválida" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Valor inválido" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Extensiones" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Configuración de Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Extraer _de:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Edición de etiquetas" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Directorio" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Nueva carpeta" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "Seleccionar todas las carpetas subordinadas" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nueva carpeta" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Introduce un nombre para la nueva carpeta" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "No se ha podido crear la carpeta" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "No se ha podido eliminar la carpeta" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "por %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Pista %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Editar la vista" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "No se ha seleccionado canción alguna" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Sin canciones" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Información" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Letra" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artistas" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "intérpretes" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nunca" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] " %d vez" msgstr[1] " %d veces" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "añadida" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "última reproducción" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "contador" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "saltada" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "puntuación" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "duración" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Información" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Ascendiente" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "tasa de bits" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "tamaño" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modificada" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d seleccionada" msgstr[1] "%d seleccionadas" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Producido por %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "intérprete" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Pista no disponible" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Discografía seleccionada" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "álbumes" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Duración total:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Tamaño total:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Archivos" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Descargar" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../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:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Buscando la letra de la canción..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "No ha sido posible descargar la letra." #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 #, 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:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "¿ Descartar las modificaciones en las etiquetas?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nunca" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "El archivo ya existe" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Cambiar el nombre del archivo" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Tareas activas" #: ../quodlibet/qltk/notif.py:187 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet está siendo ejecutado" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Desconocido" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "En orden" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_En orden" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Aleatoriamente" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Aleatoriamente" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Dinámica" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Dinámica" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Una canción" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Una canción" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Errores en las extensiones" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Activado" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Desactivado" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Sin categoría" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "No se ha encontrado extensión alguna" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Extensiones" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Mostrar _Errores" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "Pis_ta" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "agrupación" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Ál_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Nombre de _archivo" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "Durac_ión" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Lista de canciones" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Ir automáticamente a la canción reproducida" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Comportamiento" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Otras:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Editar la vista..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Añadir o eliminar columnas de información adicional" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Columnas visibles" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "La _búsqueda incluye los \"componentes\"" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "El nombre incluye la _carpeta" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferencias" #: ../quodlibet/qltk/prefs.py:138 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:221 #, fuzzy msgid "Edit Columns" msgstr "Columnas adicionales" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Navegadores" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Filtro _globale:" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Buscar" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Confirmar la puntuación _múltiple" #: ../quodlibet/qltk/prefs.py:256 #, 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:259 msgid "Enable _one-click ratings" msgstr "Activar las puntuaciones con _un click" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Puntuaciónes" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Utilizar esquinas redondeadas en las miniaturas de las imágenes" #: ../quodlibet/qltk/prefs.py:274 #, 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." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Preferir la carátula _incrustada" #: ../quodlibet/qltk/prefs.py:282 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:287 #, fuzzy msgid "_Fixed image filename:" msgstr "Nombre _forzoso de la imagen:" #: ../quodlibet/qltk/prefs.py:289 #, 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:295 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:304 #, fuzzy msgid "Album Art" msgstr "Lista de álbumes" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Parar la reproducción" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Registro" #: ../quodlibet/qltk/prefs.py:344 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:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Ganancia por defecto (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Ganancia de _volumen (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "Activar el ajuste de volumen _replay gain" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Ajuste de volumen _replay gain" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Predefinida" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Puntuaciónes" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "Cantidad de la media _Bayesiana:" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Guardar puntuaciones y co_ntadores" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "Correo _electrónico:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "¿ Descartar las modificaciones en las etiquetas?" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. 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:579 #, fuzzy msgid "Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Nueva emisora" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "A_ctualizar la colección al iniciar" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Ac_tualizar la colección" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Buscar cambios en la colección" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Rec_argar la colección" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Analizar _Carpetas" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Sin canciones" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Propiedades" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Cola de reproducción" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Elimina todas las canciones de la cola de reproducción" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "Aleato_rio" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Reinicia la lista de reproducción al terminar" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Parar la reproducción" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Seleccionar Directorios" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "No ha sido posible añadir las canciones" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> utiliza un protocolo no permitido." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Música" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Añadir un directorio..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Añadir un archivo..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Añadir una dirección" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Abrir un nuevo navegador" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Ir a la canción reproducida" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Ver" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Ayuda" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Parar después de esta canción" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Marcadores" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editar los marcadores..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Ayuda en Internet" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Buscar" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Lista de canciones" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Añadir una dirección" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Introduce la ubicación del archivo de audio" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "No ha sido posible añadir la dirección" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, 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:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Añadir música" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Monitorizar este directorio en busca de nuevas canciones" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 #, fuzzy msgid "The saved ratings will be removed" msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 #, fuzzy msgid "Change _Rating" msgstr "_Puntuación" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Eliminar la emisora" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Eliminar la emisora" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Reemplazar los espacios con _guiones bajos" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Eliminar los caracteres incompatibles con _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Eliminar las marcas _diacríticas" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Eliminar los caracteres no-_ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Utilizar únicamente caracteres en minúscula" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Cambiar el nombre del archivo" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "patrón" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Editar los valores guardados..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Prever" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nuevo nombre" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "No ha sido posible cambiar el nombre del archivo" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "_Ignorar todos los errores" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continuar" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "La dirección no es absoluta" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Seleccionar Directorios" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Valores guardados" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Editar los valores guardados..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Buscar" #: ../quodlibet/qltk/searchbar.py:71 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:119 msgid "Search after _typing" msgstr "Buscar despues de _escribir" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Mostrar los resultados después de terminar de escribir." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "Lím_ite:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Importancia" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrar por %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Cabeceras de _álbumes" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Cabeceras de _fichero" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Cabeceras de _álbumes" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Cabeceras de los _componentes" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Cabeceras de la _fecha" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Cabeceras de _archivo" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Cabeceras de la _producción" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizar cabeceras..." #: ../quodlibet/qltk/songlist.py:1097 #, fuzzy msgid "_Expand Column" msgstr "Columnas adicionales" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Listas" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Añadir a la _cola" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copiar al dispositivo" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Eliminar de la Colección" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Reemplazar _guiones bajos por espacios" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "C_on mayúscula inicial los valores resultantes" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Extraer en valores _múltiples" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Etiquetas a partir de la dirección" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Las etiquetas reemplazan a las existentes" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Las etiquetas se añaden a las existentes" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Etiquetas inválidas" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Editar la vista" #: ../quodlibet/qltk/tracknumbers.py:37 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:53 msgid "_Total tracks:" msgstr "Pistas _totales:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Reproductor" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Prever" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "y %d más..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Guardando las canciones modificadas..." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Moviendo %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, 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:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Vista de sistema de ficheros" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "A:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "A:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Muestra información sumaria sobre los distintos comandos" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Muestra la versión y el copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opciones]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Opción %r no reconocida." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "La opción %r requiere un argumento." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r no es un prefijo único" #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d día" msgstr[1] "%d días" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "La title case no se ajusta a las reglas del español." #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 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:102 msgid "Unable to edit song" msgstr "No ha sido posible editar la canción" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Codificación inválida]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "álbum" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arreglista" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arreglistas" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arreglista" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autores" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "compositor/a" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "compositores/as" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "compositor/a" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "director/a" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "directores/as" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "director/a" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contacto" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "fecha" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "descripción" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "estilo" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "estilo" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "agrupación" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "idioma" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licencia" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "ubicación" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "letrista" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "compañía" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "título" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versión" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "página de Internet" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "artista del álbum" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "parte" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "pista" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "número de catálogo" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "fecha de publicación original" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "álbum original" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "artista original" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "fecha de grabación" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID MusicBrainz de la pista" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID MusicBrainz de la publicación" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "ID MusicBrainz de la publicación" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID MusicBrainz del artista" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID MusicBrainz de la publicación" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "ID MusicBrainz del TRM" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "PUID de MusicIP" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Estado del álbum según MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Tipo de álbum según MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "ganancia de volumen de la pista" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "pico de ganancia de la pista" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "ganancia de volumen del álbum" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "pico de ganancia del álbum" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Preferencias" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discos" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "pistas" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "comenzada por última vez" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "nombre completo" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "punto de montaje" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "componentes" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "año" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "fecha de publicación original" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "marcador" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "formato" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Listas" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Borrar la búsqueda" #~ 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 "lyricists" #~ msgstr "letristas" #~ 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 "_Song" #~ msgstr "Canció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.5.3/po/gl.po����������������������������������������������������������������������������0000644�0001750�0001750�00000531426�12646427550�015346� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "um editor de etiquetas de música" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "cartafol" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Título" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Estilo" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Qualificaçom" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Ordenar _por:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferências" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Lista de Álbuns" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Lista de _Álbuns" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Todos os Álbuns" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d álbum" msgstr[1] "%d álbuns" #: ../quodlibet/browsers/albums/main.py:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Canções sem álbum" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d pista" msgstr[1] "%d pistas" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d discos" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Todos os Álbuns" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Preferências da Lista de Álbuns" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Mostrar _cobertas dos discos" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "A procura _inclúi \"componentes\"" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[opções]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Vista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Padrom inválido" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Desconhecido" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nova Fonte" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Por favor, introduça a localizaçom da fonte (feed):" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Fontes de Áudio (feeds)" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "Fontes de _Áudio (feeds)" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Baixar" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Baixar os arquivos" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Baixar o arquivo" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Non foi possível engadir a fonte" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Ac_tualizar a colecçom" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Eliminar os ficheiros" #: ../quodlibet/browsers/audiofeeds.py:501 #, fuzzy, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "Nom se puido importar o python-feedparser. Desactivou-se o navegador de " "fontes (feeds) " #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Navegador da Colecçom" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Desconhecido" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Extraer em valores _múltiplos" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Personalizada" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Eliminar Emisora" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etiqueta" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Juntar" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferências da Lista de Álbuns" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Desactivar o Navegador" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Desactivar o Navegador" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "Sistema de _arquivos" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Nom foi possível copiar as canções" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Engadir à Colecçom" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Tipo de arquivo nom admitido" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Nom foi possível engadir a emisora" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Radio por Internet" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Baixar os arquivos" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nova Emisora" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Clássica" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "Radio por _Internet" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nova Emisora" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Nova Emisora" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Nova Emisora" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Prediletos" #: ../quodlibet/browsers/iradio.py:591 #, fuzzy msgid "No Category" msgstr "Sem categoria" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nom se atopárom emisoras" #: ../quodlibet/browsers/iradio.py:812 #, 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:820 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:837 #, fuzzy msgid "Add to Favorites" msgstr "_Engadir à lista" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "Elimina_r da Lista" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Propriedades do dispositivo" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Dispositivo:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Nom está montado" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Ponto de montagem:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nome:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Dispositivos externos" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "Dispositivos _externos" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Expulsar" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Propriedades" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Mudar o nome" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nom está conectado." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "A copiar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Non foi possível copiar a cançom" #: ../quodlibet/browsers/media.py:512 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:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nom puido ser copiada." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Nom se puidérom eliminar as canções" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "A eliminar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nom se puido eliminar." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Non foi possível eliminar a cançom" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Erro ao expulsar <b>%s</b>." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Nom foi possível expulsar o dispositivo" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Vista em paneis" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Vista em paneis" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Seleccionar _tudo" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Tudo" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Preferências do Navegador em paneis" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Listas" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Listas" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Elimina_r da Lista" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importar" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nova Lista" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Non foi possível importar a lista" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Non foi possível mudar o nome da lista" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importar lista" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Nova Lista" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Introduz um nome para o novo cartafol:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "O Quod Libet nom está a ser executado." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "um gestor de música e reprodutor" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[opções]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Mostra a cançom que se está a reproduzir" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Começar a tocar imediatamente" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Ir à cançom seguinte" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Ir à cançom anterior" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Começar a reproduçom" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Parar a reproduçom" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Alternar entre reproduzir e parar" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Começar a reproduçom" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Aumentar o volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Diminuir o volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Mostrar o estado do reprodutor" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Agochar a fiestra principal" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Mostrar a fiestra principal" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Alternar entre mostrar e agochar a fiestra principal" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Centrar-se no reprodutor actual" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Eliminar os filtros de navegaçom activos" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Reler e actualizar a colecçom" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Desactivar o Navegador" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Mostrar a lista de reproduçom actual" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Mostrar o conteúdo da fileira" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Mostrar o conteúdo da fileira" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Começar sem extensões" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "O Quod Libet nom está a ser executado." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Sair do Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Avançar na cançom reproduzida" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Configurar ou alternar a ordem de reproduçom" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Activar ou desactivar o modo repetiçom" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Configurar o volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Procurar na colecçom" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "procura" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Reproduzir um arquivo" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "nome do ficheiro" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Qualificar a cançom activa" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Configurar o navegador activo" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Abrir um novo navegador" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Mostrar ou agochar a fileira" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Mostrar ou agochar a lista principal" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtro num valor aleatório" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "etiqueta" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "etiqueta=valor" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Pôr na fileira un arquivo ou procura" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Engadir à fileira nomes de arquivo separados por comas" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nome do ficheiro" #: ../quodlibet/cli.py:135 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:137 msgid "Unqueue a file or query" msgstr "Eliminar da fileira um arquivo ou procura" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumento inválido para '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Tenta %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Dispositivo desconhecido" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r nom é um dispositivo admitido." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Nom se puido achar media-player-info." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "A iniciar a infraestrutura de dispositivos." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "A tentar '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Nom se puido conectar a unha infraestrutura gestora de dispositivos." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Iniciou-se a infraestrutura de dispositivos." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod sem configurar" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Desejas criar umha base de dados baleira neste iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Ganância do _volume (dB)" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copiar as _cobertas dos discos" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combinar as etiquetas com múltiplos _valores" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "O título inclúi a _versom" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "O album inclúi o subtítulo do _disco / parte" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modelo:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacidade:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "A eliminar pista orfã do iPod" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Nom foi possível guardar a base de dados do iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Nom foi possível guardar a base de dados do iPod" #: ../quodlibet/devices/ipod.py:455 #, 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." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Padrom para o _nome:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Eliminar cobertas e cartafoles nom utilizados" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID do MusicBraniz da pista" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Codificaçom inválida]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Título" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor de etiquetas de áudio" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Letras capitais nas etiquetas" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Preferências do Navegador em paneis" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Tamanho total:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Editar a vista" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Importância" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "Infraestrutura de _saída:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editar a vista" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Antever" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_mática" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_mática" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d segundo" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Personalizada" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Eliminar os erros" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Reprodutor de música" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Radio por Internet" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "endereço" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Agochar a fiestra principal" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferências" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Título" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "Nom há novas emisoras" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Nom se puido conectar a unha infraestrutura gestora de dispositivos." #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "Nom há novas emisoras" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Dispositivo:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nome:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Outros:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Padrom para o _nome:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "álbuns" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Importância" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importar lista" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Parado" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d cançom" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "padrom" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "A roda do rato axusta o volume;\n" "Shift e a roda do rato muda de cançom" #: ../quodlibet/ext/events/trayicon.py:50 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" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Roda do _Rato" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Editar vista" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Parado" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "Preferências da Ícona" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Reprodutor" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "_Parar" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Antever" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Seguinte" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "Ordem de Repr_oduçom" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repetir" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Parar despois desta cançom" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Examinar a colecçom" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Editar as _etiquetas" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informaçom" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Antever" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrar no _artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Predefinido" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Personalizada" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrar no e_stilo" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrar no _artista" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Fontes de Áudio (feeds)" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, 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_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Nova Lista" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Na fileira" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nunca" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "pico de ganância da pista" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, 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:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Mudar o nome" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Colecçom" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Agochar a fiestra principal" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Nome do ficheiro" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Nom foi possível guardar a cançom" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Lista de Álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamanho" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Procurar:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Lista de Álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Editar os marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editar os marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Marcadores" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nome do ficheiro" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Pista" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Título" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "_Artista" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nom se atopárom extensões." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "e %d mais..." msgstr[1] "e %d mais..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo de álbum segundo MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "procura" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo de álbum segundo MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Extraer o disco do _Álbum" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Navegadores" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Nom foi possível criar o cartafol" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Lista de pistas" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Intre" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Seleccionar _tudo" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Mudar o nome" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Padrom inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Valor inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Personalizada" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Desactivar o Navegador" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Eliminar Emisora" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Editar a vista" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 #, fuzzy msgid "Skip Count" msgstr "saltar contador" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Extrair as imagens incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Extrair as imagens incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrar no e_stilo" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Na fileira" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Erros" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Guardar" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID do MusicBraniz da pista" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "cartafol" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Cabeceiras dos _álbuns" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Guardar" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Erro ao carregar %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Mudar o nome" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Nom foi possível guardar a cançom" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nom se atopárom extensões." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Letra" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Letra" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Ver e editar as tags da cançom reproduzida" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Listas" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Non foi possível importar a lista" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "Ac_tualizar a colecçom" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d cançom" msgstr[1] "%d canções" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Ac_tualizar a colecçom" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Editar as etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Editar as etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Todos os Álbuns" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "padrom" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Editar os valores guardados..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Colecçom" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "A comprovar os pontos de montagem" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "A analisar a colecçom" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "A analisar %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Erro ao carregar o arquivo: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Mostrar as etiquetas" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Mostrar saída de depuraçom" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, 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:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostrar informaçom para de_puraçom" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Sem argumentos dabondo" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Demasiados erros" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "descriçom" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Valor" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Mostrar todas as etiquetas habituais" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Copiar as etiquetas dum arquivo para outro" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Mostrar as mudanças, sem aplica-las" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Saltar as etiquetas que nom se podem escrever" #: ../quodlibet/operon/commands.py:135 #, 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:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor de etiquetas de áudio" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Sem canções seleccionadas." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Estabelecer umha etiqueta e eliminar os valores anteriores" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Nom se puido estabelecer %r" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_Eliminar Emisora" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "O valor é umha expressom regular" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "Impossível combinar '--all' com '--regexp'" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "Impossível eliminar %r de %r" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Sem informaçom sobre a duraçom" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Erro ao carregar o arquivo: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Extrair as imagens incrustadas" #: ../quodlibet/operon/commands.py:552 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extrair as imagens incrustadas" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "Mudar o nome dos arquivos a partires das etiquetas" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "Tirar as etiquetas da rota ao arquivo" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Arquivo" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Criar os números de pista para todos os arquivos" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "Mostrar as etiquetas baseadas no padrom indicado" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "A encher o buffer" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Nom se puido criar a pipeline GStreamer predefinida." #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nom foi atopado dispositivo de áudio" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Saida de GStreamer inválida, tentará-se com a predeterminada." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Non foi possível criar a saída de som" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, 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:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Extensões" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Formatos admitidos: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Dispositivo de áudio: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Começo" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Intre" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nome do marcador" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Marcadores" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtros" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Nunca tocadas" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Engadidas _recentemente" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Nova Emisora" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrar no e_stilo" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrar no _artista" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrar no ál_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "E_stilo aleatório" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "_Artista aleatório" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Ál_bum aleatório" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Sem informaçom sobre a duraçom" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Valor:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Valores guardados" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Editar os valores guardados..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Canções" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Mostrar o tempo restante" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_mática" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Cabeceiras dos _números de pista" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Cabeceiras dos _álbuns" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajuste de volume do _Replay Gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Desconhecido" #: ../quodlibet/qltk/data_editors.py:349 #, fuzzy msgid "Tag expression" msgstr "O valor é umha expressom regular" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Ocorreu un erro" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 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." #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Arquivos" #: ../quodlibet/qltk/delete.py:59 #, 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:68 #, 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:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Eliminar os ficheiros" #: ../quodlibet/qltk/delete.py:105 #, 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:114 #, 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mover à Lixeira" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "A mover %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Nom foi possível guardar a base de dados do iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Erro ao expulsar <b>%s</b>." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "A eliminar %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Nom foi possível eliminar o arquivo" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Extraer em valores _múltiplos" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Extraer o disco do _Álbum" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Extraer a _Versom do Título" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Extraer o Arrangista do Ar_tista" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Extraer o _Intérprete do Artista" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Extraer o _Intérprete do Artista" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Extraer a _Versom do Título" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Engadir umha etiqueta" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "E_tiqueta:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Nom foi possível engadir a etiqueta" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Nom foi possível engadir a cançom" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Etiqueta inválida" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Valor inválido" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Extensões" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Preferências do Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Extraer _de:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Ediçom das etiquetas" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Cartafoles" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Novo Cartafol" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "Seleccionar todos os _cartafoles subordinados" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Novo Cartafol" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Introduz um nome para o novo cartafol:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Nom foi possível criar o cartafol" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Nom foi possível eliminar o cartafol" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "por %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Pista %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Editar a vista" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Sem canções seleccionadas." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Sem Canções" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informaçom" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Letra" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artistas" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "intérpretes" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nunca" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d vez" msgstr[1] "%d vezes" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "engadida" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "última vez tocada" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "contador" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "saltada" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "qualificaçom" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "duraçom" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informaçom" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Ascendente" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "taxa de bits" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "tamaño do ficheiro" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modificada" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d seleccionada" msgstr[1] "%d seleccionadas" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Produzido por %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "intérprete" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Pista nom disponível" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Discografia seleccionada" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "álbuns" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Duraçom total:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Tamanho total:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Arquivos" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Baixar" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../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:78 #, fuzzy msgid "Searching for lyrics…" msgstr "A procurar a letra..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Nom se puido baixar a letra" #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 #, 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:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Descartar as mudanças na etiqueta?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nunca" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "O arquivo já existe" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Mudar o nome dos arquivos" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Tarefas ativas" #: ../quodlibet/qltk/notif.py:187 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet está a ser executado" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Desconhecido" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Em Ordem" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_Ordenadamente" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Aleatoriamente" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Aleatoriamente" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Dinâmica" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Dinâmica" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Umha cançom" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Umha cançom" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Erros das extensões" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Activado" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Desactivado" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Sem categoria" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nom se atopárom extensões." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Extensões" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Mostrar os _erros" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Pista" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "agrupaçom" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Ál_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Nome" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "D_uraçom" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Lista de canções" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Ir à cançom reproduzida automaticamente" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Comportamento" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Outros:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Editar a vista..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Engadir ou eliminar colunas de informaçom adicionais." #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Colunas visíveis" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "A procura _inclúi \"componentes\"" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "O nome inclúi o _cartafol" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferências" #: ../quodlibet/qltk/prefs.py:138 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:221 #, fuzzy msgid "Edit Columns" msgstr "Colunas adicionais" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Navegadores" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Filtro _global:" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Procurar" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Confirmar a _qualificaçom múltipla" #: ../quodlibet/qltk/prefs.py:256 #, 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:259 msgid "Enable _one-click ratings" msgstr "Activar as qualificações com _um click" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Qualificações" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Utilizar cantos redondeados nas miniaturas" #: ../quodlibet/qltk/prefs.py:274 #, 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." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Preferir as capas _integradas" #: ../quodlibet/qltk/prefs.py:282 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:287 #, fuzzy msgid "_Fixed image filename:" msgstr "_Forçar o nome de arquivo da imagem:" #: ../quodlibet/qltk/prefs.py:289 #, 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:295 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:304 #, fuzzy msgid "Album Art" msgstr "Lista de Álbuns" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Parar a reproduçom" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Saída do registro" #: ../quodlibet/qltk/prefs.py:344 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:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Ganância por defeito (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Ganância do _volume (dB)" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Activar o ajuste de volume do _Replay Gain" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Ajuste de volume do _Replay Gain" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Predefinido" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Qualificações" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "Quantidade da média _Bayesiana" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Guardar qualificações e o _contador" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Endereço de correio-e" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Descartar as mudanças na etiqueta?" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Relaçom de separadores para diferenciar os valores das etiquetas, separados " "por espaços" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Editar as etiquetas" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Nova Emisora" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "Actualizar a colecçom ao iniciar" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Ac_tualizar a colecçom" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Procurar mudanças na colecçom" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Reler a colecçom" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Analisar os _cartafoles" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Sem Canções" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Propriedades" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Fileira" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Eliminar todas as canções da fileira" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "Aleató_rio" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Recomeçar a lista de reproduçom ao rematar" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Parar a reproduçom" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Seleccionar os cartafoles" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Nom foi possível engadir as canções" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> emprega um protocolo nom admitido." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Música" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Engadir um Cartafol..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Engadir um arquivo..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Engadir umha localizaçom" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Abrir um novo navegador" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Controis" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Ir à cançom reproduzida" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Ver" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Ajuda" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Parar despois desta cançom" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Marcadores" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editar os marcadores..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Ajuda na Internet" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Procurar" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Lista de canções" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Engadir umha localizaçom" #: ../quodlibet/qltk/quodlibetwindow.py:1184 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:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Nom foi possívell engadir a localizaçom" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nom é umha localizaçom válida." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Engadir música" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Verificar a existência de novas canções no cartafol" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 #, fuzzy msgid "The saved ratings will be removed" msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 #, fuzzy msgid "Change _Rating" msgstr "_Qualificaçom" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Eliminar Emisora" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Eliminar Emisora" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Reemprazar espaços com _guiões baixos" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Eliminar os caracteres nom compatíveis com _Windows(tm)" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Eliminar as marcas _diacríticas" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Eliminar os caracteres nom-_ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Utilizar unicamente caracteres de caixa-_baixa" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Mudar o nome dos arquivos" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "padrom" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Editar os valores guardados..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Antever" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Novo nome" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Nom foi possível mudar o nome do arquivo" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Ignorar todos os _erros" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continuar" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "A rota nom é absoluta" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Seleccionar os cartafoles" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Valores guardados" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Editar os valores guardados..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Procurar" #: ../quodlibet/qltk/searchbar.py:71 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:119 msgid "Search after _typing" msgstr "Procurar despois de _escrever" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Mostrar os resultados despois de rematar de escrever." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limite:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Importância" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrar por %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Cabeceiras dos _álbuns" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Cabeceiras dos _números de pista" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Cabeceiras dos _álbuns" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Cabeceiras dos _componentes" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Cabeçeiras de _data" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Cabeceira dos _arquivos" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Cabeceiras da _produçom" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizar as cabeceiras..." #: ../quodlibet/qltk/songlist.py:1097 #, fuzzy msgid "_Expand Column" msgstr "Colunas adicionais" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Listas" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "En_gadir à fileira" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copiar ao dispositivo" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Eliminar da Colecçom" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Reemprazar _guiões baixos com espaços" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Letras capitais nas etiquetas" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Dividir em _valores múltiplos" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Etiquetas a partires da rota" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "As etiquetas substituem as já existentes" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "As etiquetas engadem-se às já existentes" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Etiquetas inválidas" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Editar a vista" #: ../quodlibet/qltk/tracknumbers.py:37 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:53 msgid "_Total tracks:" msgstr "_Pistas totais:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "_Parar" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Antever" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "e %d mais..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "A guardar as canções modificadas." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "A mover %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Xá existe umha lista co nome %s ." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Sistema de arquivos" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "A:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "A:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Mostra informaçom sumária sobre o modo de utilizaçom" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Mostrar a versão e o copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opções]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Nom se reconhece a opçom %r." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "A opçom %r requer um argumento." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r nom é um prefixo único." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dia" msgstr[1] "%d dias" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Nom há titlecase em galego" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 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:102 msgid "Unable to edit song" msgstr "Nom foi possível editar a etiqueta da cançom" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Codificaçom inválida]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "álbum" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arrangista" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangistas" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arrangista" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor/a" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autores/as" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "compositor/a" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "compositores/as" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "compositor/a" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "director/a" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "directores/as" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "director/a" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "Contacto" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "descriçom" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "estilo" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "estilo" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "agrupaçom" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "idioma" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licença" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "endereço" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "autor da letra" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "companhia" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "título" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versom" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "Sítio de Internet" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "artista do álbum" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "parte" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "pista" # label ID #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "Número de catálogo" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "data de publicaçom original" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "álbum original" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "artista original" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "data da gravaçom" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID do MusicBraniz da pista" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID do MusicBrainz do lançamento" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "ID do MusicBrainz do lançamento" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID do MusicBrainz do artista" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID do MusicBrainz do lançamento" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "ID do MusicBraniz do TRM" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "PUID do MUsicIP" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Estado do álbum segundo MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Tipo de álbum segundo MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "ganância de volume da pista" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "pico de ganância da pista" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "ganância de volume do âlbum" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "pico de ganância do álbum" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Preferências" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discos" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "pistas" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "última vez iniciada" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "localizaçom" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "ponto de montagem" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "componentes" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "ano" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "data de publicaçom original" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "marcador" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "Formato" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Listas" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Limpar a procura" #~ 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 "lyricists" #~ msgstr "Autores/as das letras" #~ 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 "_Song" #~ msgstr "C_anç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.5.3/po/hu.po����������������������������������������������������������������������������0000644�0001750�0001750�00000451741�12646427551�015362� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-16 12:54+0100\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ó" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "egy hang tag szerkesztő" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "könyvtár" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Cím" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Művész" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Dátum" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "műfaj" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "É_rték" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Rendezés dátum szerint" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Jellemzők" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Album lista" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Album lista" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Minden album" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Album borítók mutatása" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Dalok albumon kívül" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d szám" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d lemez" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Minden album" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Album lista jellemzők" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Album borítók mutatása" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[lehetőségek]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Album kiírás" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Hibás minta" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Ismeretlen" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Új forrás" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Add meg a hangforrás helyét:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Hangforrások" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "H_angforrások" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "Letöltés" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Fájlok letöltése" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Fájl letöltése" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Forrás hozzáadása sikertelen" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Daltár _frissítése" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Fájlok törlése" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Daltár böngésző" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d dal (%(time)s)" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Ismeretlen" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Több értékre szedés" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "Egyedi" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "É_rték" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Album lista jellemzők" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Böngésző kikapcsolása" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "Böngésző kikapcsolása" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Fájlrendszer" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Fájlrendszer" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Dalok másolása sikertelen" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "Daltárhoz _adás" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Nem támogatott fájl típus" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Állomás hozzáadása sikertelen" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internet Rádió" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Fájlok letöltése" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internet Rádió" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nem leltem állomást" #: ../quodlibet/browsers/iradio.py:812 #, 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:820 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:837 #, fuzzy msgid "Add to Favorites" msgstr "Listához _adás" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "Tö_rlés a listáról" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d állomás" #: ../quodlibet/browsers/media.py:34 msgid "Device Properties" msgstr "Eszköz Tulajdonságok" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Eszköz:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Nincs csatolva" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Csatolási pont:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Név:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Média eszközök" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Média eszközök" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "Kiad" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Tulajdonságok" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "Átnevez" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nincs csatlakoztatva" #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%s</b> másolása" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Dal másolása sikertelen" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Nincs elég hely e dalhoz" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> másolása sikertelen" #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Dalok törlése meghiúsult" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%s</b> törlése" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> törlése sikertelen" #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "A dal törlése sikertelen" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> kinyitása sikertelen" #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Nem tudom kinyitni az eszközt" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Paneles böngésző" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Paneles böngésző" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Mindent kijelöl" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Minden" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Paneles böngésző beállítások" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Listák" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "Listák" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Tö_rlés a listáról" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Új lista" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Lista importálása sikertelen" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Lista átnevezése sikertelen" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Listák importálása" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "Új lista" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Adj nevet az új mappának:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "A Quod Libet nem fut." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "egy zenekönyvtár és lejátszó" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[lehetőségek]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Kiírja a most forgó dalt és kilép" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Lejátszás kezdése azonnal" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Ugrás a következő dalra" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Ugrás az előző dalra" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Lejátszás indítása" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Lejátszás szünete" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Lejátszás/szünet váltása" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Lejátszás indítása" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Hang be" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Hang ki" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Lejátszó állapot kiírása" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Főablak rejtése" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Főablak mutatása" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Főablak mutatásának váltása" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Fókusz a futó lejátszóra" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Aktív böngésző szűrők törlése" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "Daltár _frissítése" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Böngésző kikapcsolása" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Mostani lista kiírása" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Sor tartalmának kiírása" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Sor tartalmának kiírása" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "A Quod Libet nem fut." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Quod Libet bezárása" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Ugrás a forgó dalban" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ÓÓ:]PP:MM" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Sorrend beállítása/váltása" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Ismétlés be/ki/váltás" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Hangerő beállítása" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Daltár keresése" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "lekérés" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Fájl lejátszása" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "fájlnév" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "E dal értéke" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "E böngésző beállítása" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Új böngésző megnyitása" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Sor mutatása/rejtése" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Fő dal lista mutatása/rejtése" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Szűrő egy véletlen értéken" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Szűrő egy tag értéken" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=érték" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Fájl vagy lekérés a lejátszósorba" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "fájlnév" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Fájl vagy lekérés törlése a sorból" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Rossz argumentum ehhez: '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Próbáld ezt: %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Ismeretlen eszköz" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' nem egyedi előtag." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Rossz érték" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Iniciálatlan iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Készítesz egy üres adatbázist ezen az iPod-on?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "_Album borítók másolása" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Tagok egyesítése több értékkel" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "_Verzió a címben" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modell:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Kapacitás:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "F: elavult iPod sáv eltávolítása" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "iPod adatbázis mentése sikertelen" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "iPod adatbázis mentése sikertelen" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Fájlnév minta:" #: ../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/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Hibás kódolás]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Cím" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Hang tag szerkesztő" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Cím szerinti tagok" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Paneles böngésző beállítások" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Összméret:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "Súly" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "Előnézet" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d mp." #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "Egyedi" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Hibák tisztitása" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Zenelejátszó" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internet Rádió" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "hely" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Főablak rejtése" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Jellemzők" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Cím" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Eszköz:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Név:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "Más_ok:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Művész" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Fájlnév minta:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Véletlen _album" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albumok" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "Súly" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Véletlen _album" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Listák importálása" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Nem játszik" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d dal" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "minta" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Nem játszik" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Listák" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Lejátszó" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Előnézet" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "S_orrend:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "Ismétlés" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Stop e szám után" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "Daltár _böngészése" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "_Tag szerkesztés" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Információ" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Szövegek" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Szövegek" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "Előnézet" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Szűrő a _szerzőn/előadón" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "Egyedi" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Szűrő a _műfajon" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Szűrő a _szerzőn/előadón" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Hangforrások" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Add meg a hangforrás helyét:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Új lista" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Lejátszósor" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Soha" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "szám csúcs" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "Átnevez" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Daltár" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Főablak rejtése" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Fájlnév" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Dal mentése sikertelen" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Album lista" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Méret" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "Kere_s:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Keres" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Album lista" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "Könyvjelzők sz_erkesztése..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "Könyvjelzők sz_erkesztése..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Könyvjelzők" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Fájlnév" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Szám" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Cím" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Művész" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Beillesztések nem találhatók" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "és még %d..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album típus" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "lekérés" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Keres" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album típus" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "_Album és lemez elválasztása" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Böngészők" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Mappa létrehozása sikertelen" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Szám lista" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Idő" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Mindent kijelöl" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "Átnevez" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Hibás minta" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Rossz érték" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "Egyedi" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Böngésző kikapcsolása" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "É_rték" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "É_rték" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "É_rték" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Szűrő egy tag értéken" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Szűrő a _műfajon" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "Lejátszósor" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Hibák" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Ír" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "könyvtár" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Album fejlécek" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Ír" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Listák importálása" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "Átnevez" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Dal mentése sikertelen" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Beillesztések nem találhatók" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Szövegek" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Szövegek" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Listák" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Lista importálása sikertelen" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "Daltár _frissítése" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d dal" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Daltár _frissítése" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Tag szerkesztés" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Tag szerkesztés" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Minden album" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Keres" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "minta" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Mentett értékek szerkesztése..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Daltár" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Csatolási pontok ellenőrzése" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Daltár átnézése" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "%s átnézése" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "_Programozható tagok mutatása" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "leírás" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Érték" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Hang tag szerkesztő" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nincs kijelölt dal" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Szűrő egy tag értéken" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Szűrő egy tag értéken" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Nincs idő adat" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Fájl átnevezése sikertelen" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Fájl" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nem leltem állomást" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Mappa létrehozása sikertelen" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Pluginok" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Támogatott formátumok: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Hang eszköz: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Kezd..." #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Idő" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Könyvjelző név" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "PP:MM" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Könyvjelzők" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "Szűrők" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "Soha _nem játszott" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 legmenőbb" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Új állomás" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Szűrő a _műfajon" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Szűrő a _szerzőn/előadón" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Szűrő az _albumon" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Véletlen _műfaj" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Véletlen _szerző/előadó" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Véletlen _album" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Nincs idő adat" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "Érték:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Mentett értékek" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Mentett értékek szerkesztése..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Dalok" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Maradék idő kiírása" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Sáv fejlécek" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Album fejlécek" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Fájlok átnevezése" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Ismeretlen" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Szűrő egy tag értéken" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Fájlok" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:90 #, fuzzy msgid "_Delete Files" msgstr "Fájlok törlése" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mozgatás a kukába" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%d/%d mozgatása" #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "iPod adatbázis mentése sikertelen" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> kinyitása sikertelen" #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%d/%d törlése" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Fájl törlése sikertelen" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "hiányzik %d dalból" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Több értékre szedés" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "_Album és lemez elválasztása" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "_Verzió és cím elválasztása" #: ../quodlibet/qltk/edittags.py:260 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:265 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:271 #, 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:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "_Verzió és cím elválasztása" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Tag hozzáadása" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Tag hozzáadása sikertelen" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Dal hozzáadása sikertelen" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Rossz tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Rossz érték" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Pluginok" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso jellemzők" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Vágás így:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Tag szerkesztés" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Mappák" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Új mappa" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "Alkönyvtárak kijelölé_se" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Új mappa" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Adj nevet az új mappának:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Mappa létrehozása sikertelen" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Mappa törlése sikertelen" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "by %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "%s lemez" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "%s szám" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Kijelző szerkesztése" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nincs kijelölt dal" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Nincs dal" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Információ" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Szövegek" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "művész" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "művészek" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "előadók" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Soha" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%dx" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "hozzáadva" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "utolsó lejátszás" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "lejátszás" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "kihagyás" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "érték" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "hossz" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Információ" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Hibás kódolás]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitarány" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "fájlméret" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "módosítva" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d kijelölt" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Készítette: %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "előadó" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Elérhetetlen szám" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Kijelölt diszkográfia" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albumok" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Összhossz:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Összméret:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Fájlok" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "Letöltés" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nincs szöveg ehhez a dalhoz." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Szöveg keresése..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Szöveg letöltése sikertelen" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Tag cserék elvetése?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Soha" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "A fájl létezik" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Fájlok átnevezése" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Ismeretlen" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Sorban" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_Sorban" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Shuffle" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "S_huffle" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Weighted" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "Súlyozott" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Egy dal" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Egy dal" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Plugin hibák" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Böngésző kikapcsolása" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Beillesztések nem találhatók" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Pluginok" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Hibák mutatása" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Lemez" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Szám" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "csoport" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "_Album" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Fájlnév" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Hossz" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Dal lista" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "Automatikus ugrás a forgó dalra" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "Más_ok:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "Kijelző sz_erkesztése..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Látható oszlopok" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "_Verzió a címben" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Mappa a _fájlnévben" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Jellemzők" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Látható oszlopok" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Böngészők" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globális szűrő:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Keres" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "É_rték" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Album lista" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Lejátszás szünete" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "É_rték" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Értékek és lejátszások mentése" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Tag cserék elvetése?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Tag szerkesztés" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "Új állomás" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "Daltár _frissítése" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Daltár _frissítése" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Változások átnézése a daltárban" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Daltár újratö_ltése" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Könyvtárak átnézése" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Nincs dal" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Tulajdonságok" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "Lejátszósor" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Minden dal törlése a sorból" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "Véletlen" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Lista újraindítása befejezéskor" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Lejátszás szünete" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Könyvtárak kijelölése" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Dalok hozzáadása sikertelen" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> nem támogatott protokollt használ" #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Zene" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "Mappa hozzá_adása..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "Fájl hozzá_adása..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Hely hozzáadása" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Új böngésző megnyitása" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Vezérlés" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Ugrás a lejátszásra" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Nézet" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Súgó" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Stop e szám után" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Könyvjelzők" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "Könyvjelzők sz_erkesztése..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Keres" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Dal _lista" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Hely hozzáadása" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Add meg egy hang fájl helyét:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Hely hozzáadása sikertelen" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nem egy érvényes hely" #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Zene hozzáadása" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Új dalok keresése e mappában" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "É_rték" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "É_rték" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "É_rték" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Szóközök helyett aláhúzások !" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "w$-inkompatibilis jeleket mellőz" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Mellékjelek ki" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Nem-_ASCII karakterek ki" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Fájlok átnevezése" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "minta" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Mentett értékek szerkesztése..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "Előnézet" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Új név" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Fájl átnevezése sikertelen" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "Hibák mutatása" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "Tovább" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Az ösvény nem abszolút" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Könyvtárak kijelölése" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Mentett értékek" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Mentett értékek szerkesztése..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Keres" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Stop e szám után" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "Kor_lát:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "Súly" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "Szűrő itt: %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Album fejlécek" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Sáv fejlécek" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Album fejlécek" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Személ_y fejlécek" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Dátum fejlécek" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Fájl fejlécek" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Termék fejlécek" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Egyéni fejlécek..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Listák" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Sorhoz adás" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "Eszközre másolás" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "Tö_rlés a listáról" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Aláhúzások helyett szóköz" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Cím szerinti tagok" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Több értékre _vágás" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tagok az ösvényből" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Létezőket cserélő tagok" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Létezőkhöz adandó tagok" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Érvénytelen tagok" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Kijelző szerkesztése" #: ../quodlibet/qltk/tracknumbers.py:37 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:53 msgid "_Total tracks:" msgstr "Összes szám:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Lejátszó" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "Előnézet" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "és még %d..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Módosított dalok mentése" #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "%d/%d mozgatása" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Már van egy %s nevű lista" #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Fájlrendszer" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Kiírja a tömör útmutatót" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Kiírja a verziót és a szerzői jogokat" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[lehetőségek]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: '%s' nem ismert lehetőség." #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: '%s' egy argumentumot vár." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' nem egyedi előtag." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d mp." #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d perc" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d óra" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d nap" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "cím-nagybetű" #: ../quodlibet/util/massagers.py:31 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:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:82 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:103 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:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "A dal szerkesztése sikertelen" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Hibás kódolás]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "hangszerelő" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "hangszerelők" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "hangszerelő" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "szerző" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "szerzők" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "zeneszerző" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "zeneszerzők" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "zeneszerző" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "karmester" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "karmesterek" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "karmester" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kapcsolat" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "dátum" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "leírás" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "műfaj" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "műfaj" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "csoport" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "nyelv" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licenc" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "hely" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "szövegíró" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "szervezet" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "cím" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "verzió" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "weblap" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "album művész" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "lemez" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "szám" # label ID #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "címke ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "eredeti kiadási dátum" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "eredeti album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "eredeti művész" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "rögzítési dátum" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz album állapot" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz album típus" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "szám csúcs" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "album csúcs" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Jellemzők" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "lemezek" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "számok" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "utolsó indítás" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "pontos elérés" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "csatolási pont" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "személyek" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "év" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "eredeti kiadási dátum" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Könyvjelzők" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "formátum" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Listák" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, 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 "Clear search" #~ msgstr "Keresés törlése" #~ 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 "lyricists" #~ msgstr "szövegíró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" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Információ" #~ 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.5.3/po/POTFILES.skip��������������������������������������������������������������������0000644�0001750�0001750�00000000067�12604031045�016471� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������tests/test_qltk_notif.py tests/test_util.py build dist �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/po/en_CA.po�������������������������������������������������������������������������0000644�0001750�0001750�00000510074�12646427551�015706� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "an audio tag editor" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "directory" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Title" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Date" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Rating" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Sort by date" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferences" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Album List" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Album List" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "All Albums" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Songs not in an album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d track" msgstr[1] "%d tracks" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disc" msgstr[1] "%d discs" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "All Albums" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Album List Preferences" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Show album _covers" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[options]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Album Display" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Invalid pattern" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Unknown" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "New Feed" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Enter the location of an audio feed:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Download" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Download Files" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Download File" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Unable to add feed" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Re_fresh Library" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Delete Files" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Library Browser" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Unknown" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Split into _Multiple Values" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Custom" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Remove Station" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Album List Preferences" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Disable Browser" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Disable Browser" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "File System" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_File System" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Unable to copy songs" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Add to Library" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Unsupported file type" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Unable to add station" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internet Radio" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Download Files" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internet Radio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_New Station" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "No stations found" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "No Internet radio stations were found at %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "All stations listed are already in your library." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Add to Playlist" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Remove from Playlist" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Device Properties" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Device:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Not mounted" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Mount Point:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Name:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Media Devices" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Media Devices" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Eject" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Properties" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Rename" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> is not connected." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copying <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Unable to copy song" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "There is not enough free space for this song." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> could not be copied." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Unable to delete songs" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Deleting <b>%s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> could not be deleted." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Unable to delete song" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Ejecting <b>%s</b> failed." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Unable to eject device" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Paned Browser" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Select _All" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "All" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Playlists" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Playlists" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Remove from Playlist" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "New Playlist" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Unable to import playlist" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Unable to rename playlist" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Import Playlist" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_New Playlist" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Enter a name for the new folder:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet is not running." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "a music library and player" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[options]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Print the playing song and exit" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Begin playing immediately" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Jump to next song" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Jump to previous song" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Start playback" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pause playback" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Toggle play/pause mode" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Start playback" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Turn up volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Turn down volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Print player status" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Hide main window" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Show main window" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Toggle main window visibility" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Focus the running player" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Remove active browser filters" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "Re_fresh Library" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Disable Browser" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Print the current playlist" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Print the contents of the queue" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Print the contents of the queue" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet is not running." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Exit Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Seek within the playing song" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Set or toggle the playback order" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Turn repeat off, on, or toggle it" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Set the volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Search your audio library" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "query" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Play a file" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "filename" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Rate the playing song" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Set the current browser" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Open a new browser" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Show or hide the queue" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Show or hide the main song list" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filter on a random value" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filter on a tag value" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "filename" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Unqueue a file or query" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Invalid argument for '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Try %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Unknown Device" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' is not a unique prefix." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "Could not play %s." #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Invalid tag name" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Uninitialized iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Do you want to create an empty database on this iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copy _album covers" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combine tags with _multiple values" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Title includes _version" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Album includes _part" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacity:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "W: removing orphaned iPod track" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Unable to save iPod database" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Unable to save iPod database" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Remove unused covers and directories" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Invalid Encoding]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Title" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio tag editor" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Title-case tags" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 #, fuzzy msgid "Animated On-Screen Display" msgstr "_On-Screen Display" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Total size:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Weighted" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Preview" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 #, fuzzy msgid "Party" msgstr "_Part" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "1 second" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Custom" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Clear Errors" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Music Player" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internet Radio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "location" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Hide main window" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferences" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Title" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "No new stations" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "No new stations" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 #, 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:461 #, fuzzy msgid "_Service:" msgstr "Device:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Name:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Others: " #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Random Al_bum" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albums" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Weighted" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Random Al_bum" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Import Playlist" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Play _song" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 #, fuzzy msgid "Plain text for status when there is no current song" msgstr "Pause/resume the current song" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d song" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Scroll _Wheel" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Tooltip Display" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Not playing" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "Tray Icon Preferences" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Player" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "_Pause" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Pre_vious" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "_Next" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "Play _Order" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repeat" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Stop after this song" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Browse Library" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Edit _Tags" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Lyrics" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Lyrics" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Preview" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filter on _Artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Set Rating" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Custom" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filter on _Genre" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filter on _Artist" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio Feeds" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Enter the location of an audio feed:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "New Playlist" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_Queue" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Never" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "track peak" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Could not play %s." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Rename" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Library" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Hide main window" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Filename" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Unable to save song" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Album List" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Size" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Search:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Search" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Album List" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Edit Bookmarks..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Edit Bookmarks..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Bookmarks" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filename" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Track" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Title" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Artist" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "No plugins found." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "and %d more..." msgstr[1] "and %d more..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "query" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Search" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Split Disc out of _Album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Browsers" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Unable to create folder" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Track List" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Time" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Select _All" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Rename" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 msgid "pattern" msgstr "pattern" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Invalid value" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Custom" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Disable Browser" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Remove Station" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Edit Display" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 #, fuzzy msgid "Skip Count" msgstr "skip count" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filter on a tag value" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filter on _Genre" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Queue" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Errors" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Write" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "directory" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Album Headers" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Write" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Import Playlist" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Rename" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Unable to save song" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "No plugins found." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Lyrics" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Lyrics" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "View and edit tags in the playing song" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Playlists" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Unable to import playlist" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Ejecting <b>%s</b> failed." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Re_fresh Library" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d song" msgstr[1] "%d songs" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Re_fresh Library" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Edit Tags" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Edit Tags" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "All Albums" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Search" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Edit saved values..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Library" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Checking mount points" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Scanning library" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Scanning %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "Description" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Value" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio tag editor" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "No songs are selected." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_Remove Station" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Remove selected tag" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filter on a tag value" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filter on a tag value" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "No time information" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Unable to rename file" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Remove selected tag" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "File" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "No audio device found" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Unable to create folder" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Plugins" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Supported formats: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Audio device: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Beginning" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Time" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Bookmark Name" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Bookmarks" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filters" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Never Played" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "All songs" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filter on _Genre" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filter on _Artist" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filter on Al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Random _Genre" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Random _Artist" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Random Al_bum" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "No time information" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Value:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Saved Values" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Edit saved values..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Songs" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Display remaining time" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Track Headers" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Album Headers" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Unknown" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filter on a tag value" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Files" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Delete Files" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Move to Trash" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%(current)s/%(total)s" #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Unable to save iPod database" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Ejecting <b>%s</b> failed." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%(current)s/%(total)s" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Unable to delete file" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Split into _Multiple Values" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Split Disc out of _Album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Split Arranger out of Ar_tist" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Add a Tag" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Unable to add tag" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Unable to add song" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Invalid tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Invalid value" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso Preferences" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Split _on:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Tag Editing" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Folders" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "New Folder" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Select All Subfolders" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "New Folder" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Enter a name for the new folder:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Unable to create folder" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Unable to delete folder" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "by %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disc %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Track %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Edit Display" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "No songs are selected." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "No Songs" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Lyrics" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artists" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "performers" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Never" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d time" msgstr[1] "%d times" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "added" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "last played" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "plays" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "skips" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "rating" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "length" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Information" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Invalid Encoding]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "file size" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modified" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selected" msgstr[1] "%d selected" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Produced by %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "performer" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Track unavailable" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Selected Discography" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Total length:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Total size:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Files" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "No lyrics found for this song." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Searching for lyrics..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Unable to download lyrics." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Discard tag changes?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Never" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "File exists" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Rename Files" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet is running" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Unknown" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "In Order" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_In Order" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Shuffle" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Shuffle" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Weighted" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Weighted" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "One Song" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_One Song" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Plugin Errors" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Disable Browser" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "No plugins found." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Show _Errors" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disc" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Track" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "grouping" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Filename" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Length" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Song List" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Jump to playing song automatically" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Others: " #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Edit Display..." #: ../quodlibet/qltk/prefs.py:95 #, fuzzy msgid "Add or remove additional column headers" msgstr "Set and save column headers" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Title includes _version" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Filename includes _folder" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferences" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Browsers" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Global filter:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Search" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "Rating" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Album List" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Pause playback" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Set Rating" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Rating" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Save ratings and play counts" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Discard tag changes?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Edit Tags" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_New Station" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "Re_fresh Library" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Re_fresh Library" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Check for changes in your library" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Re_load Library" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Scan _Directories" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "No Songs" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Properties" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Queue" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Remove all songs from the queue" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Random" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Restart the playlist when finished" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Pause playback" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Select Directories" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Unable to add songs" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> uses an unsupported protocol." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Music" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Add a Folder..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Add a File..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Add a Location" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Open a new browser" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Jump to Playing Song" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_View" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Help" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Stop after this song" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Bookmarks" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Edit Bookmarks..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "_About" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Search" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Song _List" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Add a Location" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Enter the location of an audio file:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Unable to add location" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> is not a valid location." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Add Music" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Watch this folder for new songs" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Rating" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Remove Station" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Remove Station" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Replace spaces with _underscores" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Strip _Windows-incompatible characters" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Strip _diacritical marks" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Strip non-_ASCII characters" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Rename Files" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "Invalid Pattern" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Edit saved values..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Preview" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "New Name" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Unable to rename file" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "Show _Errors" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continue" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Path is not absolute" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Select Directories" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Saved Values" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Edit saved values..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Search" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "search-string" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Weighted" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filter on %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Track Headers" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_People Headers" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Date Headers" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_File Headers" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Production Headers" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Customize Headers..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Playlists" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Add to _Queue" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copy to Device" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Remove from Library" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Replace _underscores with spaces" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Title-case tags" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Split into multiple _values" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tags From Path" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Tags replace existing ones" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tags are added to existing ones" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Invalid tags" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Edit Display" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Track Numbers" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start fro_m:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Total tracks:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "_Pause" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "Pre_vious" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "and %d more..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Saving the songs you changed." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "%(current)s/%(total)s" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "A playlist named %s already exists." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "File System" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Display brief usage information" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Display version and copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[options]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Option '%s' not recognized." #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Option '%s' requires an argument." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' is not a unique prefix." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d second" msgstr[1] "%d seconds" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minute" msgstr[1] "%d minutes" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hour" msgstr[1] "%d hours" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d day" msgstr[1] "%d days" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Unable to edit song" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Invalid Encoding]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arranger" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangers" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arranger" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "author" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "authors" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "composer" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "composers" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "composer" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "conductor" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "conductors" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "conductor" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "date" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "description" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "genre" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "grouping" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "language" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "location" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "lyricist" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organization" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "title" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "website" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "album artist" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "track" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "label ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "original release date" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "original album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "original artist" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "recording date" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz album type" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "track gain" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "track peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Preferences" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discs" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "tracks" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "last started" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "full name" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "mount point" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "people" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "year" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "original release date" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Bookmarks" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "format" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Playlists" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, 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 "Clear search" #~ msgstr "Clear search" #~ 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 "lyricists" #~ msgstr "lyricists" #~ 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" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Information" #~ 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.5.3/po/pl.po����������������������������������������������������������������������������0000644�0001750�0001750�00000517621�12646427551�015361� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Polish translation of quodlibet. # 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: 2016-01-16 12:54+0100\n" "PO-Revision-Date: 2015-10-20 03:35+0200\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Language-Team: Polish <gnomepl@aviary.pl>\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" "X-Poedit-Language: Polish\n" "X-Poedit-Country: Poland\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "edytor etykiet plików dźwiękowych" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "katalog" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Tytuł" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Wykonawca" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "Da_ta" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Gatunek" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Ocena" #: ../quodlibet/browsers/albums/main.py:160 msgid "Sort _by…" msgstr "Porządkowanie _według…" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Preferencje" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Lista albumów" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Lista _albumów" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Wszystkie albumy" #: ../quodlibet/browsers/albums/main.py:473 #, 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:640 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Utwory nieprzypisane do albumów" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, 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:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, 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:66 msgid "An Example Album" msgstr "Przykładowy album" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Preferencje listy albumów" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Wyświetlanie o_kładek albumów" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Wewnętrzne wy_szukiwanie obejmuje osoby" #: ../quodlibet/browsers/albums/prefs.py:93 msgid "Options" msgstr "Opcje" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Lista albumów" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "Za_mknij" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Nieprawidłowy wzorzec" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Nieznany" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nowy kanał" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Położenie kanału dźwiękowego:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "_Dodaj" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Kanały dźwiękowe" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "Kanały _dźwiękowe" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 msgid "_Download…" msgstr "_Pobierz…" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Pobierz pliki" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "_Anuluj" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "_Zapisz" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Pobierz plik" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "_Nowe" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Nie można dodać kanału" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 msgid "_Refresh" msgstr "_Odśwież" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 msgid "_Delete" msgstr "_Usuń" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "Nie można zaimportować %s. Przeglądarka kanałów dźwiękowych została " "wyłączona." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Przeglądarka kolekcji" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, python-format msgid "Unknown %s" msgstr "Nieznane %s" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "Wiele wartości %s" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Własne" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 msgid "_Remove" msgstr "_Usuń" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etykieta" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Połącz" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Preferencje kolekcji albumów" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "_Zastosuj" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Wyłączenie przeglądarki" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Wyłączenie przeglądarki" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "System plików" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_System plików" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Nie można skopiować utworów" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Dodaj do kolekcji" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Nieobsługiwany typ pliku" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Nie można dodać stacji" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Radio internetowe" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Pobieranie listy stacji" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nowa stacja" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Klasyczna" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "Radio _internetowe" #: ../quodlibet/browsers/iradio.py:549 msgid "_New Station…" msgstr "_Nowa stacja…" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "Zakt_ualizuj stacje" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Wszystkie stacje" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Ulubione" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Bez kategorii" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nie odnaleziono żadnych stacji" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nie odnaleziono internetowych stacji radiowych w %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Wszystkie podane stacje już znajdują się w kolekcji." #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "Dodaj do ulubionych" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Usuń z ulubionych" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Właściwości urządzenia" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Urządzenie:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Niezamontowane" #: ../quodlibet/browsers/media.py:53 msgid "Mount point:" msgstr "Punkt montowania:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nazwa:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Urządzenia" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Urządzenia" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Wysuń" #: ../quodlibet/browsers/media.py:358 msgid "_Properties" msgstr "_Właściwości" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Zmień nazwę" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, python-format msgid "%s is not connected." msgstr "%s nie jest połączone." #: ../quodlibet/browsers/media.py:497 #, python-format msgid "Copying %(song)s" msgstr "Kopiowanie %(song)s" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Nie można skopiować utworu" #: ../quodlibet/browsers/media.py:512 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:524 #, python-format msgid "%s could not be copied." msgstr "Nie można skopiować %s." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Nie można usunąć utworów" #: ../quodlibet/browsers/media.py:555 #, python-format msgid "Deleting %(song)s" msgstr "Usuwanie %(song)s" #: ../quodlibet/browsers/media.py:573 #, python-format msgid "%s could not be deleted." msgstr "Nie można usunąć %s." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Nie można usunąć utworu" #: ../quodlibet/browsers/media.py:592 #, python-format msgid "Ejecting %s failed." msgstr "Wysunięcie %s się nie powiodło." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Nie można wysunąć urządzenia" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Przeglądarka panelowa" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Przeglądarka panelowa" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Z_aznacz wszystko" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Wszystkie" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "Tryb _szeroki" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Preferencje przeglądarki panelowej" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Usuń z listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "Za_importuj" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nowa lista odtwarzania" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Nie można zaimportować listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Nie można zmienić nazwy listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Zaimportuj listę odtwarzania" #: ../quodlibet/browsers/playlists/menu.py:20 msgid "_New Playlist…" msgstr "_Nowa lista odtwarzania…" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Potwierdź działanie dla listy odtwarzania „%s”" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 msgid "Enter a name for the new playlist:" msgstr "Nazwa nowej listy odtwarzania:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 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:82 msgid "a music library and player" msgstr "kolekcja muzyki i odtwarzacz" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[opcja]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Wyświetla odtwarzany utwór i kończy działanie" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Natychmiast rozpoczyna odtwarzanie" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Przechodzi do następnego utworu" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Przechodzi do poprzedniego utworu" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Rozpoczyna odtwarzanie" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Wstrzymuje odtwarzanie" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Przełącza tryb odtwarzania/wstrzymania" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Zatrzymuje odtwarzanie" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Zwiększa głośność" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Zmniejsza głośność" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Wyświetla stan odtwarzacza" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Ukrywa główne okno" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Wyświetla główne okno" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Przełącza widoczność głównego okna" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Przenosi działający odtwarzacz na pierwszy plan" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Usuwa aktywne filtry przeglądarki" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Odświeża i ponownie skanuje kolekcję" #: ../quodlibet/cli.py:106 msgid "List available browsers" msgstr "Wyświetla listę dostępnych przeglądarek" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Wyświetla bieżącą listę odtwarzania" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Wyświetla zawartość kolejki" #: ../quodlibet/cli.py:109 msgid "Print the active text query" msgstr "Wyświetla aktywne zapytanie tekstowe" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Uruchamia bez wtyczek" #: ../quodlibet/cli.py:111 msgid "Start Quod Libet if it isn't running" msgstr "Uruchamia program Quod Libet, jeśli nie jest uruchomiony" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Kończy działanie programu Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Przewija odtwarzany utwór" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][GG∶]MM∶SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Ustawia lub przełącza kolejność odtwarzania" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Włącza, wyłącza lub przełącza stan powtarzania" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Ustawia głośność" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Przeszukuje kolekcję" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "zapytanie" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Odtwarza plik" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 msgctxt "command" msgid "filename" msgstr "nazwa pliku" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Ocenia odtwarzany utwór" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Ustawia bieżącą przeglądarkę" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Otwiera nową przeglądarkę" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Wyświetla lub ukrywa kolejkę" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Wyświetla lub ukrywa główną listę utworów" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtruje losowo" #: ../quodlibet/cli.py:129 msgctxt "command" msgid "tag" msgstr "etykieta" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtruje według wartości etykiety" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "etykieta=wartość" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Dodaje do kolejki plik lub zapytanie" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Dodaje do kolejki pliki oddzielone przecinkami" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nazwa pliku" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Wyświetla nazwy plików wyniku zapytania na standardowym wyjściu" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Usuwa z kolejki plik lub zapytanie" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Nieprawidłowy parametr dla „%s”." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Proszę spróbować polecenia „%s --help”." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Nieznane urządzenie" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r nie jest obsługiwanym urządzeniem." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "Nie można odnaleźć „%s”." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Inicjowanie mechanizmu urządzeń." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Próbowanie „%s”" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Nie można połączyć z mechanizmem urządzeń." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Zainicjowano mechanizm urządzeń." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Niezainicjowane urządzenie iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Utworzyć pustą bazę danych na tym urządzeniu iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "_Utwórz bazę danych" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "W_zmocnienie (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopiowanie okładek _albumów" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Łączenie etykiet z wielo_ma wartościami" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Tytuł zawiera _wersję" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Album zawiera p_odpis płyty" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Pojemność:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Oprogramowanie sprzętowe:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Usuwanie osieroconej ścieżki z urządzenia iPod" #: ../quodlibet/devices/ipod.py:310 msgid "Saving iPod database…" msgstr "Zapisywanie bazy danych urządzenia iPod…" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Nie można zapisać bazy danych urządzenia iPod" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" "Nie można odnaleźć biblioteki libgpod. Obsługa urządzeń iPod została " "wyłączona." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Wzorzec nazw plików:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Usuwanie nieużywanych okładek i katalogów" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "Źródło okładek serwisu Last.fm" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Pobiera okładki z archiwum serwisu Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:18 msgid "MusicBrainz Cover Source" msgstr "Źródło okładek serwisu MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Pobiera okładki z archiwum serwisu MusicBrainz." #: ../quodlibet/ext/editing/iconv.py:33 msgid "Convert Encodings" msgstr "Konwertowanie kodowań" #: ../quodlibet/ext/editing/iconv.py:34 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:39 msgid "_Convert Encoding…" msgstr "_Konwertuj kodowanie…" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "Proste odwracanie znaków kana/kanji" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "Konwertuje znaki kana/kanji na romaji przed zmianą nazw." #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "_Romanizuj japoński tekst" #: ../quodlibet/ext/editing/kakasi.py:55 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:13 msgid "Regex Substitution" msgstr "Podstawianie wyrażeń regularnych" #: ../quodlibet/ext/editing/resub.py:14 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:19 msgid "Title Case" msgstr "Jak W Tytule" #: ../quodlibet/ext/editing/titlecase.py:20 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:39 msgid "Title-_case Value" msgstr "Wartość Jak W _Tytule" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "Dozwolenie _WIELKICH LITER w etykietach" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "_Ludzka wartość Jak w Tytule" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 msgid "Advanced Preferences" msgstr "Zaawansowane preferencje" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "Umożliwia dostosowywanie zaawansowanych ustawień konfiguracji." #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "Animowane informacje na ekranie" #: ../quodlibet/ext/events/animosd/main.py:25 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:152 msgid "Top of screen" msgstr "Góra ekranu" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "Środek ekranu" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "Dół ekranu" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "_Położenie:" #: ../quodlibet/ext/events/animosd/prefs.py:170 msgid "_Cover size:" msgstr "Rozmiar _okładki:" #: ../quodlibet/ext/events/animosd/prefs.py:176 msgid "Display" msgstr "Wyświetlanie" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "_Czcionka:" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "Lewo" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "Środek" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Right" msgstr "Prawo" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "Wy_równanie tekstu:" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "Tekst" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "_Tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "_Wypełnianie:" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "Kolory" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "_Cienie" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "_Obrys" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "Zaokrąglo_ne rogi" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "Opóźni_enie:" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "Efekty" #: ../quodlibet/ext/events/animosd/prefs.py:267 msgid "Ed_it Display Pattern…" msgstr "_Modyfikuj wzorzec wyświetlania…" #: ../quodlibet/ext/events/animosd/prefs.py:271 msgid "Preview" msgstr "Podgląd" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "Automatyczna aktualizacja kolekcji" #: ../quodlibet/ext/events/auto_library_update.py:124 #, 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:23 msgid "Automatic Masking" msgstr "Automatyczne maskowanie" #: ../quodlibet/ext/events/automask.py:24 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:13 msgid "Automatic Rating" msgstr "Automatyczne oceny" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "Budzik" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "Budzi za pomocą głośnej muzyki." #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "Kołysanka" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "Wycisza i wstrzymuje odtwarzanie muzyki." #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "Płasko" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "Na żywo" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "Mocne niskie i wysokie tony" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "Klub" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "Duża sala" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "Impreza" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "Lekko" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "Mocne niskie tony" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "Słuchawki" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "Soft Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "Mocne wysokie tony" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "Dance" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "Laptop" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "Korektor graficzny" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "Kontroluje brzmienie muzyki za pomocą korektora graficznego." #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "Obecny mechanizm nie obsługuje korektora graficznego." #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 msgid "Custom" msgstr "Własne" #: ../quodlibet/ext/events/equalizer.py:189 msgid "_Clear" msgstr "Wy_czyść" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "Aktualizowanie stanu programu Gajim" #: ../quodlibet/ext/events/gajim_status.py:30 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:144 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:153 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:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" "Stany, dla których wiadomość stanu\n" "będzie zmieniana" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "Wstrzymanie wygaszacza ekranu" #: ../quodlibet/ext/events/inhibit.py:41 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:50 msgid "Music is playing" msgstr "Odtwarzanie muzyki" #: ../quodlibet/ext/events/iradiolog.py:15 msgid "Internet Radio Log" msgstr "Dziennik radia internetowego" #: ../quodlibet/ext/events/iradiolog.py:16 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:28 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Wypisuje plik „Jabber User Tunes” do ~/.quodlibet/jabber." #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "Serwer multimediów AV UPnP" #: ../quodlibet/ext/events/mediaserver.py:37 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:63 msgid "MPD Server" msgstr "Serwer MPD" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Zdalnie kontroluje program Quod Libet używając 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:145 msgid "Connection" msgstr "Połączenie" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "Przetestowani klienci" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "Obsługa MPRIS przez D-Bus" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Kontroluje program Quod Libet używając specyfikacji interfejsu D-Bus MPRIS " "1.0/2.0." #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 msgid "Hide main window on close" msgstr "Ukrywanie głównego okna podczas zamykania" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Preferencje" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "Tekst powiadomienia" #: ../quodlibet/ext/events/notify.py:86 msgid "_Title:" msgstr "_Tytuł:" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "Przywraca domyślny wzorzec" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "T_reść:" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "_Powiadomienia" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "Wyświetlanie powiadomień" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "Tylko podczas <i>rę_cznej</i> zmiany utworu" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "Tylko podczas <i>_automatycznej</i> zmiany utworu" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "Podczas <i>_każdej</i> zmiany utworu" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "Tylko, jeśli główne _okno nie jest aktywne" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "Błąd połączenia" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "Nie można połączyć z usługą powiadomień." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "Powiadomienia o utworach" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "Wyświetla powiadomienia podczas zmiany utworu." #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 msgid "_Service:" msgstr "_Serwis:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "Adres _URL:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "User_name:" msgstr "_Nazwa użytkownika:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "_Hasło:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 msgid "Other…" msgstr "Inny…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "_Sprawdź poprawność danych konta" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "Konto" #: ../quodlibet/ext/events/qlscrobbler.py:528 msgid "_Artist pattern:" msgstr "_Wzorzec wykonawcy:" #: ../quodlibet/ext/events/qlscrobbler.py:528 msgid "_Title pattern:" msgstr "Wzorzec _tytułu:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "_Filtr wykluczenia:" #: ../quodlibet/ext/events/qlscrobbler.py:547 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:557 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:566 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:574 msgid "_Offline mode (don't submit anything)" msgstr "Tryb _offline (bez wysyłania)" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "Wysyłanie" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "Wyciszanie reklam radiowych" #: ../quodlibet/ext/events/radioadmute.py:18 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:25 msgid "Random Album Playback" msgstr "Odtwarzanie losowego albumu" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "Wyżej oceniane" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "Częściej odtwarzane" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "Częściej pomijane" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "Ostatnio odtwarzane" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "Ostatnio rozpoczęte" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "Ostatnio dodane" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Longer albums" msgstr "Dłuższe albumy" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "sekundy przed rozpoczęciem następnego albumu" #: ../quodlibet/ext/events/randomalbum.py:84 msgid "Weights" msgstr "Waga" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "Odtwarzanie niektórych albumów częściej, niż innych" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "unikanie" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "preferowanie" #: ../quodlibet/ext/events/randomalbum.py:198 msgid "Random Album" msgstr "Losowy album" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "Czekanie na rozpoczęcie %s" #: ../quodlibet/ext/events/rbimport.py:115 msgid "Import Failed" msgstr "Importowanie się nie powiodło" #: ../quodlibet/ext/events/rbimport.py:120 #, 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:128 msgid "Rhythmbox Import" msgstr "Importowanie z programu Rhythmbox" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "Wstrzymywanie po wygaszeniu ekranu" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" "Wstrzymuje odtwarzanie, kiedy wygaszacz ekranu środowiska GNOME jest aktywny." #: ../quodlibet/ext/events/searchprovider.py:71 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:77 msgid "GNOME Search Provider" msgstr "Dostawca wyszukiwania GNOME" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "Umożliwia GNOME Shell przeszukiwanie kolekcji." #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "Synchronizacja ze Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:28 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:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "Błąd podczas wyszukiwania serwera Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "Błąd podczas wyszukiwania %s. Proszę sprawdzić poprawność ustawień" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "Wiadomości stanu Telepathy" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "wstrzymano" #: ../quodlibet/ext/events/telepathy_status.py:121 msgid "Playing:" msgstr "Odtwarzanie:" #: ../quodlibet/ext/events/telepathy_status.py:122 #, 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:138 msgid "Paused:" msgstr "Wstrzymano:" #: ../quodlibet/ext/events/telepathy_status.py:139 #, 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:155 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:156 msgid "No song:" msgstr "Brak utworu:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 msgid "Status Patterns" msgstr "Wzorce stanu" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "Przełączanie motywu" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "Zmienia aktywny motyw biblioteki GTK+." #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "_Motyw:" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "Domyślny motyw" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "Ciemny motyw" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "Paski nagłówków" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Przewinięcie kółkiem myszy zmienia głośność\n" "Przytrzymanie klawisza Shift i przewinięcie kółkiem myszy zmienia utwór" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Przewinięcie kółkiem myszy zmienia utwór\n" "Przytrzymanie klawisza Shift i przewinięcie kółkiem myszy zmienia głośność" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Przewijanie _kółkiem myszy" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Wyświetlanie podpowiedzi" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Bezczynny" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "Ikona obszaru powiadamiania" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "Kontroluje program Quod Libet z obszaru powiadamiania." #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 msgid "_Play" msgstr "_Odtwórz" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 msgid "P_ause" msgstr "_Wstrzymaj" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 msgid "Pre_vious" msgstr "_Poprzedni" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "_Następny" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "K_olejność odtwarzania" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "Powta_rzanie" #: ../quodlibet/ext/events/trayicon.py:481 msgid "Stop _after this song" msgstr "_Zatrzymaj po tym utworze" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Przeglądaj kolekcję" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Modyfikuj _etykiety" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informacje" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "Za_kończ" #: ../quodlibet/ext/events/viewlyrics.py:34 msgid "View Lyrics" msgstr "Wyświetlenie tekstu utworu" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "Wyświetla tekst utworu pod listą utworów." #: ../quodlibet/ext/events/viewlyrics.py:38 msgid "_Lyrics" msgstr "_Tekst utworu" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "Zapisywanie obrazów" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "Zapisywanie zdarzeń w dzienniku" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "Wysyła zdarzenia utworów do usługi Zeitgeist." #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "_Próg:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "Próg, po którym filtr jest aktywny" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "_Współczynnik:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "Współczynnik kompresji" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "%d%%" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "Kompresja dźwięku" #: ../quodlibet/ext/gstreamer/compressor.py:105 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:24 msgid "_Preset:" msgstr "_Ustawienie:" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 msgid "Filter preset" msgstr "Filtruj ustawienia" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "Wycięcie _częstotliwości:" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "Częstotliwość niskiego filtru wycięcia" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "Poziom _kanału:" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "Poziom kanału" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "Domyślne" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 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:32 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Najbliżej do przenikania Chu Moy (popularne)" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 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:36 msgid "Custom settings" msgstr "Własne ustawienia" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "Przenikanie" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 msgid "Filter _band:" msgstr "_Filtrowanie pasma:" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "Pasmo częstotliwości filtru" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "Filter _width:" msgstr "Filtrowanie _szerokości:" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "Szerokość częstotliwości filtru" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "_Poziom:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "Poziom efektu" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "Usuwa głos z nagrania." #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "Miksowanie do mono" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "Miksuje kanały do dźwięku monofonicznego." #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "_Prędkość:" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "T_onacja:" #: ../quodlibet/ext/gstreamer/pitch.py:95 msgid "Audio Pitch / Speed" msgstr "Tonacja/prędkość dźwięku" #: ../quodlibet/ext/gstreamer/pitch.py:96 msgid "Controls the pitch of an audio stream." msgstr "Kontroluje tonację strumienia dźwiękowego." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "Wyeksportuj do Squeezebox…" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" "Dynamicznie eksportuje listy odtwarzania do listy odtwarzania urządzenia " "Logitech Squeezebox, jeśli oba używają takiej samej struktury katalogów. " "Używa konfiguracji wtyczki synchronizacji z urządzeniem Squeezebox." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "Eksport listy odtwarzania do urządzenia Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "Nazwa listy odtwarzania (zastąpi istniejącą)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 msgid "Shuffle Playlist" msgstr "Losowa lista odtwarzania" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "Odtwarza zgodnie z zaznaczeniem." #: ../quodlibet/ext/playorder/queue.py:16 msgid "Queue Only" msgstr "Tylko kolejka" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" "Ogranicza odtwarzanie utworów do kolejki. Podwójne kliknięcie utworu dodaje " "go do kolejki." #: ../quodlibet/ext/playorder/reverse.py:8 msgid "Reverse" msgstr "Odwrotnie" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "Odwraca kolejność odtwarzania utworów." #: ../quodlibet/ext/playorder/track_repeat.py:26 msgid "Track Repeat" msgstr "Powtarzanie ścieżki" #: ../quodlibet/ext/playorder/track_repeat.py:28 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:43 msgid "Number of times to play each song:" msgstr "Ile razy odtwarzać każdy utwór:" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, 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:85 #, python-format msgid "Couldn't connect to %s" msgstr "Nie można połączyć z %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "Nazwa komputera:" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "Port:" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 msgid "Username:" msgstr "Nazwa użytkownika:" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "Hasło:" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "Katalog kolekcji, z którym serwer ma się łączyć." #: ../quodlibet/ext/_shared/squeezebox/base.py:131 msgid "Library path:" msgstr "Ścieżka do kolekcji:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "_Sprawdź ustawienia" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "Serwer Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debugowanie" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Serwer Squeezebox w {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "niezidentyfikowany serwer Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "niezidentyfikowany odtwarzacz Squeezebox: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "Wybór odtwarzacza Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_OK" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Odnaleziono serwer Squeezebox.\n" "Proszę wybrać odtwarzacz" #: ../quodlibet/ext/songsmenu/albumart.py:227 msgid "Fit image to _window" msgstr "Dopasowanie _obrazu do okna" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "_Program:" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "_Modyfikowanie obrazu po zapisaniu" #: ../quodlibet/ext/songsmenu/albumart.py:243 msgid "File_name:" msgstr "_Nazwa pliku:" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "Zapisanie się nie powiodło" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, python-format msgid "Unable to save \"%s\"." msgstr "Nie można zapisać „%s”." #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] Błąd HTTP: %s" #: ../quodlibet/ext/songsmenu/albumart.py:511 msgid "Album Art Downloader" msgstr "Pobieranie okładek" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "z %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "Rozdzielczość: %s" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, python-format msgid "Size: %s" msgstr "Rozmiar: %s" #: ../quodlibet/ext/songsmenu/albumart.py:588 msgid "_Search" msgstr "Wy_szukaj" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 msgid "Searching…" msgstr "Wyszukiwanie…" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "Gotowe" #: ../quodlibet/ext/songsmenu/albumart.py:820 msgid "Download Album Art" msgstr "Pobieranie okładek" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "Pobiera okładki z różnych witryn WWW." #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "Źródła" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "APEv2 na ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 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:20 msgid "Go to Bookmark…" msgstr "Przejdź do zakładki…" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "Wyświetla listę wszystkich zakładek w zaznaczonych plikach." #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 msgid "_Edit Bookmarks…" msgstr "_Modyfikuj zakładki…" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 msgid "No Bookmarks" msgstr "Brak zakładek" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nazwa pliku" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Ścieżka" #: ../quodlibet/ext/songsmenu/brainz.py:119 msgid "Title" msgstr "Tytuł" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Wykonawca" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "_Wydanie:" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "%d _wydanie:" msgstr[1] "%d _wydania:" msgstr[2] "%d _wydań:" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "Proszę wprowadzić zapytanie." #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "Wystąpił błąd. Proszę ponowić." #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "Wczytywanie wyników…" #: ../quodlibet/ext/songsmenu/brainz.py:370 msgid "No results found." msgstr "Nie odnaleziono wyników." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "Odnaleziono %d wynik." msgstr[1] "Odnaleziono %d wyniki." msgstr[2] "Odnaleziono %d wyników." #: ../quodlibet/ext/songsmenu/brainz.py:411 msgid "MusicBrainz lookup" msgstr "Wyszukiwanie w serwisie MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 msgid "_Query:" msgstr "_Zapytanie:" #: ../quodlibet/ext/songsmenu/brainz.py:442 msgid "S_earch" msgstr "Wy_szukaj" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "Wyniki <i>(przeciągnięcie zmienia kolejność)</i>" #: ../quodlibet/ext/songsmenu/brainz.py:483 msgid "MusicBrainz Lookup" msgstr "Wyszukiwanie w serwisie MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" "Ponownie nadaje etykiety albumu w oparciu o wyszukiwanie w serwisie " "MusicBrainz." #: ../quodlibet/ext/songsmenu/brainz.py:510 msgid "Split _disc from album" msgstr "Oddzielenie płyty od al_bumu" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "Oddzielenie _wykonawców od ścieżki" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "Użycie tylko roku z etykiety „date”" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "Zapisywanie etykiety „_albumartist”, kiedy jest to konieczne" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "Zapisywanie etykiet porządkowania dla nazw wykonawców" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "Zapisywanie _standardowych etykiet serwisu MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "Zapisywanie etykiety „_labelid” (naprawia albumy wielopłytowe)" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 msgid "Browse Folders" msgstr "Przeglądanie katalogów" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "Otwiera katalogi utworów w menedżerze plików." #: ../quodlibet/ext/songsmenu/browsefolders.py:184 msgid "Unable to open folders" msgstr "Nie można otworzyć katalogów" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "Żaden program do otwierania katalogów nie jest dostępny." #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Lista ścieżek" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "Wyszukiwanie w CDDB" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "Wyszukuje informacje o albumie w serwisie FreeDB. Wymaga CDDB.py." #: ../quodlibet/ext/songsmenu/cddb.py:166 msgid "Timeout" msgstr "Ograniczenie czasu oczekiwania" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "Nie można wykonać zapytania, przekroczono czas oczekiwania połączenia" #: ../quodlibet/ext/songsmenu/cddb.py:172 msgid "Select an album" msgstr "Wybór albumu" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "Wybór albumu do pobrania." #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "Wyszukiwanie w CDDB się nie powiodło (%s)" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "Konsola języka Python" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "Bieżący katalog roboczy:" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "Polecenie" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "name" msgstr "nazwa" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "Nazwa tego polecenia" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "command" msgstr "polecenie" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "Składnia wykonywanego polecenia powłoki" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "parametr" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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. używając „PARAM” wszystkie kopie " "„{PARAM}” w poleceniu będą prosiły o podanie wartości podczas wykonywania" #: ../quodlibet/ext/songsmenu/custom_commands.py:50 msgid "pattern" msgstr "wzorzec" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" "Wzorzec QL, np. <~filename>, używany do obliczania wartości dla polecenia" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "unikalny" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 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:58 msgid "max args" msgstr "maksymalna liczba parametrów" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 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:82 msgid "Input value" msgstr "Wprowadzenie wartości" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "Wartość dla %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 msgid "Custom Commands" msgstr "Własne polecenia" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Wykonuje własne polecenia (wsadowo, jeśli trzeba) na utworach używając ich " "etykiet." #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "Modyfikuj własne polcenia" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 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:235 #, python-format msgid "Unable to run custom command %s" msgstr "Nie można wykonać własnego 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:344 msgid "Collapse / Expand all" msgstr "Zwiń/rozwiń wszystko" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Wyrażenie klucza duplikatu: „%s”" #: ../quodlibet/ext/songsmenu/duplicates.py:364 msgid "Duplicates Browser" msgstr "Przeglądarka duplikatów" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "Wyszukuje i wyświetla podobnie oznaczone wersje utworów." #: ../quodlibet/ext/songsmenu/duplicates.py:404 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:406 msgid "_Group duplicates by:" msgstr "_Grupowanie duplikatów według:" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "Klucz duplikatu" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "Usuwanie _spacji" #: ../quodlibet/ext/songsmenu/duplicates.py:417 msgid "Remove _Diacritics" msgstr "Usuwanie znaków _diakrytycznych" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Remove _Punctuation" msgstr "Usuwanie _interpunkcji" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "Rozróżnianie wielkości _liter" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "Opcje dopasowywania" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 msgid "Edit Playcount" msgstr "Modyfikuj liczbę odtworzeń" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "Liczba odtworzeń" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "Liczba pominięć" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "Modyfikowanie osadzonych obrazów" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "Usuwa lub zastępuje osadzone obrazy." #: ../quodlibet/ext/songsmenu/embedded.py:65 msgid "_Remove all images" msgstr "_Usuń wszystkie obrazy" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "_Osadź bieżący obraz" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "Ustawianie dokładnej oceny" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "Umożliwia ustawianie oceny utworu jako liczby." #: ../quodlibet/ext/songsmenu/exact_rating.py:29 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:79 msgid "Filter on Any Tag" msgstr "Filtrowanie dowolnej etykiety" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" "Tworzy zapytanie wyszukiwania w oparciu o etykiety zaznaczonych utworów." #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 msgid "Filter on Directory" msgstr "Filtrowanie według katalogów" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 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:27 msgid "Acoustic Fingerprint Lookup" msgstr "Wyszukiwanie odcisku akustycznego" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Wyszukuje metadane utworu przez odcisk akustyczny." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "Wysłanie odcisków akustycznych" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Tworzy odciski akustyczne używając programu chromaprint i wysyła je do " "serwisu acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "Brak klucza API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "Zażądaj klucza API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "_Klucz API:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "Usługa WWW AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "W kolejce" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "Analizowanie" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "Wyszukaj" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Error" msgstr "Błąd" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Zapisz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "Stan" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "Wydanie" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 msgid "Write MusicBrainz tags" msgstr "Zapisywanie etykiet serwisu MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 msgid "Group by directory" msgstr "Grupowanie według katalogów" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 msgid "Album Mode" msgstr "Tryb albumów" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 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:46 msgid "Generating fingerprints:" msgstr "Tworzenie odcisków:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "_Szczegóły" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "_Wyślij" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "Odciski:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "Utwory z MBID:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "Utwory z wystarczającymi etykietami:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "Utwory do wysłania:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, 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:175 msgid "Submitting fingerprints:" msgstr "Wysyłanie odcisków:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "Wysyłanie…" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 msgid "Force Write" msgstr "Wymuszenie zapisania" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" "Ponownie zapisuje pliki. Zapewni to aktualność liczby odtworzeń i ocen." #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "Eksport do pliku HTML" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "Eksportuje zaznaczoną listę utworów do pliku HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "Naprawa czasu trwania plików MP3" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 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:16 msgid "Send to iFP" msgstr "Wysłanie do urządzenia iFP" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "Wysyła utwory do urządzenia iFP iRiver." #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "Eksport metadanych" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "Eksportuje metadane zaznaczonych utworów jako plik .tags." #: ../quodlibet/ext/songsmenu/importexport.py:84 msgid "Import Metadata" msgstr "Import metadanych" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "Importuje metadane zaznaczonych utworów z pliku .tags." #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "Nagrywanie płyt CD" #: ../quodlibet/ext/songsmenu/k3b.py:21 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:87 msgid "Updating chart list." msgstr "Aktualizowanie listy wykresów." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "Jest już aktualne." #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "Pobieranie wykresu dla tygodnia: %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "Synchronizacja ukończona." #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "Błąd podczas synchronizacji" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "Synchronizacja z serwisem Last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 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:277 msgid "_Username:" msgstr "Nazwa _użytkownika:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 msgid "No active song" msgstr "Brak aktywnego utworu" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 msgid "No lyrics found" msgstr "Nie odnaleziono tekstu utworu" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 msgid "Lyrics:" msgstr "Tekst utworu:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 msgid "Lyrics Window" msgstr "Okno tekstu utworu" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "Wyświetla okno zawierające tekst odtwarzanego utworu." #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "Tworzenie etykiet porządkowania" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" "Konwertuje nazwy albumów i wykonawców do ich porządkowania (niezbyt dobrze)." #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "Wyślij do…" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "Ogólna wtyczka do otwierania plików." #: ../quodlibet/ext/songsmenu/playlist.py:52 msgid "Playlist Export" msgstr "Eksport list odtwarzania" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "Eksportuje utwory do listy odtwarzania M3U lub PLS." #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "Ścieżki względne" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "Ścieżki bezwzględne" #: ../quodlibet/ext/songsmenu/playlist.py:150 msgid "Unable to export playlist" msgstr "Nie można wyeksportować listy odtwarzania" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 msgid "Refresh Songs" msgstr "Odświeżanie utworów" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "Sprawdza zmiany plików i wczytuje ponownie/usuwa je w razie potrzeby." #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d utwór" msgstr[1] "%d utwory" msgstr[2] "%d utworów" #: ../quodlibet/ext/songsmenu/refresh.py:28 msgid "Refresh songs" msgstr "Odświeżanie utworów" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "Analizator ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "Postęp" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "Wzmocnienie" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "Szczyt" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "<b>%(to-process)d</b> album do zaktualizowania (z %(all)d)" msgstr[1] "<b>%(to-process)d</b> albumy do zaktualizowania (z %(all)d)" msgstr[2] "<b>%(to-process)d</b> albumów do zaktualizowania (z %(all)d)" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:569 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:604 msgid "always" msgstr "zawsze" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "jeśli brakuje <b>dowolnych</b> etykiet RG" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "jeśli brakuje etykiet RG <b>album</b>" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "_Przetwarzane albumy:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 msgid "Existing Tags" msgstr "Istniejące etykiety" #: ../quodlibet/ext/songsmenu/splitting.py:15 msgid "Split Tags" msgstr "Rozdzielanie etykiet" #: ../quodlibet/ext/songsmenu/splitting.py:16 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:40 msgid "Split Album" msgstr "Rozdzielanie albumów" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "Rozdziela numer płyty." #: ../quodlibet/ext/songsmenu/website_search.py:34 msgid "Website Search" msgstr "Wyszukiwanie na stronie WWW" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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 używając dowolnych etykiet utworów.\n" "Obsługuje wzorce, np. %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:79 msgid "Search URL patterns" msgstr "Wzorzec adresu URL wyszukiwania" #: ../quodlibet/ext/songsmenu/website_search.py:89 msgid "Edit search URLs" msgstr "Modyfikowanie adresów URL wyszukiwania" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 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." #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Kolekcja" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Sprawdzanie punktów montowania" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Skanowanie kolekcji" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Skanowanie %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Wczytanie pliku się nie powiodło: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Wyświetla listę etykiet" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Wyświetla zwięzłe wyjście" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, 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:43 msgid "Also list programmatic tags" msgstr "Wyświetlanie także etykiet programistycznych" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Brak wystarczającej liczby parametrów" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "Za dużo parametrów" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 msgid "Description" msgstr "Opis" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Wartość" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Wyświetla wszystkie popularne etykiety" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Kopiuje etykiety z jednego pliku do drugiego" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Wyświetla zmiany, bez ich zastosowywania" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Pomija etykiety, które nie mogą zostać zapisane" #: ../quodlibet/operon/commands.py:135 #, 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:147 msgid "Edit tags in a text editor" msgstr "Modyfikuj etykiety w edytorze tekstu" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "Przerwano modyfikowanie" #: ../quodlibet/operon/commands.py:245 #, 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:250 msgid "No changes detected" msgstr "Nie wykryto zmian" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Ustawia etykietę i usuwa istniejące wartości" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Nie można ustawić %r" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "Usuwa etykiety" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "Wartość jest wyrażeniem regularnym" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "Usuwa wszystkie etykiety" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "Nie można łączyć „--all” z „--regexp”" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "Nie można usunąć %r z %r" #: ../quodlibet/operon/commands.py:369 msgid "Remove a tag value" msgstr "Usuwa wartość etykiety" #: ../quodlibet/operon/commands.py:418 msgid "Add a tag value" msgstr "Dodaje wartość etykiety" #: ../quodlibet/operon/commands.py:446 msgid "List file information" msgstr "Wyświetla informacje o pliku" #: ../quodlibet/operon/commands.py:492 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:505 #, python-format msgid "Failed to load image file: %r" msgstr "Wczytanie pliku obrazu się nie powiodło: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, 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:525 msgid "Remove all embedded images" msgstr "Usuwa wszystkie osadzone obrazy" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Wydobywa osadzone obrazy do %(filepath)s" #: ../quodlibet/operon/commands.py:564 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:623 msgid "Rename files based on tags" msgstr "Zmienia nazwy plików w oparciu o etykiety" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "Wypełnia etykiety w oparciu o ścieżki plików" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Plik" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Wypełnia numery ścieżek dla wszystkich plików" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "Wyświetla etykiety w oparciu o podany wzorzec" #: ../quodlibet/operon/commands.py:752 msgid "Display help information" msgstr "Wyświetla informacje 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Strumień" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Buforowanie" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "Nie można utworzyć potoku biblioteki GStreamer" #: ../quodlibet/player/gstbe/player.py:553 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:554 #, python-format msgid "Media format: %(format-description)s" msgstr "Format multimediów: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 msgid "No GStreamer audio sink found" msgstr "Nie odnaleziono żadnych odpływów dźwięku biblioteki GStreamer" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "Nieprawidłowy potok wyjściowy biblioteki GStreamer" #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Nie można utworzyć wyjścia dźwięku" #: ../quodlibet/player/xinebe/player.py:70 #, 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ć ustawienia " "programu Xine w ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:60 #, 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:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Nie można odnaleźć elementu biblioteki GStreamer „{element}”." #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "Uruchomić wtyczkę „%(name)s” na %(count)d liście odtwarzania?" msgstr[1] "Uruchomić wtyczkę „%(name)s” na %(count)d listach odtwarzania?" msgstr[2] "Uruchomić wtyczkę „%(name)s” na %(count)d listach odtwarzania?" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 msgid "_Run Plugin" msgstr "_Uruchom wtyczkę" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "Wczytanie mechanizmu dźwięku się nie powiodło" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" "Wczytanie mechanizmu dźwięku „%(name)s” się nie powiodło. Odtwarzanie " "dźwięku będzie wyłączone." #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Obsługiwane formaty: %s" #: ../quodlibet/qltk/about.py:59 #, 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:25 msgid "Beginning" msgstr "Początek" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "Nie dotyczy" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Czas" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nazwa zakładki" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM∶SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Zakładki" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtry" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "_Ostatnio odtwarzane" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Ostatnio _dodane" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 pop_ularnych" #: ../quodlibet/qltk/browser.py:57 msgid "All _Songs" msgstr "_Wszystkie utwory" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtruj g_atunek" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtruj _artystów" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtruj al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Losuj g_atunek" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Losuj _wykonawcę" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Losuj al_bum" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Brak informacji o czasie" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Wartość:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Zapisane wartości" #: ../quodlibet/qltk/cbes.py:252 msgid "Edit saved values…" msgstr "Modyfikuj zapisane wartości…" #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "_Otwórz" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Utwory" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Wyświetlanie pozostałego czasu" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_matycznie" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "Tryb ś_cieżek" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "Tryb _albumów" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "Wy_ciszenie" #: ../quodlibet/qltk/controls.py:338 msgid "_Replay Gain Mode" msgstr "_Tryb ReplayGain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "Nowe %s" #: ../quodlibet/qltk/data_editors.py:212 msgid "(unknown)" msgstr "(nieznany)" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "Wrażenie etykiety" #: ../quodlibet/qltk/data_editors.py:376 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:377 msgid "Enter new tag" msgstr "Nowa etykieta" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "Szczegóły błędu" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Wystąpił błąd" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" "Wystąpił wyjątek w programie Quod Libet. Plik zrzutu został zapisany w <b>" "%(dump-path)s</b>, co pomoże programistom debugować awarię. Prosimy zgłosić " "nowy błąd pod adresem %(new-issue-url)s i załączyć ten plik lub dołączyć " "jego zawartość. Ten plik może zawierać pewne informacje identyfikacyjne o " "użytkowniku lub systemie, takie jak lista ostatnio odtwarzanych plików. " "Jeśli nie jest to akceptowalne, to prosimy o wysłanie <b>%(mini-dump-path)s</" "b> zamiast tego, razem z opisem wykonywanych czynności." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" "Program Quod Libet może być teraz niestabilny. Zalecane jest jego zamknięcie " "i ponowne uruchomienie. Kolekcja zostanie zapisana." #: ../quodlibet/qltk/delete.py:33 msgid "Files:" msgstr "Pliki:" #: ../quodlibet/qltk/delete.py:59 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:68 msgid "The selected files will be deleted from disk." msgstr "Zaznaczone pliki zostaną usunięte z dysku." #: ../quodlibet/qltk/delete.py:73 #, 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:90 msgid "_Delete Files" msgstr "_Usuń pliki" #: ../quodlibet/qltk/delete.py:105 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:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Przenieś do kosza" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Przenoszenie %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Nie można przenieść do kosza" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 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:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Usuwanie %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 msgid "Unable to delete files" msgstr "Nie można usunąć plików" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "Za_trzymaj" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Rozdziel na _wiele wartości" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Oddziel płytę od al_bumu" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Oddziel _wersję od tytułu" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Oddziel aranżera od _wykonawcy" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Oddziel _wykonawcę od wykonawcy" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "Oddziel _wykonawcę od tytułu" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "Oddziel p_ierwotnego wykonawcę od tytułu" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Dodaj etykietę" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Etykieta:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Nie można dodać etykiety" #: ../quodlibet/qltk/edittags.py:658 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Nie można dodać <b>%s</b>" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Nieprawidłowa etykieta" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Nieprawidłowa wartość" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "C_ofnij" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "Po_nów" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Wtyczki" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Preferencje programu Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "_Rozdzielanie przy:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Modyfikowanie etykiet" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Katalogi" #: ../quodlibet/qltk/filesel.py:221 msgid "_New Folder…" msgstr "_Nowy katalog…" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "Z_aznacz wszystkie podkatalogi" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nowy katalog" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Nazwa nowego katalogu:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Nie można utworzyć katalogu" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Nie można usunąć katalogu" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr " %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Płyta %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Ścieżka %s" #: ../quodlibet/qltk/info.py:106 msgid "_Edit Display…" msgstr "_Modyfikuj wyświetlanie…" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nie wybrano żadnych utworów." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Brak utworów" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informacje" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Tekst utworu" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "wykonawca" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "wykonawcy" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "wykonawcy" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nigdy" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "dodano" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "ostatnio odtworzone" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "odtwarzań" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "pominięć" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "ocena" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "długość" #: ../quodlibet/qltk/information.py:275 msgid "format" msgstr "format" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "kodek" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 msgid "encoding" msgstr "kodowanie" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "gęstość bitowa" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "rozmiar pliku" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "zmodyfikowano" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Wyprodukowane przez %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "wykonawca" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Ścieżka jest niedostępna" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Wybrana dyskografia" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albumy" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Całkowita długość:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Całkowity rozmiar:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Pliki" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Pobierz" #: ../quodlibet/qltk/lyrics.py:37 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nie odnaleziono tekstu tego utworu." #: ../quodlibet/qltk/lyrics.py:78 msgid "Searching for lyrics…" msgstr "Wyszukiwanie tekstu utworu…" #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Nie można pobrać tekstu utworu." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "Na pewno usunąć wszystkie utwory?" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "Zaznaczone utwory zostaną usunięte z kolekcji." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "Wyświetl" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "_Wyświetl" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Odrzucić zmiany w etykietach?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 msgid "_Revert" msgstr "_Przywróć" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Plik istnieje" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "Zastąpić %(file-name)s?" #: ../quodlibet/qltk/msg.py:93 msgid "_Replace File" msgstr "_Zastąp plik" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Aktywne zadania" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "Uruchomione zadania: %d" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Nieznane" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "W kolejności" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_W kolejności" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Losowo" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Losowo" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Ważone" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Ważone" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Pojedynczo" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "P_ojedynczo" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Błędy wtyczek" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Włączone" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Wyłączone" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Brak kategorii" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nie odnaleziono żadnych wtyczek." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Wtyczki" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Wyświetlanie _błędów" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Płyta" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "Ścież_ka" #: ../quodlibet/qltk/prefs.py:45 msgid "Grou_ping" msgstr "_Grupowanie" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Nazwa pliku" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Długość" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Lista utworów" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "Automatyczne p_rzechodzenie do odtwarzanego utworu" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Zachowanie" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Inne:" #: ../quodlibet/qltk/prefs.py:93 msgid "_Edit…" msgstr "_Modyfikuj…" #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Dodawanie lub usuwanie dodatkowych nagłówków kolumn" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Widoczne kolumny" #: ../quodlibet/qltk/prefs.py:112 msgid "Artist includes all _people" msgstr "Wykonawca zawiera wszystkie _osoby" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Nazwa pliku zawiera _katalog" #: ../quodlibet/qltk/prefs.py:132 msgid "Column Preferences" msgstr "Preferencje kolumn" #: ../quodlibet/qltk/prefs.py:138 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:221 msgid "Edit Columns" msgstr "Modyfikuj kolumny" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Przeglądarki" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Filtr globalny:" #: ../quodlibet/qltk/prefs.py:242 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:249 msgctxt "heading" msgid "Search" msgstr "Wyszukiwanie" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Potwierdzanie _wielu ocen" #: ../quodlibet/qltk/prefs.py:256 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:259 msgid "Enable _one-click ratings" msgstr "Oceny jednym _kliknięciem" #: ../quodlibet/qltk/prefs.py:261 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Oceny" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Zaokrąglone rogi na miniaturach" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "Zaokrągla rogi obrazów miniatur okładek." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Preferowanie okładek _osadzonych" #: ../quodlibet/qltk/prefs.py:282 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:287 msgid "_Fixed image filename:" msgstr "_Stała nazwa pliku obrazu:" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "Jedyna używana nazwa pliku obrazu, jeśli zaznaczono" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Obraz okładki używany podczas wymuszania" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Okładki" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Odtwarzanie" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Konfiguracja wyjścia" #: ../quodlibet/qltk/prefs.py:344 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:347 msgid "_Fall-back gain (dB):" msgstr "Wzmocnienie _zapasowe (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 msgid "_Pre-amp gain (dB):" msgstr "_Przedwzmocnienie (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "Dopasowywanie głośności _ReplayGain" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Dopasowywanie głośności ReplayGain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "_Domyślna ocena:" #: ../quodlibet/qltk/prefs.py:463 msgid "Rating _scale:" msgstr "_Skala ocen:" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "Ilość uśredniania _Bayesa:" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Zapisywanie ocen i _liczby odtworzeń" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_E-mail:" #: ../quodlibet/qltk/prefs.py:532 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:547 msgid "Auto-save tag changes" msgstr "Automatyczne zapisywanie zmian etykiet" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Lista separatorów do użycia podczas rozdzielania wartości etykiet. Lista " "jest rozdzielana spacjami" #: ../quodlibet/qltk/prefs.py:579 msgid "Tags" msgstr "Etykiety" #: ../quodlibet/qltk/prefs.py:600 msgid "Updating for new ratings" msgstr "Aktualizowanie dla nowych ocen" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "_Odświeżanie kolekcji podczas uruchamiania" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Odśwież kolekcję" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Sprawdza zmiany w kolekcji" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "_Ponownie wczytaj kolekcję" #: ../quodlibet/qltk/prefs.py:630 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:640 msgid "Scan Directories" msgstr "Skanowane katalogów" #: ../quodlibet/qltk/prefs.py:646 msgid "Hidden Songs" msgstr "Ukryte utwory" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Właściwości" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Kolejka" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Usuwa wszystkie utwory z kolejki" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Losowanie" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Odtwarza od początku listy po odtworzeniu wszystkich utworów" #: ../quodlibet/qltk/quodlibetwindow.py:374 msgid "Playback Error" msgstr "Błąd odtwarzania" #: ../quodlibet/qltk/quodlibetwindow.py:382 msgid "Set up library directories?" msgstr "Ustawić katalogi kolekcji?" #: ../quodlibet/qltk/quodlibetwindow.py:383 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:389 msgid "_Not Now" msgstr "_Nie teraz" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "_Ustaw" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Nie można dodać utworów" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s używa nieobsługiwanego protokołu." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Muzyka" #: ../quodlibet/qltk/quodlibetwindow.py:803 msgid "_Add a Folder…" msgstr "_Dodaj katalog…" #: ../quodlibet/qltk/quodlibetwindow.py:808 msgid "_Add a File…" msgstr "_Dodaj plik…" #: ../quodlibet/qltk/quodlibetwindow.py:813 msgid "_Add a Location…" msgstr "_Dodaj położenie…" #: ../quodlibet/qltk/quodlibetwindow.py:818 msgid "Open _Browser" msgstr "Otwórz p_rzeglądarkę" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Sterowanie" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Przejdź do odtwarzanego utworu" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Widok" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "Pomo_c" #: ../quodlibet/qltk/quodlibetwindow.py:876 msgid "Stop After This Song" msgstr "Zatrzymaj po tym utworze" #: ../quodlibet/qltk/quodlibetwindow.py:882 msgid "Add Bookmark" msgstr "Dodaj zakładkę" #: ../quodlibet/qltk/quodlibetwindow.py:888 msgid "Edit Bookmarks…" msgstr "Modyfikuj zakładki…" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "_O programie" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Pomoc online" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Przeszukiwanie pomocy" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Lista utworów" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Dodaj położenie" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Położenie pliku dźwiękowego:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Nie można dodać położenia" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, python-format msgid "%s is not a valid location." msgstr "%s nie jest prawidłowym położeniem." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Dodaj muzykę" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Śledzenie zmian w tym katalogu" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 msgid "The saved ratings will be removed" msgstr "Zapisane oceny zostaną usunięte" #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 msgid "Change _Rating" msgstr "Zmień _oceny" #: ../quodlibet/qltk/ratingsmenu.py:58 msgid "_Remove Rating" msgstr "_Usuń oceny" #: ../quodlibet/qltk/ratingsmenu.py:76 msgid "_Remove rating" msgstr "_Usuń oceny" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Zmienianie spacji na p_odkreślenia" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Usuwanie znaków niezgodnych z systemem _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Usuwanie znaków _diakrytycznych" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Usuwanie znaków spoza zestawu _ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Używanie tylko _małych znaków" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Zmień nazwy plików" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Wzorzec ścieżki" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 msgid "Edit saved patterns…" msgstr "Modyfikuj zapisane wzorce…" #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Podgląd" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nowa nazwa" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Nie można zmienić nazwy pliku" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "_Ignorowanie wszystkich błędów" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Kontynuuj" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Ścieżka nie jest bezwzględna" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 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:108 msgid "Select Directories" msgstr "Wybierz katalogi" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Zapisane wyszukiwania" #: ../quodlibet/qltk/searchbar.py:50 msgid "Edit saved searches…" msgstr "Modyfikuj zapisane wyszukiwania…" #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Wyszukaj" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "Przeszukuje kolekcję, używając zwykłego tekstu lub zapytań programu QL" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Wy_szukiwanie podczas pisania" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Wyświetla wyniki wyszukiwania, kiedy użytkownik przestaje pisać." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Ograniczenie:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Waga" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtrowanie według %s" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "Wszystkie _nagłówki" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Nagłówki ś_cieżek" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Nagłówki _albumów" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Nagłówki _osób" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Nagłówki _dat" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Nagłówki p_lików" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Nagłówki p_rodukcji" #: ../quodlibet/qltk/songlist.py:1092 msgid "_Customize Headers…" msgstr "_Dostosuj nagłówki…" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "_Rozszerz kolumnę" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 msgid "Play_lists" msgstr "_Listy odtwarzania" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Dodaj do _kolejki" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Skopiuj na urządzenie" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "_Usuń z kolekcji" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Zmienianie p_odkreśleń na spacje" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Wielkie litery Jak W _Tytule" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Rozdzielanie na wiele _wartości" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Etykiety ze ścieżki" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Zastępowanie istniejących etykiet nowymi" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Dodawanie nowych etykiet do istniejących" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "Zapisz" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Nieprawidłowe etykiety" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Modyfikuj wyświetlanie" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Numery ścieżek" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Rozpoczynanie od:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Razem ścieżek:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Odtwórz/wstrzymaj" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Poprzednia" #: ../quodlibet/qltk/views.py:803 #, python-format msgid "and %d more…" msgstr "i %d więcej…" #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Zapisywanie zmienionych utworów." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, python-format msgid "%(current)d of %(all)d" msgstr "%(current)d z %(all)d" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Lista odtwarzania o nazwie %s już istnieje." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "Osadzona okładka" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "Używa okładek osadzonych w plikach dźwiękowych." #: ../quodlibet/util/cover/built_in.py:41 msgid "Filesystem cover" msgstr "Okładka w systemie plików" #: ../quodlibet/util/cover/built_in.py:42 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." #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "D:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "O:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "B:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Wyświetla skrócone informacje o użyciu" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Wyświetla wersję i prawa autorskie" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Użycie: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opcje]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Opcja %r nie została rozpoznana." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Opcja %r wymaga parametru." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r nie jest unikalnym przedrostkiem." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:379 #, 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:380 #, 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:381 #, 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:382 #, 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:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 msgctxt "check" msgid "titlecase?" msgstr "no_capitalize" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 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:102 msgid "Unable to edit song" msgstr "Nie można zmodyfikować utworu" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Nieprawidłowe kodowanie]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "aranżer" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "aranżerowie" #: ../quodlibet/util/tags.py:72 msgid "arrangement" msgstr "aranżacja" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autorzy" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "kompozytor" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "kompozytorzy" #: ../quodlibet/util/tags.py:75 msgid "composition" msgstr "kompozycja" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dyrygent" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dyrygenci" #: ../quodlibet/util/tags.py:76 msgid "conducting" msgstr "dyrygowanie" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "prawa autorskie" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "opis" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "gatunek" #: ../quodlibet/util/tags.py:81 msgid "genres" msgstr "gatunki" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "grupowanie" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "język" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licencja" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "położenie" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "autor tekstu" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "wydawca" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "tytuł" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "wersja" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "witryna" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "wykonawca albumu" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "Uderzenia na minutę" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "podpis płyty" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "płyta" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "ścieżka" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "numer katalogowy" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "data pierwszego wydania" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "oryginalny album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "oryginalny wykonawca" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "data nagrania" #: ../quodlibet/util/tags.py:107 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:116 msgid "MusicBrainz recording ID" msgstr "Identyfikator nagrania MusicBrainz" #: ../quodlibet/util/tags.py:117 msgid "MusicBrainz release track ID" msgstr "Identyfikator ścieżki wydania MusicBrainz" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "Identyfikator wydania MusicBrainz" #: ../quodlibet/util/tags.py:119 msgid "MusicBrainz artist ID" msgstr "Identyfikator wykonawcy MusicBrainz" #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz release artist ID" msgstr "Identyfikator wykonawcy wydania MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "Identyfikator TRM MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "PUID MusicIP" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Stan albumu MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Typ albumu MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "wzmocnienie ścieżki" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "szczyt ścieżki" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "wzmocnienie albumu" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "szczyt albumu" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "punkt odniesienia głośności" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "płyty" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "ścieżki" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "ostatnio rozpoczęte" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "pełna nazwa" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "punkt montowania" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "osoby" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "rok" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "data pierwszego wydania" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "zakładka" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "format pliku" #: ../quodlibet/util/tags.py:160 msgid "playlists" msgstr "listy odtwarzania" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "porządkowanie" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "role" ���������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/po/en_GB.po�������������������������������������������������������������������������0000644�0001750�0001750�00000502577�12646427551�015724� 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: 2016-01-16 12:54+0100\n" "PO-Revision-Date: 2013-07-20 22:34+0100\n" "Last-Translator: Nick Boultbee <nick.boultbee@googlemail.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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "an audio tag editor" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "directory" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Title" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Date" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "genre" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Rating" #: ../quodlibet/browsers/albums/main.py:160 msgid "Sort _by…" msgstr "" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferences" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Album List" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Album List" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "All Albums" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:640 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Reload album _cover" msgstr[1] "Reload album _covers" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Songs not in an album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d track" msgstr[1] "%d tracks" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disc" msgstr[1] "%d discs" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "All Albums" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Album List Preferences" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Show album _covers" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[options]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Album Display" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Invalid pattern" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Unknown" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "New Feed" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Enter the location of an audio feed:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Download" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Download Files" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Download File" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Unable to add feed" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Re_fresh Library" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Delete Files" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Library Browser" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Unknown" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Split into _Multiple Values" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Custom" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Remove Station" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Album List Preferences" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Disable Browser" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Disable Browser" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "File System" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_File System" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Unable to copy songs" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Add to Library" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Unsupported file type" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Unable to add station" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internet Radio" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Download Files" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internet Radio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_New Station" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "No stations found" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "No Internet radio stations were found at %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "All stations listed are already in your library." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Add to Playlist" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Remove from Playlist" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Device Properties" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Device:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Not mounted" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Mount Point:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Name:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Media Devices" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Media Devices" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Eject" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Properties" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Rename" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> is not connected." #: ../quodlibet/browsers/media.py:497 #, python-format msgid "Copying %(song)s" msgstr "" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Unable to copy song" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "There is not enough free space for this song." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> could not be copied." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Unable to delete songs" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Deleting %d/%d." #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> could not be deleted." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Unable to delete song" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Ejecting <b>%s</b> failed." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Unable to eject device" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Paned Browser" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Select _All" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "All" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Playlists" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Playlists" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Remove from Playlist" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "New Playlist" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Unable to import playlist" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Unable to rename playlist" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Import Playlist" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_New Playlist" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 msgid "Enter a name for the new playlist:" msgstr "Enter a name for the new playlist:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet is not running." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "a music library and player" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[options]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Print the playing song and exit" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Begin playing immediately" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Jump to next song" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Jump to previous song" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Start playback" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pause playback" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Toggle play/pause mode" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Start playback" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Turn up volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Turn down volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Print player status" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Hide main window" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Show main window" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Toggle main window visibility" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Focus the running player" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Remove active browser filters" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Refresh and rescan library" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Disable Browser" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Print the current playlist" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Print the contents of the queue" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Print the contents of the queue" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet is not running." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Exit Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Seek within the playing song" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Set or toggle the playback order" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Turn repeat off, on, or toggle it" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Set the volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Search your audio library" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "query" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Play a file" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "filename" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Rate the playing song" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Set the current browser" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Open a new browser" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Show or hide the queue" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Show or hide the main song list" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filter on a random value" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filter on a tag value" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "filename" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Unqueue a file or query" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Invalid argument for '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Try %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Unknown Device" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, python-format msgid "%r is not a supported device." msgstr "%r is not a supported device." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Initialising device backend." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Device backend initialised." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Uninitialised iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Do you want to create an empty database on this iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copy _album covers" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combine tags with _multiple values" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Title includes _version" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Album includes _disc subtitle" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capacity:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Unable to save iPod database" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Unable to save iPod database" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Remove unused covers and directories" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Invalid Encoding]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Title" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio tag editor" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Title-case tags" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 #, fuzzy msgid "Animated On-Screen Display" msgstr "_On-Screen Display" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Total size:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Weight" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Preview" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 #, fuzzy msgid "Party" msgstr "_Part" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "1 second" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Custom" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Clear Errors" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Music Player" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internet Radio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "location" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Hide main window" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferences" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Title" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "No new stations" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "No new stations" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 #, 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:461 #, fuzzy msgid "_Service:" msgstr "Device:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Name:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Others:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Random Al_bum" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albums" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Weight" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Random Al_bum" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Import Playlist" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Play _song" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 #, fuzzy msgid "Plain text for status when there is no current song" msgstr "Pause/resume the current song" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d song" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Scroll _Wheel" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Tooltip Display" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Not playing" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "Tray Icon Preferences" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Player" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "_Pause" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Pre_vious" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "_Next" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "Play _Order" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Repeat" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Stop after this song" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Browse Library" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Edit _Tags" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Lyrics" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Lyrics" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Preview" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filter on _Artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Set Rating" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Custom" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filter on _Genre" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filter on _Artist" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio Feeds" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Enter the location of an audio feed:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "New Playlist" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_Queue" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Never" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "track peak" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Rename" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Library" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Hide main window" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Filename" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Unable to save song" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Album List" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Size" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Search:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Search" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Album List" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Edit Bookmarks..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Edit Bookmarks..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Bookmarks" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filename" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Track" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Title" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artist" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "No plugins found." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "and %d more..." msgstr[1] "and %d more..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "query" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Search" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Split Disc out of _Album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Browsers" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Unable to create folder" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Track List" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Time" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Select _All" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Rename" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 msgid "pattern" msgstr "pattern" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Invalid value" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Custom" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Disable Browser" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Remove Station" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "New/Edit Playlist" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 #, fuzzy msgid "Skip Count" msgstr "skip count" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filter on a tag value" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filter on _Genre" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Show _Errors" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Write" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "directory" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Album Headers" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Write" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Import Playlist" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Rename" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Unable to save song" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "No plugins found." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Lyrics" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Lyrics" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "View and edit tags in the playing song" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Playlists" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Unable to import playlist" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Ejecting <b>%s</b> failed." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Re_fresh Library" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d song" msgstr[1] "%d songs" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Re_fresh Library" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Edit Tags" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Edit Tags" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "All Albums" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Search" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Edit saved values..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Library" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Checking mount points" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Scanning library" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Scanning %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "Description" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Value" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio tag editor" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "No songs are selected." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_Remove Station" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Remove selected tag" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filter on a tag value" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filter on a tag value" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "No time information" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Unable to rename file" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Remove selected tag" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "File" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "No audio device found" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Plugins" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Supported formats: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Audio device: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Beginning" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Time" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Bookmark Name" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Bookmarks" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filters" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Never Played" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "All songs" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filter on _Genre" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filter on _Artist" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filter on Al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Random _Genre" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Random _Artist" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Random Al_bum" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "No time information" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Value:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Saved Values" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Edit saved values..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Songs" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Display remaining time" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Track Headers" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Album Headers" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Rename Files" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Unknown" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filter on a tag value" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Files" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Delete Files" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Move to Trash" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "" #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Moving <b>%s</b> to the trash failed." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Unable to delete file" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Split into _Multiple Values" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Split Disc out of _Album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Split Arranger out of Ar_tist" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Add a Tag" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Unable to add tag" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Unable to add song" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Invalid tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Invalid value" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso Preferences" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Split _on:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Tag Editing" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Folders" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "New Folder" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Select All Subfolders" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "New Folder" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Enter a name for the new folder:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Unable to create folder" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Unable to delete folder" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "by %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disc %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Track %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Edit Display" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "No songs are selected." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "No Songs" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Lyrics" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artists" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "performers" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Never" #: ../quodlibet/qltk/information.py:213 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "added" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "last played" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "plays" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "skips" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "rating" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "length" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Information" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Invalid Encoding]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "file size" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modified" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selected" msgstr[1] "%d selected" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Produced by %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "performer" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Track unavailable" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Selected Discography" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Total length:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Total size:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Files" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "No lyrics found for this song." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Searching for lyrics..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Unable to download lyrics." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Discard tag changes?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Never" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "File exists" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Rename Files" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Unknown" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "In Order" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_In Order" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Shuffle" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Shuffle" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Weighted" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Weighted" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "One Song" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_One Song" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Plugin Errors" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Disabled" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "No plugins found." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Show _Errors" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disc" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Track" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "grouping" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Filename" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Length" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Song List" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Jump to playing song automatically" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Behaviour" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Others:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Edit Display..." #: ../quodlibet/qltk/prefs.py:95 #, fuzzy msgid "Add or remove additional column headers" msgstr "Set and save column headers" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Title includes _version" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Filename includes _folder" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferences" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Browsers" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Global filter:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Search" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Ratings" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Album List" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Pause playback" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Enable Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Set Rating" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Ratings" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Save ratings and play _counts" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Discard tag changes?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Edit Tags" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_New Station" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Re_fresh Library" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Check for changes in your library" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Re_load Library" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Scan _Directories" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "No Songs" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Properties" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Queue" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Remove all songs from the queue" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Random" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Restart the playlist when finished" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Pause playback" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Select Directories" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Unable to add songs" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> uses an unsupported protocol." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Music" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Add a Folder..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Add a File..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Add a Location" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Open a new browser" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Jump to Playing Song" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_View" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Help" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Stop after this song" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Bookmarks" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Edit Bookmarks..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "_About" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Search" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Song _List" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Add a Location" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Enter the location of an audio file:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Unable to add location" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> is not a valid location." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Add Music" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Watch this folder for new songs" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Rating" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Remove Station" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Remove Station" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Replace spaces with _underscores" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Strip _Windows-incompatible characters" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Strip _diacritical marks" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Strip non-_ASCII characters" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Rename Files" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "Invalid Pattern" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Edit saved values..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Preview" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "New Name" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Unable to rename file" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continue" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Path is not absolute" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Select Directories" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Saved Values" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Edit saved values..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Search" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Search after _typing" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Weight" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filter on %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Track Headers" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_People Headers" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Date Headers" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_File Headers" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Production Headers" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Customise Headers..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Playlists" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Add to _Queue" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Copy to Device" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Remove from Library" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Replace _underscores with spaces" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Title-case tags" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Split into multiple _values" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tags From Path" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Tags replace existing ones" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tags are added to existing ones" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Invalid tags" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Edit Display" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Track Numbers" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start fro_m:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Total tracks:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "_Pause" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "Pre_vious" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "and %d more..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Saving the songs you changed." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, python-format msgid "%(current)d of %(all)d" msgstr "" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "A playlist named %s already exists." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "File System" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Display brief usage information" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Display version and copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[options]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Option %r not recognised." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Option '%r' requires an argument." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "'%r' is not a unique prefix." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d second" msgstr[1] "%d seconds" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minute" msgstr[1] "%d minutes" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hour" msgstr[1] "%d hours" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d day" msgstr[1] "%d days" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Unable to edit song" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Invalid Encoding]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arranger" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangers" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arranger" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "author" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "authors" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "composer" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "composers" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "composer" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "conductor" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "conductors" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "conductor" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "date" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "description" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "genre" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "grouping" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "language" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "location" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "lyricist" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organisation" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "title" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "website" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "album artist" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "track" # label ID #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "label ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "original release date" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "original album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "original artist" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "recording date" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz album artist ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz album artist ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz album type" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "track gain" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "track peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discs" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "tracks" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "last started" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "full name" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "mount point" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "people" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "year" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "original release date" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Playlists" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "Clear search" #~ msgstr "Clear search" #~ 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 "lyricists" #~ msgstr "lyricists" #~ 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 "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 "" #~ "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 "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 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 "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 "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.5.3/po/el.po����������������������������������������������������������������������������0000644�0001750�0001750�00000646202�12646427551�015344� 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: 2016-01-16 12:54+0100\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 "Αναπαραγωγή Μουσικής" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "ένας επεξεργαστής ετικετών μουσικής" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "κατάλογος" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Τίτλος" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Καλλιτέχνης" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Ημερομηνία" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Είδος μουσικής" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Βαθμολογία" #: ../quodlibet/browsers/albums/main.py:160 msgid "Sort _by…" msgstr "Τα_ξινόμηση κατά…" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Προτιμήσεις" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Λίστα Άλμπουμ" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Λίστα Ά_λμπουμ" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Όλα τα Άλμπουμ" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d άλμπουμ" msgstr[1] "%d άλμπουμς" #: ../quodlibet/browsers/albums/main.py:640 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Επαναφόρτωση ε_ξώφυλλου του άλμπουμ" msgstr[1] "Επαναφόρτωση ε_ξώφυλλων των άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Τραγούδια που δεν ανήκουν σε κάποιο άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d τραγούδι" msgstr[1] "%d τραγούδια" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d δίσκος" msgstr[1] "%d δίσκοι" #: ../quodlibet/browsers/albums/prefs.py:66 msgid "An Example Album" msgstr "Ένα Άλμπουμ για παράδειγμα" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Προτιμήσεις Λίστας Άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Δείξε _εξώφυλλα των άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Η _αναζήτηση συμπεριλαμβάνει ονόματα συντελεστών" #: ../quodlibet/browsers/albums/prefs.py:93 msgid "Options" msgstr "Επιλογές" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Προβολή Άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "_Κλείσιμο" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Μη έγκυρη αναζήτηση" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Άγνωστο" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Νέα Ροή" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Εισήγαγε την τοποθεσία μιας ροής ήχου" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "_Προσθήκη" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Ροές Ήχου" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Ροές Ήχου" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 msgid "_Download…" msgstr "_Λήψη" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Κατέβασμα Αρχείων" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "_Ακύρωση" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "_Αποθήκευση" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Κατέβασμα Αρχείου" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "_Νέο" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Αδυναμία προσθήκης ροής" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 msgid "_Refresh" msgstr "Α_νανέωση" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 msgid "_Delete" msgstr "_Διαγραφή Αρχείων" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "Δεν μπόρεσα να εισάγω τη λειτουργία %s, ο περιηγητής ροών ήχου " "απενεργοποιήθηκε." #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Το τρέχων ηχητικό σύστημα δεν υποστηρίζει απομακρυσμένες διευθύνσεις ο " "περιηγητής Ροών Ήχου απενεργοποιήθηκε" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Περιηγητής Μουσικοθήκης" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Συλλογή Άλμπουμ" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Σ_υλλογή Άλμπουμ" #: ../quodlibet/browsers/collection/models.py:23 #, python-format msgid "Unknown %s" msgstr "Άγνωστο %s" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "Πολλαπλές Τιμές %s" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Προσαρμοσμένο" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 msgid "_Remove" msgstr "_Αφαίρεση" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Ετικέτα" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Συγχώνευση" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Προτιμήσεις Συλλογής Άλμπουμ" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "_Εφαρμογή" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Απενεργοποίηση Περιηγητή" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Απενεργοποίηση Περιηγητή" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Σύστημα Αρχείων" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Σύστημα Αρχείων" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Αδυναμία αντιγραφής τραγουδιών" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Τα επιλεγμένα τραγούδια δεν μπορούν να αντιγραφούν σε άλλες λίστες ή στην " "ουρά αναπαραγωγής." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "_Προσθήκη στην Μουσικοθήκη" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Μη υποστηριζόμενος τύπος αρχείου" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Δεν μπορεί να προστεθεί ο σταθμός" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Διαδικτυακό Ραδιόφωνο" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Κατέβασμα λίστας σταθμών" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Νέος Σταθμός" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Κλασική" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "Διαδικτυακό Ραδιό_φωνο" #: ../quodlibet/browsers/iradio.py:549 msgid "_New Station…" msgstr "_Νέος Σταθμός…" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "_Ανανέωση Σταθμών" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Όλοι οι Σταθμοί" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Αγαπημένα" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Χωρίς Κατηγορία" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Δεν βρέθηκαν σταθμοί" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Δεν βρέθηκε σταθμός ραδιοφώνου στο %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Όλοι οι σταθμοί που επεστράφησαν ανήκουν ήδη στην μουσικοθήκη" #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "Προσθήκη στα Αγαπημένα" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Αφαίρεση από τα Αγαπημένα" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d σταθμός" msgstr[1] "%(count)d σταθμοί" #: ../quodlibet/browsers/media.py:34 msgid "Device Properties" msgstr "Ιδιότητες Συσκευής" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Συσκευή:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Μη προσαρτημένο" #: ../quodlibet/browsers/media.py:53 msgid "Mount point:" msgstr "Σημείο Προσάρτησης:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "Ό_νομα:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Συσκευές Μέσων" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Συσκευές Μέσων" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Εξαγωγή" #: ../quodlibet/browsers/media.py:358 msgid "_Properties" msgstr "_Ιδιότητες" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Μετονομασία" #: ../quodlibet/browsers/media.py:459 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s σε χρήση, %(free-size)s διαθέσιμο" #: ../quodlibet/browsers/media.py:477 #, python-format msgid "%s is not connected." msgstr "%s δεν είναι συνδεδεμένο." #: ../quodlibet/browsers/media.py:497 #, python-format msgid "Copying %(song)s" msgstr "Αντιγραφή %(song)s" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Αδυναμία αντιγραφής τραγουδιού" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Δεν υπάρχει αρκετός ελεύθερος χώρος γι' αυτό το τραγούδι" #: ../quodlibet/browsers/media.py:524 #, python-format msgid "%s could not be copied." msgstr "Το %s δεν μπόρεσε να αντιγραφεί." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Αδυναμία διαγραφής τραγουδιών" #: ../quodlibet/browsers/media.py:555 #, python-format msgid "Deleting %(song)s" msgstr "Διαγραφή %(song)s" #: ../quodlibet/browsers/media.py:573 #, python-format msgid "%s could not be deleted." msgstr "Δεν ήταν δυνατό να διαγραφεί το %s." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Αδυναμία διαγραφής τραγουδιού" #: ../quodlibet/browsers/media.py:592 #, python-format msgid "Ejecting %s failed." msgstr "Η εξαγωγή του %s απέτυχε." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Αδυναμία εξαγωγής συσκευής" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" "Χωρίς υποστήριξη συσκευών, ο περιηγητής Συσκευών Μέσων απενεργοποιήθηκε." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Περιηγητής με Στήλες" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "Περιηγητής με _Στήλες" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Επιλογή Όλ_ων" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Όλα" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "Λειτουργία _Πλατιάς προβολής" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Προτιμήσεις Περιηγητή με Στήλες" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Λίστες Αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Λίστες Αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Αφαίρεση από την Λίστα" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Εισαγωγή" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Νέα Λίστα Αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Αδυναμία εισαγωγής λίστας αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Ο Quod Libet μπορεί να εισάγει λίστες τύπου M3U και PLS μόνο." #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "Αδυναμία μετονομασίας λίστας αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Εισαγωγή Λίστας Αναπαραγωγής" #: ../quodlibet/browsers/playlists/menu.py:20 msgid "_New Playlist…" msgstr "_Νέα Λίστα Αναπαραγωγής…" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Επιβεβαίωση ενέργειας στην λίστα \"%s\"" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Θέλετε σίγουρα να διαγραφεί η λίστα αναπαραγωγής '%s';" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Οι πληροφορίες που αφορούν την επιλεγμένη λίστα αναπαραγωγής θα διαγραφούν " "χωρίς δυνατότητα ανάκτησης" #: ../quodlibet/browsers/playlists/util.py:49 msgid "Enter a name for the new playlist:" msgstr "Εισάγετε όνομα για την νέα λίστα" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Ο Quod Libet δεν εκτελείται (προσθέστε '--run' για να τον ξεκινήσετε)" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "Μουσικοθήκη και αναπαραγωγέας" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[επιλογή]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Εμφάνιση του αναπαραγόμενου τραγουδιού και έξοδος" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Έναρξη αναπαραγωγής άμεσα" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Μεταπήδηση στο επόμενο τραγούδι" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Μεταπήδηση στην αρχή του τραγουδιού ή στο προηγούμενο αν είναι ήδη κοντά " "στην αρχή" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Μεταπήδηση στο προηγούμενο τραγούδι" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Έναρξη αναπαραγωγής" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Παύση αναπαραγωγής" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Εναλλαγή αναπαραγωγής/παύσης" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Σταμάτημα αναπαραγωγής" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Αύξηση της έντασης αναπαραγωγής" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Μείωση της έντασης αναπαραγωγής" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Εμφάνιση της κατάστασης του αναπαραγωγέα" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Απόκρυψη του κυρίου παραθύρου" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Εμφάνιση του κυρίου παραθύρου" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Εναλλαγή ορατότητας κυρίου παραθύρου" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Εστίαση του εκτελούμενου αναπαραγωγέα" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Αφαίρεση ενεργών φίλτρων περιηγητή" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Ανανέωση και σάρωση ξανά της μουσικοθήκης" #: ../quodlibet/cli.py:106 msgid "List available browsers" msgstr "Προβολή διαθέσιμων περιηγητών" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Εμφάνιση της τρέχουσας λίστας αναπαραγωγής" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Εμφάνιση των περιεχομένων της ουράς αναπαραγωγής" #: ../quodlibet/cli.py:109 msgid "Print the active text query" msgstr "Εμφάνιση της ενεργής αναζήτησης" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Εκκίνηση χωρίς πρόσθετα" #: ../quodlibet/cli.py:111 msgid "Start Quod Libet if it isn't running" msgstr "Εκκινήστε τον Quod Libet αν δεν εκτελείται" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Έξοδος από τον Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Αναζήτηση στο αναπαραγόμενο τραγούδι" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ΩΩ:]ΛΛ:ΔΔ" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Καθορισμός ή εναλλαγή της σειράς αναπαραγωγής" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Ενεργοποίηση, απενεργοποίηση ή εναλλαγή της επανάληψης" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Καθορισμός έντασης" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Αναζήτηση στην μουσικοθήκη" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "ερώτημα" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Αναπαραγωγή αρχείου" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 msgctxt "command" msgid "filename" msgstr "όνομα αρχείου" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Βαθμολόγηση αναπαραγόμενου τραγουδιού" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Καθορισμός τρέχοντος περιηγητή" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Άνοιγμα νέου περιηγητή" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Εμφάνιση ή απόκρυψη της ουράς αναπαραγωγής" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Εμφάνιση ή απόκρυψη της κύριας λίστας τραγουδιών" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Φιλτρο βάσει τυχαίας τιμής" #: ../quodlibet/cli.py:129 msgctxt "command" msgid "tag" msgstr "ετικέτα" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Φίλτρο βάσει ετικέτας" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "ετικέτα=τιμή" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Προσθήκη ενός αρχείου ή ενός ερωτήματος στην ουρά" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Προσθήκη στην ουρά αρχείων διαχωρισμένων με κόμματα" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "όνομα αρχείου" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" "Εμφάνιση ονομάτων αρχείων ή αποτελεσμάτων ερωτήματος στην κανονική έξοδο" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Αφαίρεση αρχείου ή ερωτήματος από την ουρά αναπαραγωγής" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Μη έγκυρο όρισμα για το '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Δοκιμάστε το %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Άγνωστη Συσκευή" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Δεν μπόρεσε να εισαχθεί το %s, που χρειάζεται για υποστήριξη συσκευών." #: ../quodlibet/devices/__init__.py:148 #, python-format msgid "%r is not a supported device." msgstr "Το %r δεν είναι υποστηριζόμενη συσκευή." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "Δεν βρέθηκε το %s." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Αρχικοποίηση υποστήριξης συσκευών" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Δοκιμή '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Δεν ήταν δυνατή η σύνδεση σε κάποιο σύστημα υποστήριξης συσκευών." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Αρχικοποιήθηκε η υποστήριξη συσκευών." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Μη αρχικοποιημένο iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Θέλεις να δημιουργήσεις μια άδεια βάση δεδομένων σε αυτό το iPod;" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "_Δημιουργία βάσης δεδομένων" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Αύξηση Ήχου (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Αντιγραφή εξώφυλλων ά_λμπουμ" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Συνδύασε ετικέτες με _πολλαπλές τιμές" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Ο Τίτλος να περιλαμβάνει την έκ_δοση" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Το Άλμπουμ περιλαμβάνει τον υπότιτλο του _δίσκου" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Μοντέλο:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Χωρητικότητα:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Έκδοση Υλικολογισμικού:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Removing orphaned iPod track" #: ../quodlibet/devices/ipod.py:310 msgid "Saving iPod database…" msgstr "Αποθήκευση της βάσης δεδομένων του iPod…" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Αδυναμία αποθήκευσης της βάσης δεδομένων του iPod" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "Δεν βρέθηκε το libgpod, η υποστήριξη iPod απενεργοποιήθηκε." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Πρότυπο ονόματος αρχείου:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Αφαίρεση αχρείαστων εξώφυλλων και φακέλων" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "Πηγή Εξωφύλλου Last.fm" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Λήψη εικόνας από το αρχείο εξώφυλλων του Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:18 msgid "MusicBrainz Cover Source" msgstr "Πηγή Εξωφύλλου MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Λήψη εικόνας από το αρχείο εξώφυλλων του musicbrainz." #: ../quodlibet/ext/editing/iconv.py:33 msgid "Convert Encodings" msgstr "Μετατροπή κωδικοποιήσεων" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Διόρθωση λάθος εντοπισμένων κωδικοποιήσεων στις ετικέτες." #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "_Μετατροπή Κωδικοποιήσεων…" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "Απλός μετατροπέας Kana/Kanji" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" "Μετατροπή των γραμμάτων kana/kanji σε λατινικούς χαρακτήρες (romaji) πριν " "την μετονομασία." #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "Μετατροπή _Ιαπωνικού κειμένου σε λατινικούς χαρακτήρες" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Δεν βρέθηκε το πρόγραμμα μετατροπής Kanji Kana (kakasi)." #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "Αντικατάσταση με χρήση Regex" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Επιτρέπει αντικαταστάσεις με χρήση κανονικών εκφράσεων (s///) στην " "επεξεργασία ετικετών ή την μετονομασία αρχείων." #: ../quodlibet/ext/editing/titlecase.py:19 msgid "Title Case" msgstr "Διόρθωση πεζών/Κεφαλαίων γραμμάτων" #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title-cases tag values in the tag editor." msgstr "Διόρθωση των κεφαλαίων στις ετικέτες." #: ../quodlibet/ext/editing/titlecase.py:39 msgid "Title-_case Value" msgstr "_Κεφαλαιοποίηση Του Πρώτου Γράμματος Κάθε Λέξης" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "Να επιτρέπονται Τ_Α ΚΕΦΑΛΑΙΑ στις ετικέτες" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "Κεφαλαιοποίηση με α_γγλικούς κανόνες" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 msgid "Advanced Preferences" msgstr "Προχωρημένες Προτιμήσεις" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "Επιτρέψτε την αλλαγή ρυθμίσεων για προχωρημένους." #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "Κινούμενες Ειδοποιήσεις Οθόνης" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "Εμφανίζει πληροφορίες στην οθόνη σας στην αλλαγή τραγουδιού." #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "Κορυφή της οθόνης" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "Μέση της οθόνης" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "Κάτω μέρος της οθόνης" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "_Θέση:" #: ../quodlibet/ext/events/animosd/prefs.py:170 msgid "_Cover size:" msgstr "Μέγεθος _Εξώφυλλου:" #: ../quodlibet/ext/events/animosd/prefs.py:176 msgid "Display" msgstr "Προβολή" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "_Γραμματοσειρά:" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "Αριστερά" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "Κέντρο" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Right" msgstr "Δεξιά" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "_Στοίχιση κειμένου:" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "Κείμενο" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "_Κείμενο:" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "_Φόντο:" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "Χρώματα" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "_Σκιές" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "_Περίγραμμα" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "Στρογγυλεμένες _Γωνίες" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "Κα_θυστέρηση:" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "Εφέ" #: ../quodlibet/ext/events/animosd/prefs.py:267 msgid "Ed_it Display Pattern…" msgstr "_Επεξεργασία Πρότυπου Εμφάνισης…" #: ../quodlibet/ext/events/animosd/prefs.py:271 msgid "Preview" msgstr "Προεπισκόπηση" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "Αυτόματη Ανανέωση Μουσικοθήκης" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" "Διατηρεί τη μουσικοθήκη σας ενημερωμένη με χρήση inotify. Χρειάζεται το %s." #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "Αυτόματη Απόκρυψη" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Αυτόματη εμφάνιση και απόκρυψη δίσκων καθώς προσαρτώνται ή αφαιρούνται." #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "Αυτόματη Βαθμολογία" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "Ξυπνητήρι" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "Σας ξυπνά με δυνατή μουσική." #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "Νανούρισμα" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "Σταδιακή σίγαση και μετά παύση της μουσικής σας." #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "Επίπεδο" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "Ζωντανή" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "Πλήρης Μπάσα και Πρίμα" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "Κλαμπ" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "Μεγάλη Αίθουσα" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "Πάρτυ" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "Απαλή" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "Πλήρης Μπάσα" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "Ακουστικά" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "Απαλή Ροκ" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "Πλήρης Πρίμα" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "Χορευτική" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "Φορητός Υπολογιστής" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "Αντισταθμιστής" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "Έλεγχος της χροιάς της μουσικής σας με χρήση αντισταθμιστή." #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "Το τρέχων ηχητικό σύστημα δεν υποστηρίζει αντιστάθμιση." #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, python-format msgid "%.1f dB" msgstr "" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 msgid "Custom" msgstr "Προσαρμοσμένο" #: ../quodlibet/ext/events/equalizer.py:189 msgid "_Clear" msgstr "_Καθαρισμός" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "Μήνυμα Κατάστασης Gajim" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "Αλλαγή του μηνύματος κατάστασης του Gajim σύμφωνα με το τι ακούτε." #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Αν τσεκαριστεί κατά την παύση θα προστεθεί το '[paused]' στο μήνυμα " "κατάστασης." #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "Καταστάσεις για τις οποίες θα αλλαχθεί το μήνυμα κατάστασης" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "Αναστολή Προστασίας Οθόνης" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "Απενεργοποίηση της προστασίας οθόνης του GNOME κατά την αναπαραγωγή." #: ../quodlibet/ext/events/inhibit.py:50 msgid "Music is playing" msgstr "Αναπαράγεται μουσική" #: ../quodlibet/ext/events/iradiolog.py:15 msgid "Internet Radio Log" msgstr "Καταγραφή Διαδικτυακού Ραδιοφώνου" #: ../quodlibet/ext/events/iradiolog.py:16 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:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Εξάγει αρχείο μουσικής χρήστη Jabber στο ~/.quodlibet/jabber" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "Διακομιστής πολυμέσων UPnP AV Media Server" #: ../quodlibet/ext/events/mediaserver.py:37 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:63 msgid "MPD Server" msgstr "Διακομιστής MPD" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 msgid "Connection" msgstr "Σύνδεση" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "Δοκιμασμένοι Πελάτες" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "Υποστήριξη MPRIS D-Bus" #: ../quodlibet/ext/events/mpris.py:45 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.py:51 ../quodlibet/ext/events/trayicon.py:42 msgid "Hide main window on close" msgstr "Απόκρυψη του κυρίου παραθύρου στο κλείσιμο" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Προτιμήσεις" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "Κείμενο ειδοποίησης" #: ../quodlibet/ext/events/notify.py:86 msgid "_Title:" msgstr "_Τίτλος:" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "Επαναφορά στο προκαθορισμένο πρότυπο" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "_Σώμα:" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "_Εμφάνιση ειδοποίησης" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "Εμφάνιση ειδοποιήσεων" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "Μόνο σε <i>_χειροκίνητες</i> αλλαγές τραγουδιών" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "Μόνο σε <i>_αυτόματες</i> αλλαγές τραγουδιών" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "Σε <i>Ό_λες</i> τις αλλαγές τραγουδιών" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "Μόνο όταν το κύριο παράθυρο δεν είναι _εστιασμένο" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "Σφάλμα σύνδεσης" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "Δεν ήταν δυνατή η σύνδεση με τον δαίμονα ειδοποιήσεων." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "Ειδοποιήσεις Τραγουδιών" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "Εμφανίζει ειδοποίηση στην αλλαγή τραγουδιού." #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 msgid "_Service:" msgstr "_Υπηρεσία:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "User_name:" msgstr "Όνομα _χρήστη:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "_Κωδικός:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 msgid "Other…" msgstr "Άλλο…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "_Επαλήθευση δεδομένων λογαριασμού" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "Λογαριασμός" #: ../quodlibet/ext/events/qlscrobbler.py:528 msgid "_Artist pattern:" msgstr "Πρότυπο _Καλλιτέχνη:" #: ../quodlibet/ext/events/qlscrobbler.py:528 msgid "_Title pattern:" msgstr "_Πρότυπο Τίτλου:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "_Φίλτρο εξαιρέσεων:" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Το πρότυπο που θα χρησιμοποιηθεί για την υποβολή του ονόματος καλλιτέχνη. " "Αφήστε το κενό για τη χρήση προκαθορισμένου." #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Το πρότυπο που θα χρησιμοποιηθεί για την υποβολή του τίτλου. Αφήστε το κενό " "για τη χρήση προκαθορισμένου." #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "Τα τραγούδια που ταιριάζουν με αυτό το φίλτρο δεν θα υποβάλλονται." #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "Λειτουργία Εκτός _Σύνδεσης (να μην υποβληθεί τίποτα)" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "Υποβολή" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "Σίγαση Ραδιοφωνικών Διαφημίσεων" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Σίγαση κατά την αναπαραγωγή ραδιοφωνικών διαφημίσεων.\n" "Σταθμοί: di.fm" #: ../quodlibet/ext/events/randomalbum.py:25 msgid "Random Album Playback" msgstr "Αναπαραγωγή Τυχαίου Άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "Πιο υψηλά βαθμολογημένο" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "Έχει αναπαραχθεί συχνά" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "Έχει παραληφθεί συχνά" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "Έχει αναπαραχθεί πρόσφατα" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "Έχει ξεκινήσει να αναπαράγεται πρόσφατα" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "Έχει προστεθεί πρόσφατα" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Longer albums" msgstr "Μεγαλύτερα σε διάρκεια άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "δευτερόλεπτα πριν την εκκίνηση του επόμενου άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:84 msgid "Weights" msgstr "Βαρύτητες" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "Να προτιμούνται κάποια άλμπουμ περισσότερο" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "απέφυγε" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "προτίμησε" #: ../quodlibet/ext/events/randomalbum.py:198 msgid "Random Album" msgstr "Τυχαίο Άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "Ξεκινά το %s" #: ../quodlibet/ext/events/rbimport.py:115 msgid "Import Failed" msgstr "Η Εισαγωγή Απέτυχε" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Επιτυχής εισαγωγή βαθμολογιών και στατιστικών για %d τραγούδια" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "Εισαγωγή από τον Rhythmbox" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "Παύση με την Προστασία Οθόνης" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Παύει τη μουσική όταν ενεργοποιηθεί η προστασία οθόνης του GNOME." #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" "Δεν έχει εγκατασταθεί ο πάροχος αναζήτησης του Quod Libet για το GNOME Shell." #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "Πάροχος Αναζήτησης GNOME" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "Αναζήτηση στην μουσικοθήκη μέσα από το GNOME Shell." #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "Συγχρονισμός με το Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:28 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:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "Σφάλμα στην εύρεση του διακομιστή Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "Σφάλμα στην εύρεση του %s. Παρακαλώ ελέγξτε τις ρυθμίσεις" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "Μηνύματα Κατάστασης Telepathy" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "παυμένο" #: ../quodlibet/ext/events/telepathy_status.py:121 msgid "Playing:" msgstr "Αναπαράγεται:" #: ../quodlibet/ext/events/telepathy_status.py:122 #, 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:138 msgid "Paused:" msgstr "Παυμένο:" #: ../quodlibet/ext/events/telepathy_status.py:139 #, 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:155 msgid "Plain text for status when there is no current song" msgstr "Απλό κείμενο για την κατάσταση για όταν δεν υπάρχει τρέχων τραγούδι" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "No song:" msgstr "Χωρίς τρέχων τραγούδι:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 msgid "Status Patterns" msgstr "Πρότυπα Καταστάσεων" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "Εναλλαγέας Θεμάτων" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "Αλλάξτε το ενεργό θέμα GTK+." #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "_Θέμα:" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "Προεπιλεγμένο Θέμα" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "Χρήση της σκοτεινής παραλλαγής του θέματος" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "Χρήση επικεφαλίδων παραθύρων GNOME" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Ο τροχός του ποντικιού αυξομειώνει την ένταση ήχου\n" "Ο τροχός με πατημένο το Shift αλλάζει τραγούδια" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Ο τροχός του ποντικιού αλλάζει τραγούδια\n" "Ο τροχός με πατημένο το Shift αυξομειώνει την ένταση" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "_Τροχός Ποντικιού" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Προβολή Συμβουλής" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Δεν αναπαράγεται" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "Εικονίδιο Περιοχής Συστήματος" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "Έλεγχος του Quod Libet από την περιοχή συστήματος." #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 msgid "_Play" msgstr "_Αναπαραγωγή" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 msgid "P_ause" msgstr "_Παύση" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 msgid "Pre_vious" msgstr "Προη_γούμενο" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "Επό_μενο" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "_Σειρά Αναπαραγωγής" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Επανάληψη" #: ../quodlibet/ext/events/trayicon.py:481 msgid "Stop _after this song" msgstr "Σταμάτησε _μετά από αυτό το τραγούδι" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Περιήγηση στην Μουσικοθήκη" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Επε_ξεργασία Ετικετών" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "Π_ληροφορίες" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "Έ_ξοδος" #: ../quodlibet/ext/events/viewlyrics.py:34 msgid "View Lyrics" msgstr "Προβολή Στίχων" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "Προβολή στίχων κάτω από την λίστα τραγουδιών" #: ../quodlibet/ext/events/viewlyrics.py:38 msgid "_Lyrics" msgstr "_Στίχοι" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "Αποθηκευτής Εικόνων" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "Καταγραφή Συμβάντων" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "Αποστολή συμβάντων αναπαραγωγής στην υπηρεσία καταγραφής Zeitgeist." #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "_Κατώφλι:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "Κατώφλι για την ενεργοποίηση του φίλτρου" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "_Αναλογία" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "Αναλογία συμπίεσης" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "Συμπιεστής Ήχου" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Αλλαγή του πλάτους κύματος όλων των δειγμάτων πάνω από κάποιο συγκεκριμένο " "κατώφλι με καθορισμένη αναλογία." #: ../quodlibet/ext/gstreamer/crossfeed.py:24 msgid "_Preset:" msgstr "_Προκαθορισμένο:" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 msgid "Filter preset" msgstr "Προκαθορισμένο φίλτρο" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "_Συχνότητα αποκοπής:" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "Συχνότητα αποκοπής φίλτρου χαμηλής συχνότητας" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "Επίπεδο _εισόδου:" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "Επίπεδο εισόδου" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "Προεπιλογή" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Πλησιέστερο σε τοποθέτηση εικονικών ηχείων (30°, 3 μέτρα)" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Πλησίον του διατροφοδοτητή του Chu Moy (δημοφιλές)" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Πλησίον στους ενισχυτές CORDA του Jan Meier (μικρή αλλαγή)" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 msgid "Custom settings" msgstr "Προσαρμοσμένες ρυθμίσεις" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "Διατροφοδότηση" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 msgid "Filter _band:" msgstr "_Ζώνη φίλτρου:" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "Η ζώνη συχνοτήτων του φίλτρου" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "Filter _width:" msgstr "_Εύρος φίλτρου:" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "Το εύρος συχνοτήτων του φίλτρου" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "Επίπε_δο:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "Η στάθμη επίδρασης" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "Αφαίρεση ανθρώπινης φωνής από τον ήχο." #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "Μονοφωνική μίξη" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "Μίξη των καναλιών σε μονοφωνικό." #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "_Ποσοστό:" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "_Τέμπο:" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "Τό_νος:" #: ../quodlibet/ext/gstreamer/pitch.py:95 msgid "Audio Pitch / Speed" msgstr "Τόνος / Ταχύτητα Ήχου" #: ../quodlibet/ext/gstreamer/pitch.py:96 msgid "Controls the pitch of an audio stream." msgstr "Έλεγχος του ηχητικού τόνου." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "Εξαγωγή στο Squeezebox…" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" "Εξαγωγή λίστας αναπαραγωγής στο Logitech Squeezebox, αρκεί να χρησιμοποιούν " "την ίδια δομή καταλόγων. Χρησιμοποιεί τις ρυθμίσεις του προσθέτου Squeezebox " "Sync." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "Εξαγωγή της λίστας αναπαραγωγής στο Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "Όνομα λίστας (θα αντικαταστήσει τυχών υπάρχουσα)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 msgid "Shuffle Playlist" msgstr "Ανακάτεμα Λίστας Αναπαραγωγής" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "Αναπαραγωγή επιλεγμένων τραγουδιών." #: ../quodlibet/ext/playorder/queue.py:16 msgid "Queue Only" msgstr "Μόνο Ουρά" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" "Αναπαραγωγή μόνο τραγουδιών από την ουρά. Διπλό κλικ σε τραγούδι για να το " "προσθέσετε στην ουρά αναπαραγωγής." #: ../quodlibet/ext/playorder/reverse.py:8 msgid "Reverse" msgstr "Αντίστροφα" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "Αντιστρέφει τη σειρά αναπαραγωγής." #: ../quodlibet/ext/playorder/track_repeat.py:26 msgid "Track Repeat" msgstr "Επανάληψη Κομματιού" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" "Τυχαία σειρά, αλλά κάθε τραγούδι επαναλαμβάνεται έναν προκαθορισμένο αριθμό " "φορών." #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "Πόσες φορές να αναπαραχθεί το κάθε τραγούδι:" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Το Squeezebox σε λειτουργία. Χρήση του μοναδικού αναπαραγωγέα (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "Δεν ήταν δυνατή η σύνδεση στο %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "Όνομα Συσκευής:" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "Θύρα:" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 msgid "Username:" msgstr "Όνομα Χρήστη:" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "Κωδικός:" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "Κατάλογος μουσικοθήκης στον οποίο συνδέεται ο διακομιστής." #: ../quodlibet/ext/_shared/squeezebox/base.py:131 msgid "Library path:" msgstr "Τοποθεσία μουσικοθήκης:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "_Επαλήθευση ρυθμίσεων" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "Διακομιστής Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Αποσφαλμάτωση" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Διακομιστής Squeezebox στο {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "άγνωστος διακομιστής Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "άγνωστος αναπαραγωγέας Squeezebox: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "Επιλογή αναπαραγωγέα Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_Εντάξει" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Βρέθηκε ο διακομιστής Squeezebox.\n" "Παρακαλώ επιλέξτε τον αναπαραγωγέα" #: ../quodlibet/ext/songsmenu/albumart.py:227 msgid "Fit image to _window" msgstr "Προσαρμογή _μεγέθους εικόνας στο μέγεθος παραθύρου" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "_Πρόγραμμα:" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "_Επεξεργασία της εικόνας μετά την αποθήκευση" #: ../quodlibet/ext/songsmenu/albumart.py:243 msgid "File_name:" msgstr "Όνομα _αρχείου" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "Η αποθήκευση απέτυχε" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, python-format msgid "Unable to save \"%s\"." msgstr "Αδυναμία αποθήκευσης \"%s\"." #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] Σφάλμα HTTP: %s" #: ../quodlibet/ext/songsmenu/albumart.py:511 msgid "Album Art Downloader" msgstr "Λήψη Εξώφυλλων Άλμπουμ" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "από %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "Ανάλυση: %s" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, python-format msgid "Size: %s" msgstr "Μέγεθος: %s" #: ../quodlibet/ext/songsmenu/albumart.py:588 msgid "_Search" msgstr "_Αναζήτηση" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 msgid "Searching…" msgstr "Αναζήτηση…" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "Τελείωσε" #: ../quodlibet/ext/songsmenu/albumart.py:820 msgid "Download Album Art" msgstr "Λήψη Εξώφυλλων Άλμπουμ" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "Λήψη εξώφυλλων άλμπουμ από διάφορες ιστοσελίδες." #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "Πηγές" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "APEv2 σε ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 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:20 msgid "Go to Bookmark…" msgstr "Μεταπήδηση σε Σελιδοδείκτη…" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "Εμφάνιση όλων των σελιδοδεικτών στα επιλεγμένα αρχεία." #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 msgid "_Edit Bookmarks…" msgstr "_Επεξεργασία Σελιδοδεικτών…" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 msgid "No Bookmarks" msgstr "Χωρίς Σελιδοδείκτες" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Όνομα Αρχείου" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Κομμάτι" #: ../quodlibet/ext/songsmenu/brainz.py:119 msgid "Title" msgstr "Τίτλος" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Καλλιτέχνης" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "_Κυκλοφορία:" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "%d _κυκλοφορία:" msgstr[1] "%d _κυκλοφορίες:" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "Παρακαλώ εισάγεται ένα ερώτημα." #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "Παρουσιάστηκε σφάλμα. Παρακαλώ δοκιμάστε ξανά." #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "Φόρτωση αποτελέσματος…" #: ../quodlibet/ext/songsmenu/brainz.py:370 msgid "No results found." msgstr "Δεν βρέθηκαν αποτελέσματα." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "Βρέθηκε %d αποτέλεσμα." msgstr[1] "Βρέθηκαν %d αποτελέσματα." #: ../quodlibet/ext/songsmenu/brainz.py:411 msgid "MusicBrainz lookup" msgstr "Αναζήτηση σε MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 msgid "_Query:" msgstr "_Ερώτημα:" #: ../quodlibet/ext/songsmenu/brainz.py:442 msgid "S_earch" msgstr "_Αναζήτηση" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "Αποτελέσματα <i>(τραβήχτε με το ποντίκι για αλλαγή σειράς)</i>" #: ../quodlibet/ext/songsmenu/brainz.py:483 msgid "MusicBrainz Lookup" msgstr "Αναζήτηση σε MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Συμπλήρωση ετικετών άλμπουμ βάσει αναζήτησης στο MusicBrainz." #: ../quodlibet/ext/songsmenu/brainz.py:510 msgid "Split _disc from album" msgstr "_Διαχωρισμός του δίσκου από το άλμπουμ" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "Διαχωρισμός των εμφανιζόμενων (_featured) εκτελεστών από το κομμάτι" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "Χρήση μόνο του έτους για την ετικέτα \"ημερομηνία\"" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "Προσθήκη ετικέτας \"_albumartist\" όταν χρειάζεται" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "Εγγραφή ετικετών ταξινόμησης για τα ονόματα καλλιτεχνών" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "Εγγραφή _κανονικών ετικετών MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "Εγγραφή ετικέτας _labelid (διορθώνει άλμπουμ με πολλαπλούς δίσκους)" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 msgid "Browse Folders" msgstr "Άνοιγμα Φακέλου" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "Άνοιγμα του φακέλου του τραγουδιού με τον διαχειριστή αρχείων." #: ../quodlibet/ext/songsmenu/browsefolders.py:184 msgid "Unable to open folders" msgstr "Αδυναμία ανοίγματος φακέλων" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "Δεν υπάρχει διαθέσιμη εφαρμογή για το άνοιγμα φακέλων." #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Λίστα Κομματιών" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "Αναζήτηση σε CDDB" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "Εύρεση πληροφοριών άλμπουμ στο FreeDB. Χρειάζεται το CDDB.py." #: ../quodlibet/ext/songsmenu/cddb.py:166 msgid "Timeout" msgstr "Χρονικό όριο" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "Η αναζήτηση απέτυχε, υπέρβαση χρονικού ορίου" #: ../quodlibet/ext/songsmenu/cddb.py:172 msgid "Select an album" msgstr "Επιλέξτε ένα άλμπουμ" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "Επιλέξτε το άλμπουμ που θέλετε να ανακτήσετε." #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "Η αναζήτηση στο CDDB απέτυχε (%s)" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "Κονσόλα Python" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "Ο τρέχων κατάλογος εργασίας σας είναι:" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "Εντολή" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "name" msgstr "όνομα" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "Η ονομασία αυτής της εντολής" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "command" msgstr "εντολή" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "Η εντολή κελύφους που θα εκτελεσθεί" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "παράμετρος" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 msgid "pattern" msgstr "πρότυπο" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" "Το πρότυπο QL, π.χ. <~filename>, που χρησιμοποιείται για την δημιουργία της " "εντολής" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "μοναδικό" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "Αν ορισθεί, θα αφαιρεθούν τυχών διπλότυπα αποτελέσματα του προτύπου" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "Μέγιστα ορίσματα" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Ο μέγιστος αριθμός ορισμάτων που θα δωθούν στην εντολή σε κάθε εκτέλεση " "(όπως στο xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 msgid "Input value" msgstr "Εισαγωγή τιμής" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "Τιμή του %s;" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 msgid "Custom Commands" msgstr "Προσαρμοσμένες Εντολές" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Εκτελεί προσαρμοσμένες εντολές (σε δέσμες αν χρειάζεται) σε τραγούδια " "χρησιμοποιώντας τις τιμές ετικετών τους" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "Επεξεργασία Προσαρμοσμένων Εντολών" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Υποστηρίζει πρότυπα QL\n" "π.χ. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "Σύμπτυξη / Ανάπτυξη όλων" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Το πρότυπο για το κλειδί διπλοτύπων είναι '%s'" #: ../quodlibet/ext/songsmenu/duplicates.py:364 msgid "Duplicates Browser" msgstr "Αναζήτηση Διπλότυπων" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "Εύρεση παρόμοιων εκδόσεων τραγουδιών." #: ../quodlibet/ext/songsmenu/duplicates.py:404 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:406 msgid "_Group duplicates by:" msgstr "_Ομαδοποίηση διπλοτύπων με βάση:" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "Κλειδί Διπλοτύπων" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "Διαγραφή _Κενών" #: ../quodlibet/ext/songsmenu/duplicates.py:417 msgid "Remove _Diacritics" msgstr "Διαγραφή _Διακριτικών Σημείων" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Remove _Punctuation" msgstr "Διαγραφή _Στίξης" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "Αγνόησε διαφορές πεζών/Κεφαλαίων" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "Επιλογές ταιριάσματος" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 msgid "Edit Playcount" msgstr "Επεξεργασία Μετρητή Αναπαραγωγών" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "Μετρητής Αναπαραγωγών" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "Μετρητής Παραλείψεων" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "Επεξεργασία Ενσωματωμένων Εικόνων" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "Διαγραφή ή αντικατάσταση των ενσωματωμένων εικόνων." #: ../quodlibet/ext/songsmenu/embedded.py:65 msgid "_Remove all images" msgstr "_Διαγραφή όλων των εικόνων" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "_Ενσωμάτωση τρέχουσας εικόνας" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "Καθορισμός Ακριβούς Βαθμολογίας" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "Επιτρέπει να ορισθεί η βαθμολογία τραγουδιού με αριθμό." #: ../quodlibet/ext/songsmenu/exact_rating.py:29 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:79 msgid "Filter on Any Tag" msgstr "Φίλτρο Βάσει Οποιασδήποτε Ετικέτας" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" "Δημιουργία αναζήτησης βασισμένης σε ετικέτες των επιλεγμένων τραγουδιών." #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 msgid "Filter on Directory" msgstr "Φίλτρο βάσει Καταλόγου" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "Φιλτράρισμα βάσει καταλόγου συστήματος αρχείων σε ένα νέο παράθυρο." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "Αναζήτηση Ακουστικού Αποτυπώματος" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" "Αναζήτηση μεταδεδομένων τραγουδιών χρησιμοποιώντας τα ακουστικά αποτυπώματά " "τους" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "Υποβολή Ακουστικών Αποτυπωμάτων" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Παράγει ακουστικά αποτυπώματα χρησιμοποιώντας το chromaprint και τα " "υποβάλλει στο 'acoustid.org'" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "Λείπει το κλεδί API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "Αίτηση για κλειδί API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "_Κλειδί API:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "Διαδικτυακή Υπηρεσία AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Σε αναμονή" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "Αναλύονται" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "Αναζήτηση" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Error" msgstr "Σφάλμα" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Αποθήκευση" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "Κατάσταση" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "Κυκλοφορία" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 msgid "Write MusicBrainz tags" msgstr "Αποθήκευση ετικετών MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 msgid "Group by directory" msgstr "Ομαδοποίηση κατά κατάλογο" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 msgid "Album Mode" msgstr "Λειτουργία Άλμπουμ" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Αποθήκευση ετικετών σχετικών με το άλμπουμ και προσπάθησε να μειώσεις τις " "διαφορετικές κυκλοφορίες άλμπουμ" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "Παραγωγή αποτυπωμάτων:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "_Λεπτομέρειες" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "_Υποβολή" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "Αποτυπώματα:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "Τραγούδια με MBID:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "Τραγούδια με επαρκείς ετικέτες:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "Τραγούδια για υποβολή:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Τέλος. %(to-send)d/%(all)d τραγούδια για υποβολή." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "Υποβάλλονται Αποτυπώματα:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "Υποβάλλονται…" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 msgid "Force Write" msgstr "Υποχρεωτική Αποθήκευση" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" "Αποθήκευση των αρχείων ξανά. Οι μετρητές αναπαραγωγής και οι βαθμολογίες " "ενημερώνονται υποχρεωτικά." #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "Εξαγωγή σε HTML" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "Εξαγωγή της λίστας επιλεγμένων τραγουδιών σε HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "Διόρθωση της διάρκειας του MP3" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Αφαιρεί από τις ID3 ετικέτες τις καταχωρήσεις TLEN, που ίσως δημιουργούν " "λανθασμένες διάρκειες τραγουδιών." #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "Αποστολή στο iFP" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "Μεταφόρτωση τραγουδιών σε συσκευή iRiver iFP." #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "Εξαγωγή Μεταδεδομένων" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "Εξαγωγή μεταδεδομένων των επιλεγμένων τραγουδιών σε ένα αρχείο .tags." #: ../quodlibet/ext/songsmenu/importexport.py:84 msgid "Import Metadata" msgstr "Εισαγωγή Μεταδεδομένων" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" "Εισαγωγή μεταδεδομένων για τα επιλεγμένα τραγούδια από ένα αρχείο .tags." #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "Κάψιμο CD" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Δημιουργία CD με το K3b το Brasero ή το xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "Ενημέρωση λίστας chart." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "Ήδη ενημερωμένο." #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "Λήψη chart εβδομάδας %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "Ο συγχρονισμός ολοκληρώθηκε." #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "Σφάλμα κατά τον συγχρονισμό" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "Συγχρονισμός last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" "Ενημερώστε τα στατιστικά της μουσικοθήκης σας από το προφίλ σας στο Last.fm." #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 msgid "_Username:" msgstr "_Όνομα χρήστη:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 msgid "No active song" msgstr "Δεν υπάρχει ενεργό τραγούδι" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 msgid "No lyrics found" msgstr "Δεν βρέθηκαν στίχοι" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 msgid "Lyrics:" msgstr "Στίχοι:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 msgid "Lyrics Window" msgstr "Παράθυρο Στίχων" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "Εμφανίζει ένα παράθυρο με στίχους του αναπαραγώμενου τραγουδιού." #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "Δημιουργία Ετικετών Ταξινόμησης" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" "Μετατροπή ονομάτων άλμπουμ και καλλιτέχνη σε ετικέτες ταξινόμησης, συχνά " "αστόχως." #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "Αποστολή Σε…" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "Γενικό πρόσθετο ανοίγματος αρχείων." #: ../quodlibet/ext/songsmenu/playlist.py:52 msgid "Playlist Export" msgstr "Εξαγωγή Λίστας Αναπαραγωγής" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "Εξαγωγή τραγουδιών σε λίστα M3U ή PLS." #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "Χρήση σχετικών διαδρομών" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "Χρήση απόλυτων διαδρομών" #: ../quodlibet/ext/songsmenu/playlist.py:150 msgid "Unable to export playlist" msgstr "Αδυναμία εξαγωγής λίστας αναπαραγωγής" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Η εγγραφή στο <b>%s</b> απέτυχε." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 msgid "Refresh Songs" msgstr "Ανανέωση Τραγουδιών" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Ελέγχει για αλλαγές αρχείων και ξαναφορτώνει / αφαιρεί τα τραγούδια όπου " "χρειάζεται." #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d τραγούδι" msgstr[1] "%d τραγούδια" #: ../quodlibet/ext/songsmenu/refresh.py:28 msgid "Refresh songs" msgstr "Ανανέωση τραγουδιών" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "Αναλυτής ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "Πρόοδος" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "Ενίσχυση" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "Κορυφή" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" "Υπάρχει ακόμα <b>%(to-process)d</b> άλμπουμ για ενημέρωση (από %(all)d)" msgstr[1] "" "Υπάρχουν ακόμα <b>%(to-process)d</b> άλμπουμ για ενημέρωση (από %(all)d)" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "Ανάλυση ReplayGain με το GStreamer, με ομαδοποίηση κατά άλμπουμ." #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "πάντα" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "αν λείπουν <b>οποιεσδήποτε</b> ετικέτες RG" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "Αν λείπουν οι ετικέτες RG του <b>άλμπουμ</b>" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "_Επεξεργασία άλμπουμ:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 msgid "Existing Tags" msgstr "Υπάρχουσες Ετικέτες" #: ../quodlibet/ext/songsmenu/splitting.py:15 msgid "Split Tags" msgstr "Διαχωρισμός Ετικετών" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" "Διαχωρισμός του αριθμού δίσκου από το όνομα άλμπουμ και της έκδοσης από τον " "τίτλο ταυτοχρόνως." #: ../quodlibet/ext/songsmenu/splitting.py:40 msgid "Split Album" msgstr "Διαχωρισμός Άλμπουμ" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "Διαχωρισμός αριθμού δίσκου." #: ../quodlibet/ext/songsmenu/website_search.py:34 msgid "Website Search" msgstr "Αναζήτηση σε Ιστοσελίδα" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 msgid "Search URL patterns" msgstr "Πρότυπα URL αναζήτησης" #: ../quodlibet/ext/songsmenu/website_search.py:89 msgid "Edit search URLs" msgstr "Επεξεργασία των URL αναζήτησης" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 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 "" "Ανοίγει ένα παράθυρο περιηγητή με το άρθρο της Βικιπαίδειας για το τρέχον " "άλμπουμ" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Μουσικοθήκη" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Έλεγχος σημείων προσάρτησης" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Σάρωση της μουσικοθήκης" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Σάρωση του %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Αποτυχία ανοίγματος αρχείου: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Εμφάνιση ετικετών" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Εμφάνιση ωμής εξόδου" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Στήλες και η σειρά που θα εμφανιστούν στην ωμή έξοδο (%s)" #: ../quodlibet/operon/commands.py:43 msgid "Also list programmatic tags" msgstr "Εμφάνιση _προγραμματικών ετικετών" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Μη αρκετός αριθμός ορισμάτων" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "Υπερβολικός αριθμός ορισμάτων" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 msgid "Description" msgstr "Περιγραφή" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Τιμή" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Εμφάνιση όλων των κοινών ετικετών" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Αντιγραφή ετικετών από ένα αρχείο σε άλλο" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Δείξε τις αλλαγές χωρίς να τις εφαρμόσεις" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Παράλειψη ετικετών που δεν μπορούν να γραφούν" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Αδύνατη αντιγραφή της ετικέτας %r στο αρχείο %r" #: ../quodlibet/operon/commands.py:147 msgid "Edit tags in a text editor" msgstr "Επεξεργασία ετικετών σε κειμενογράφο" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "Ακύρωση επεξεργασίας" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Η εκκίνηση του επεξεργαστή κειμένου '%(editor-name)s' απέτυχε." #: ../quodlibet/operon/commands.py:250 msgid "No changes detected" msgstr "Δεν ανιχνεύθηκαν αλλαγές" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Καθόρισε μια ετικέτα και αφαίρεσε τις παρούσες τιμές της" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Αδύνατος ο ορισμός του %r" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "Διαγραφή ετικετών" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "Η τιμή είναι κανονική παράσταση" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "Διαγραφή όλων των ετικετών" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "Αδύνατος ο συνδυασμός του '--all' με το '--regexp'" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "Αδύνατη η αφαίρεση του %r από το %r" #: ../quodlibet/operon/commands.py:369 msgid "Remove a tag value" msgstr "Διαγραφή της τιμής ετικέτας" #: ../quodlibet/operon/commands.py:418 msgid "Add a tag value" msgstr "Προσθήκη τιμής σε ετικέτα" #: ../quodlibet/operon/commands.py:446 msgid "List file information" msgstr "Προβολή πληροφοριών αρχείου" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Καθορισμός της εικόνας ως κύριας ενσωματωμένης εικόνας και αφαίρεση των " "υπολοίπων ενσωματωμένων εικόνων." #: ../quodlibet/operon/commands.py:505 #, python-format msgid "Failed to load image file: %r" msgstr "Αποτυχία ανοίγματος αρχείου εικόνας: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, 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:525 msgid "Remove all embedded images" msgstr "Διαγραφή όλων των ενσωματωμένων εικόνων" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Εξαγωγή ενσωματωμένων εικόνων σε %(filepath)s" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" "Τοποθεσία αποθήκευσης εικόνων (η προεπιλογή είναι ο κατάλογος εργασίας)" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "Μετονομασία αρχείων βάσει ετικετών" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "Συμπλήρωση ετικετών βάσει διαδρομής αρχείου" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Αρχείο" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Συμπλήρωση αριθμών κομματιού για όλα τα αρχεία" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "Εμφάνιση ετικετών βάσει παρεχόμενου προτύπου" #: ../quodlibet/operon/commands.py:752 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Ροή" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Buffering" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "Αδυναμία δημιουργίας διασωλήνωσης GStreamer" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" "Δεν βρέθηκε στοιχείο GStreamer ικανό να χειριστεί αυτό το είδος αρχείου" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "Μορφή πολυμέσου: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 msgid "No GStreamer audio sink found" msgstr "Δεν βρέθηκε έξοδος ήχου GStreamer" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "Μη έγκυρη διασωλήνωση εξόδου GStreamer" #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Αδυναμία δημιουργίας εξόδου ήχου" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" "Δεν βρέθηκε το πρόσθετο '{module}'. Ίσως χρειάζεται να εγκατασταθεί το " "πακέτο." #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Αδυναμία εύρεσης του στοιχείου '{element}' του GStreamer." #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d λίστα αναπαραγωγής;" msgstr[1] "" "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d λίστες αναπαραγωγής;" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 msgid "_Run Plugin" msgstr "_Εκτέλεση Πρόσθετου" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "Αδυναμία Φόρτωσης Ηχητικού Συστήματος" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" "Η φόρτωση του ηχητικού συστήματος '%(name)s' απέτυχε. Η αναπαραγωγή ήχου θα " "απενεργοποιηθεί." #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Υποστηριζόμενοι τύποι αρχείων: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Συσκευή ήχου: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Αρχή" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "Μ/Δ" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Χρόνος" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Όνομα Σελιδοδείκτη" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "ΛΛ:ΔΔ" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Σελιδοδείκτες" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Φίλτρα" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "Πρόσφατα _Αναπαραχθέντα" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Πρόσφατα _Προστεθέντα" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "Κορυφαία _40" #: ../quodlibet/qltk/browser.py:57 msgid "All _Songs" msgstr "Όλα τα Τ_ραγούδια" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Φίλτρο στο _Είδος" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Φίλτρο στον _Καλλιτέχνη" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Φίλτρο στο Ά_λμπουμ" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Τυχαίο Εί_δος" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Τυχαίος Καλλι_τέχνης" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Τυχαίο Άλ_μπουμ" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Τα 40 τραγούδια που έχετε ακούσει περισσότερο (θα επιλεχθούν πάνω από 40 αν " "υπάρχουν ισοπαλίες)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Χωρίς πληροφορίες χρόνου" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Τιμή" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Αποθηκευμένες Τιμές" #: ../quodlibet/qltk/cbes.py:252 msgid "Edit saved values…" msgstr "Επεξεργασία αποθηκευμένων τιμών…" #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "Άν_οιγμα" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Τραγούδια" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Προβολή χρόνου που υπολείπεται" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Αυτό_ματα" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "Λειτουργία _Κομματιού" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "Λειτουργία Ά_λμπουμ" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Αναλυτής ReplayGain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "Νέο %s" #: ../quodlibet/qltk/data_editors.py:212 msgid "(unknown)" msgstr "(άγνωστο)" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "Πρότυπο ετικέτας" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Πρότυπο ετικέτας π.χ. people:real ή ~album~year." #: ../quodlibet/qltk/data_editors.py:377 msgid "Enter new tag" msgstr "Εισάγετε τη νέα ετικέτα" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "Λεπτομέρειες Σφάλματος" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Προκλήθηκε Σφάλμα" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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> μαζί με μια " "περιγραφή του τι κάνατε." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" "Ο Quod Libet ίσως είναι ασταθής. Συνίσταται επανεκκίνησή του. Η μουσικοθήκη " "σας θα αποθηκευθεί." #: ../quodlibet/qltk/delete.py:33 msgid "Files:" msgstr "Αρχεία:" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Τα επιλεγμένα τραγούδια θα αφαιρεθούν από τη μουσικοθήκη και τα αντίστοιχα " "αρχεία θα διαγραφούν από τον δίσκο." #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "Τα επιλεγμένα τραγούδια θα διαγραφούν από τον σκληρό σας δίσκο." #: ../quodlibet/qltk/delete.py:73 #, 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:90 msgid "_Delete Files" msgstr "_Διαγραφή Αρχείων" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Τα επιλεγμένα τραγούδια θα αφαιρεθούν από τη μουσικοθήκη και τα αντίστοιχα " "αρχεία θα μετακινηθούν στα απορρίματα." #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Μετακίνηση στα Απορρίμματα" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Μετακίνηση %(current)d από %(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Αδυναμία μετακίνησης στα απορρίμματα" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 msgid "Moving one or more files to the trash failed." msgstr "Η μετακίνηση ενός ή περισσότερων αρχείων στα απορρίμματα απέτυχε." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Διαγραφή %(current)d από %(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 msgid "Unable to delete files" msgstr "Αδυναμία διαγραφής αρχείου" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "_Σταμάτα" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "Λείπει από %d τραγούδι" msgstr[1] "Λείπει από %d τραγούδια" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "Διαφορετικό σε %d τραγούδι" msgstr[1] "Διαφορετικό σε %d τραγούδια" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "_Διαμοιρασμός σε Πολλαπλές Τιμές" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Διαχωρισμός του Δίσκου από το Ά_λμπουμ" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Διαχωρισμός της Έκ_δοσης από τον Τίτλο" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Διαχωρισμός του Διευθετώντα από τον _Καλλιτέχνη" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Διαχωρισμός του _Εκτελεστή από τον Καλλιτέχνη" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "Διαχωρισμός του _Εκτελεστή από τον Τίτλο" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "Διαχωρισμός του _Αρχικού Καλλιτέχνη από τον Τίτλο" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Προσθήκη Ετικέτας" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "Ε_τικέτα:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Αδυναμία προσθήκης ετικέτας" #: ../quodlibet/qltk/edittags.py:658 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Αδυναμία προσθήκης <b>%s></b>" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Μη έγκυρη ετικέτα" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Μη έγκυρη τιμή" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "_Αναίρεση" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "_Ξανακάνε" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Πρόσθετα" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Προτιμήσεις του Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Διαχωρισμός _στο:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Επεξεργασία ετικετών" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Φάκελοι" #: ../quodlibet/qltk/filesel.py:221 msgid "_New Folder…" msgstr "_Νέος Φάκελος…" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Επιλογή όλων των Υποφακέλων" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Νέος Φάκελος" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Εισάγετε όνομα για τον νέο φάκελο:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Αδυναμία δημιουργίας φακέλου" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Αδυναμία διαγραφής φακέλου" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "από %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Δίσκος %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Κομμάτι %s" #: ../quodlibet/qltk/info.py:106 msgid "_Edit Display…" msgstr "_Επεξεργασία Εμφάνισης…" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Δεν υπάρχουν επιλεγμένα τραγούδια." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Κανένα Τραγούδι" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Πληροφορίες" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Στίχοι" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "καλλιτέχνης" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "καλλιτέχνες" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "εκτελεστές" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Ποτέ" #: ../quodlibet/qltk/information.py:213 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d φορά" msgstr[1] "%(n)d φορές" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "προστέθηκε" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "τελευταία αναπαραγωγή" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "αναπαραγωγές" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "παραλήψεις" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "βαθμολογία" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "διάρκεια" #: ../quodlibet/qltk/information.py:275 msgid "format" msgstr "μορφή" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Αύξουσα" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "μέγεθος αρχείου" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "τροποποίηση" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d επιλεγμένο" msgstr[1] "%d επιλεγμένα" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Παραγωγή από %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "εκτελεστής" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Μη διαθέσιμο κομμάτι" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Επιλεγμένη Δισκογραφία" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "άλμπουμ" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Συνολική διάρκεια:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Συνολικό μέγεθος:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Αρχεία" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Λήψη" #: ../quodlibet/qltk/lyrics.py:37 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Δεν βρέθηκαν στίχοι γι' αυτό το τραγούδι." #: ../quodlibet/qltk/lyrics.py:78 msgid "Searching for lyrics…" msgstr "Αναζήτηση στίχων…" #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Αδυναμία λήψης στίχων." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "Θέλετε σίγουρα να αφαιρέσετε όλα τα τραγούδια;" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "Τα επιλεγμένα τραγούδια θα αφαιρεθούν από τη μουσικοθήκη." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "Επανεμφάνιση" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "Επανεμ_φάνιση" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Απόρριψη αλλαγών στις ετικέτες;" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Ετικέτες έχουν αλλαχθεί αλλά δεν έχουν αποθηκευθεί. Αποθήκευση αυτών των " "αρχείων ή επαναφορά και απόρριψη των αλλαγών;" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 msgid "_Revert" msgstr "Επανέφε_ρε" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Το αρχείο υπάρχει" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "Αντικατάσταση του %(file-name)s;" #: ../quodlibet/qltk/msg.py:93 msgid "_Replace File" msgstr "Αντικατάσταση Α_ρχείου" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Ενεργές διεργασίες" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d διεργασίες εκτελούνται" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "Ά_γνωστο" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Με τη Σειρά" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "Με τη _Σειρά" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Ανακάτεμα" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Ανακάτεμα" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Με τη Βαρύτητα" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "Με τη _Βαρύτητα" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Ένα Τραγούδι" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "Ένα _Τραγούδι" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Σφάλματα Πρόσθετων" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Ενεργοποιημένα" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Απενεργοποιημένα" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Χωρίς κατηγορία" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Δεν βρέθηκαν πρόσθετα." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Πρόσθετα" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Εμφάνιση _Λαθών" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Δίσκος" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Κομμάτι" #: ../quodlibet/qltk/prefs.py:45 msgid "Grou_ping" msgstr "Ομα_δοποίηση" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Ά_λμπουμ" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Ό_νομα Αρχείου" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Διάρκεια" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Λίστα Τραγουδιών" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "Α_υτόματη μεταπήδηση στο αναπαραγώμενο τραγούδι" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Όταν το αναπαραγώμενο τραγούδι αλλάζει, μετάβαση σε αυτό στην λίστα " "τραγουδιών" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "Συμπεριφορά" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "Ά_λλα:" #: ../quodlibet/qltk/prefs.py:93 msgid "_Edit…" msgstr "_Επεξεργασία…" #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Προσθαφαίρεση κεφαλίδων στηλών" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Ορατές Στήλες" #: ../quodlibet/qltk/prefs.py:112 msgid "Artist includes all _people" msgstr "Το πεδίο Καλλιτέχνης συμπεριλαμβάνει τα ονόματα όλων των συντελεστών" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Το Όνομα Αρχείου συμπεριλαμβάνει και τον _φάκελο" #: ../quodlibet/qltk/prefs.py:132 msgid "Column Preferences" msgstr "Προτιμήσεις Στηλών" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Εφαρμογή τρεχόντων ρυθμίσεων στην λίστα τραγουδιών, προσθέτοντας νέες στήλες " "στο τέλος" #: ../quodlibet/qltk/prefs.py:221 msgid "Edit Columns" msgstr "Επεξεργασία Στηλών" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Περιηγητές" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Κα_θολικό φίλτρο:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "Εφαρμογή αυτού του ερωτήματος επιπροσθέτως από όλα τα άλλα" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 msgctxt "heading" msgid "Search" msgstr "Αναζήτηση" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Επιβεβαίωση πο_λλαπλών βαθμολογήσεων" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Ζήτησε επιβεβαίωση πριν αλλάξεις τις βαθμολογίες πολλαπλών τραγουδιών " "μονομιάς" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "Ενεργοποίηση βαθμολόγησης με έ_να κλικ" #: ../quodlibet/qltk/prefs.py:261 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Επέτρεψε τη βαθμολόγηση κάνοντας κλικ στην στήλη βαθμολογίας της λίστας " "τραγουδιών" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Βαθμολογίες" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Χρήση στρογγυλεμένων γωνιών στις εικόνες επισκόπησης" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "Στρογγύλεψε τις γωνίες των μικρογραφιών των εξώφυλλων άλμπουμ." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Προτίμηση _ενσωματωμένων εικόνων" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Χρήση εξώφυλλων ενσωματωμένων στο αρχείο ήχου (όταν είναι διαθέσιμο) αντί " "από άλλες πηγές" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "Ε_ξαναγκασμός ονόματος αρχείου εικόνας:" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "Το όνομα αρχείου εικόνας που θα χρησιμοποιηθεί υποχρεωτικά" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Το όνομα αρχείου εικόνας που θα χρησιμοποιηθεί υποχρεωτικά" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Εξώφυλλα Άλμπουμ" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Αναπαραγωγή" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Ρύθμιση Εξόδου" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Αν δεν είναι διαθέσιμες πληροφορίες Replay Gain για ένα τραγούδι, κλιμάκωσε " "την ένταση του ήχου κατά αυτή την τιμή" #: ../quodlibet/qltk/prefs.py:347 msgid "_Fall-back gain (dB):" msgstr "Εναλλακτική τιμή gain (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Κλιμάκωσε την ένταση για όλα τα τραγούδια κατά αυτή την τιμή, αρκεί να μην " "υπάρξει αποκοπή" #: ../quodlibet/qltk/prefs.py:361 msgid "_Pre-amp gain (dB):" msgstr "Gain _προενίσχυσης (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Ρύθμιση της έντασης ήχου από το Replay Gain" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Ρύθμισης Έντασης Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "_Προεπιλεγμένη βαθμολογία:" #: ../quodlibet/qltk/prefs.py:463 msgid "Rating _scale:" msgstr "_Βαθμολογική κλίμακα:" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "_Μπαγεσιανός παράγοντας μέσου όρου:" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Αποθήκευση βαθμολογιών και _μετρητών αναπαραγωγών" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "Διεύθυνση ηλεκτρονικού _ταχυδρομείου:" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "" "Οι βαθμολογίες και οι μετρητές αναπαραγωγών θα καθοριστούν γι' αυτή την " "διεύθυνση" #: ../quodlibet/qltk/prefs.py:547 msgid "Auto-save tag changes" msgstr "Αυτόματη αποθήκευση αλλαγών στις ετικέτες" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Αποθήκευση αλλαγών στις ετικέτες χωρίς επιβεβαίωση όταν γίνεται επεξεργασία " "πολλαπλών αρχείων" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Λίστα διαχωριστών που θα χρησιμοποιηθούν κατά των διαχωρισμό τιμών ετικετών. " "Η λίστα είναι διαχωρισμένη με κενά" #: ../quodlibet/qltk/prefs.py:579 msgid "Tags" msgstr "Ετικέτες" #: ../quodlibet/qltk/prefs.py:600 msgid "Updating for new ratings" msgstr "Ανανέωση για τις νέες βαθμολογίες" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "_Ανανέωση της μουσικοθήκης κατά την εκκίνηση" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Ανανέωση Μουσικοθήκης" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Έλεγχος για αλλαγές στην μουσικοθήκη σας" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "_Επαναφόρτωση Μουσικοθήκης" #: ../quodlibet/qltk/prefs.py:630 msgid "Reload all songs in your library. This can take a long time." msgstr "" "Επαναφόρτωση όλων των τραγουδιών της μουσικοθήκης σας. Πιθανό να χρειαστεί " "αρκετό χρόνο." #: ../quodlibet/qltk/prefs.py:640 msgid "Scan Directories" msgstr "Σάρωση Καταλόγων" #: ../quodlibet/qltk/prefs.py:646 msgid "Hidden Songs" msgstr "Κρυμμένα Τραγούδια" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Ιδιότητες" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Ουρά Αναπαραγωγής" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Αφαίρεση όλων των τραγουδιών από τη ουρά" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Τυχαία" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Εκκίνηση ξανά της λίστας αναπαραγωγής όταν φτάσει στο τέλος" #: ../quodlibet/qltk/quodlibetwindow.py:374 msgid "Playback Error" msgstr "Σφάλμα Αναπαραγωγής" #: ../quodlibet/qltk/quodlibetwindow.py:382 msgid "Set up library directories?" msgstr "Να οριστούν οι κατάλογοι της μουσικοθήκης;" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Δεν έχετε ορίσει την μουσικοθήκη σας. Θα θέλατε να το κάνετε τώρα;" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "_Αργότερα" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "_Ρύθμιση" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Αδυναμία προσθήκης τραγουδιών" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, python-format msgid "%s uses an unsupported protocol." msgstr "Το πρωτόκολλο του %s δεν υποστηρίζεται." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Μουσική" #: ../quodlibet/qltk/quodlibetwindow.py:803 msgid "_Add a Folder…" msgstr "Προσθήκη _Φακέλου…" #: ../quodlibet/qltk/quodlibetwindow.py:808 msgid "_Add a File…" msgstr "Προσθήκη _Αρχείου…" #: ../quodlibet/qltk/quodlibetwindow.py:813 msgid "_Add a Location…" msgstr "Προσθήκη _Τοποθεσίας" #: ../quodlibet/qltk/quodlibetwindow.py:818 msgid "Open _Browser" msgstr "Άνοιγμα _Περιηγητή" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "Έ_λεγχος" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Μεταπήδηση στο Αναπαραγώμενο Τραγούδι" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Προβολή" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Βοήθεια" #: ../quodlibet/qltk/quodlibetwindow.py:876 msgid "Stop After This Song" msgstr "Σταμάτησε μετά από αυτό το τραγούδι" #: ../quodlibet/qltk/quodlibetwindow.py:882 msgid "Add Bookmark" msgstr "Προσθήκη Σελιδοδείκτη" #: ../quodlibet/qltk/quodlibetwindow.py:888 msgid "Edit Bookmarks…" msgstr "Επεξεργασία Σελιδοδεικτών…" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "Σ_χετικά" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Βοήθεια στο Διαδίκτυο" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Αναζήτηση στη Βοήθεια" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Λίστα Τραγουδιών" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Προσθήκη Τοποθεσίας" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Εισάγετε την τοποθεσία ενός αρχείου ήχου:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Αδυναμία προσθήκης τοποθεσίας" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, python-format msgid "%s is not a valid location." msgstr "Το %s δεν είναι έγκυρη τοποθεσία." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Προσθήκη Μουσικής" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Παρακολούθηση αυτού του φακέλου για νέα τραγούδια" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Σίγουρα θέλετε να αλλάξετε βαθμολογία και στα %d τραγούδια;" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "Οι αποθηκευμένες βαθμολογίες θα διαγραφούν" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Η βαθμολογία όλων των επιλεγμένων τραγουδιών θα αλλαχθεί σε '%s'" #: ../quodlibet/qltk/ratingsmenu.py:45 msgid "Change _Rating" msgstr "Αλλαγή _Βαθμολογίας" #: ../quodlibet/qltk/ratingsmenu.py:58 msgid "_Remove Rating" msgstr "_Διαγραφή Βαθμολογίας" #: ../quodlibet/qltk/ratingsmenu.py:76 msgid "_Remove rating" msgstr "_Διαγραφή βαθμολογίας" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Αντικατάσταση κενών με _κάτω παύλες" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Αφαίρεση χαρακτήρων μη συμβατών με τα _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Αφαίρεση _διακριτικών συμβόλων" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Αφαίρεση μη-_ASCII χαρακτήρων" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Χρήση μόνο πε_ζών γραμμάτων" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Μετονομασία Αρχείων" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Πρότυπα Διαδρομών" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 msgid "Edit saved patterns…" msgstr "Επεξεργασία αποθηκευμένων προτύπων…" #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Προεπισκόπηση" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Νέο Όνομα" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Αδυναμία μετονομασίας αρχείου" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Αγνόηση Όλων των Σ_φαλμάτων" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "Συνέ_χεια" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Η διαδρομή αρχείου δεν είναι απόλυτη" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Τραγούδια από τους εμφανιζόμενους φακέλους θα προστεθούν στην μουσικοθήκη " "σας μετά από ανανέωση" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "Επιλεγμένοι Κατάλογοι" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Αποθηκευμένες Αναζητήσεις" #: ../quodlibet/qltk/searchbar.py:50 msgid "Edit saved searches…" msgstr "Επεξεργασία αποθηκευμένων αναζητήσεων…" #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Αναζήτηση" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" "Αναζήτηση στην μουσικοθήκη σας, με χρήση ελεύθερου κειμένου ή ερωτημάτων QL" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Αναζήτηση με την _πληκτρολόγηση" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" "Εμφάνισε τα αποτελέσματα αναζήτησης αφού ο χρήστης σταματήσει την " "πληκτρολόγηση" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "Ό_ριο:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Βαρύτητα" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Φίλτρο στο %s" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "Όλες οι Κε_φαλίδες" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Κεφαλίδες _Κομματιών" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Κεφαλίδες Ά_λμπουμ" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Κεφαλίδες _Συντελεστών" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Κεφαλίδες _Ημερομηνιών" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Κεφαλίδες Αρ_χείων" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Κεφαλίδες Παρα_γωγής" #: ../quodlibet/qltk/songlist.py:1092 msgid "_Customize Headers…" msgstr "Προσαρμογή _Κεφαλίδων…" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "_Επέκταση Στήλης" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 msgid "Play_lists" msgstr "_Λίστες Αναπαραγωγής" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Προσθήκη στην _Ουρά" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "Αντιγραφή στην _Συσκευή" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "Α_φαίρεση από την μουσικοθήκη" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Αντικατάσταση _κάτω παύλων με κενά" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Κάντε _Κεφαλαία Τα Πρώτα Γράμματα Κάθε Λέξης Στις Ετικέτες" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Διαχωρισμός σε πο_λλαπλές τιμές" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Ετικέτες από την Διαδρομή Αρχείου" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Οι ετικέτες αντικαθιστούν τις ήδη υπάρχουσες" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Οι ετικέτες προστίθενται στις ήδη υπάρχουσες" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "Αποθήκευση" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Μη έγκυρες ετικέτες" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Επεξεργασία Προβολής" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Αριθμοί Κομματιών" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Αρ_χή από:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "Συνολικός αριθμός κομματιών:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Αναπαραγωγή/Παύση" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Προηγούμενο" #: ../quodlibet/qltk/views.py:803 #, python-format msgid "and %d more…" msgstr "και %d ακόμη…" #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Αποθήκευση των τραγουδιών που επεξεργαστήκατε" #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, python-format msgid "%(current)d of %(all)d" msgstr "%(current)d από %(all)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Υπάρχει ήδη λίστα αναπαραγωγής με το όνομα %s." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "Ενσωμάτωσε το εξωφύλλο άλμπουμ" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "Χρήση ενσωματωμένων εξώφυλλων άλμπουμ." #: ../quodlibet/util/cover/built_in.py:41 msgid "Filesystem cover" msgstr "Εξώφυλλο άλμπουμ από το σύστημα αρχείων" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "Χρήση εικόνων που βρίσκονται στον κατάλογο μαζί με το τραγούδι" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "Α:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "Π:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "Σ:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Προβολή σύντομων πληροφοριών χρήσης" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Προβολή έκδοσης και πνευματικών δικαιωμάτων" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Χρήση: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[επιλογές]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Η επιλογή %r δεν αναγνωρίστηκε" #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Η επιλογή %r χρειάζεται ένα όρισμα" #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "Το %r δεν είναι μοναδικά ταυτοποιήσιμο πρόθεμα" #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d δευτερόλεπτο" msgstr[1] "%d δευτερόλεπτα" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d λεπτό" msgstr[1] "%d λεπτά" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d ώρα" msgstr[1] "%d ώρες" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d ημέρα" msgstr[1] "%d ημέρες" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 msgctxt "check" msgid "titlecase?" msgstr "" #: ../quodlibet/util/massagers.py:31 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Η ημερομηνία πρέπει να εισαχθεί με μορφή 'ΧΧΧΧ', 'ΧΧΧΧ-ΜΜ-ΗΗ' ή 'ΧΧΧΧ-ΜΜ-ΗΗ " "ΩΩ:ΛΛ:ΔΔ'." #: ../quodlibet/util/massagers.py:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Οι ενισχύσεις του Replay Gain πρέπει να εισαχθούν με μορφή 'x.yy dB'." #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Οι μέγιστες κορυφές Replay Gain πρέπει να εισαχθούν σε μορφή 'x.yy'." #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Η κατάσταση κυκλοφορίας του MusicBrainz πρέπει να είναι 'επίσημη', " "'διαφημιστική' ή 'πειρατική'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Η γλώσσα πρέπει να είναι σε μορφή κώδικα τριών γραμμάτων ISO 639-2" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Αδυναμία επεξεργασίας τραγουδιού" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Μη έγκυρη Κωδικοποίηση]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "άλμπουμ" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "διευθετών" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "διευθετώντες" #: ../quodlibet/util/tags.py:72 msgid "arrangement" msgstr "διευθέτηση" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "συγγραφέας" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "συγγραφείς" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "συνθέτης" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "συνθέτες" #: ../quodlibet/util/tags.py:75 msgid "composition" msgstr "σύνθεση" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "διευθυντής ορχήστρας" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "διευθυντές ορχήστρας" #: ../quodlibet/util/tags.py:76 msgid "conducting" msgstr "διεύθυνση ορχήστρας" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "σύνδεσμος" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "πνευματική ιδιοκτησία" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "ημερομηνία" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "περιγραφή" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "είδος" #: ../quodlibet/util/tags.py:81 msgid "genres" msgstr "είδη" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "ομαδοποίηση" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "γλώσσα" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "άδεια" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "τοποθεσία" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "στιχουργός" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "οργάνωση" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "τίτλος" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "έκδοση" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "ιστοσελίδα" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "καλλιτέχνης άλμπουμ" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "ρυθμός (BPM - διακροτήματα ανά λεπτό)" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "υπότιτλος δίσκου" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "δίσκος" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "κομμάτι" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "δισκογραφική ταυτότητα" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "ημερομηνία αρχικής κυκλοφορίας" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "αρχικό άλμπουμ" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "αρχικός καλλιτέχνης" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "ημερομηνία ηχογράφησης" #: ../quodlibet/util/tags.py:107 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:116 msgid "MusicBrainz recording ID" msgstr "Ταυτότητα ηχογράφησης MusicBrainz" #: ../quodlibet/util/tags.py:117 msgid "MusicBrainz release track ID" msgstr "Ταυτότητα κυκλοφορίας κομματιού MusicBrainz" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "Ταυτότητα κυκλοφορίας MusicBrainz" #: ../quodlibet/util/tags.py:119 msgid "MusicBrainz artist ID" msgstr "Ταυτότητα καλλιτέχνη MusicBrainz" #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz release artist ID" msgstr "Ταυτότητα καλλιτέχνη κυκλοφορίας MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "Ταυτότητα TRM MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "Ταυτότητα PUID MusicBrainz" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Κατάσταση κυκλοφορίας άλμπουμ MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Τύπος άλμπουμ MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "ενίσχυση κομματιού" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "ηχητική κορυφή κομματιού" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "ενίσχυση άλμπουμ" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "ηχητική κορυφή άλμπουμ" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "ηχητική ένταση αναφοράς" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "δίσκοι" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "κομμάτια" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "τελευταία εκκίνηση αναπαραγωγής" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "πλήρες όνομα" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "σημείο προσάρτησης" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "συντελεστές" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "έτος" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "έτος αρχικής κυκλοφορίας" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "σελιδοδείκτης" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "τύπος αρχείου" #: ../quodlibet/util/tags.py:160 msgid "playlists" msgstr "λίστες αναπαραγωγής" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "ταξινόμηση" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" 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 "Clear search" #~ msgstr "Καθαρισμός αναζήτησης" #~ 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 "lyricists" #~ 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.5.3/po/ru.po����������������������������������������������������������������������������0000644�0001750�0001750�00000607047�12646427551�015376� 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: 2016-01-16 12:54+0100\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 "Музыкальный проигрыватель" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "редактор тегов аудиофайлов" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "папка" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Название" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Исполнитель" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Дата" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Жанр" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "О_ценка" #: ../quodlibet/browsers/albums/main.py:160 msgid "Sort _by…" msgstr "Сортировать _по…" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Настройки" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Список альбомов" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Список _альбомов" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Все альбомы" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d альбом" msgstr[1] "%d альбома" msgstr[2] "%d альбомов" #: ../quodlibet/browsers/albums/main.py:640 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Обновить _обложку альбома" msgstr[1] "Обновить _обложки альбомов" msgstr[2] "Обновить _обложки альбомов" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Композиции, не входящие в альбомы" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d дорожка" msgstr[1] "%d дорожки" msgstr[2] "%d дорожек" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d диск" msgstr[1] "%d диска" msgstr[2] "%d дисков" #: ../quodlibet/browsers/albums/prefs.py:66 msgid "An Example Album" msgstr "Наглядный пример" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Настройка списка альбомов" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Показывать обложки _альбомов" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "При быстром поиске _искать также исполнителей" #: ../quodlibet/browsers/albums/prefs.py:93 msgid "Options" msgstr "Параметры" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Список альбомов" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Некорректный шаблон" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Неизвестно" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Новая лента" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Введите адрес ленты аудиофайлов:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Ленты аудиофайлов" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Ленты аудиофайлов" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 msgid "_Download…" msgstr "_Загрузить…" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Загрузить файлы" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "Со_хранить" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Загрузить файл" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "С_оздать" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Не удалось добавить ленту" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 msgid "_Refresh" msgstr "Об_новить" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "_Удалить файлы" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "Не удалось импортировать %s, поддержка лент аудиофайлов отключена." #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Используемая система аудиовывода не поддерживает адреса URL. Поддержка лент " "аудиофайлов отключена." #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Окно просмотра фонотеки" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Коллекция альбомов" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Коллекция альбомов" #: ../quodlibet/browsers/collection/models.py:23 #, python-format msgid "Unknown %s" msgstr "Неизвестный %s" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "Несколько значений %s" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Особые" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Удалить оценку" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Тег" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Группировать" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Настройка коллекции альбомов" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Без просмотра" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Без просмотра" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Файловая система" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Файловая система" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Не удалось скопировать композиции" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Выбранные файлы не могут быть скопированы в другой список воспроизведения " "или очередь." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "_Добавить в фонотеку" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Неподдерживаемый тип файла" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Не удалось добавить станцию" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Интернет-радио" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Загрузка списка станций" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Новая станция" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Интернет-радио" #: ../quodlibet/browsers/iradio.py:549 msgid "_New Station…" msgstr "_Новая станция…" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "_Обновить список станций" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Все станции" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Избранное" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Без категории" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Станций не найдено" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "По адресу %s интернет-радиостанций не найдено." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Все указанные станции уже находятся в фонотеке." #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "Добавить в избранное" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Удалить из избранного" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Свойства устройства" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Устройство:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Не подключено" #: ../quodlibet/browsers/media.py:53 msgid "Mount point:" msgstr "Точка монтирования:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Имя:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Аудиоустройства" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "Аудио_устройства" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Извлечь" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Свойства" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "Пере_именовать" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%s использовано, %s доступно" #: ../quodlibet/browsers/media.py:477 #, python-format msgid "%s is not connected." msgstr "%s не присоединён." #: ../quodlibet/browsers/media.py:497 #, python-format msgid "Copying %(song)s" msgstr "Копирование %(song)s" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Не удалось скопировать композицию" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Недостаточно места для данной композиции." #: ../quodlibet/browsers/media.py:524 #, python-format msgid "%s could not be copied." msgstr "Не удалось скопировать %s." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Не удалось удалить композиции" #: ../quodlibet/browsers/media.py:555 #, python-format msgid "Deleting %(song)s" msgstr "Удаление %(song)s" #: ../quodlibet/browsers/media.py:573 #, python-format msgid "%s could not be deleted." msgstr "Не удалось удалить %s." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Не удалось удалить композицию" #: ../quodlibet/browsers/media.py:592 #, python-format msgid "Ejecting %s failed." msgstr "Не удалось извлечь %s." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Не удалось извлечь устройство" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" "Система поддержки устройств не найдена, просмотр аудиоустройств отключён." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Обзор фонотеки" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Обзор фонотеки" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "В_ыбрать всё" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Все" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "_Широкий режим" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Параметры просмотра" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Списки воспроизведения" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "Списки _воспроизведения" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Удалить из _списка воспроизведения" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Импортировать" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Новый список воспроизведения" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Не удалось импортировать список воспроизведения" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet может импортировать списки воспроизведения только в форматах M3U " "и PLS." #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "Не удалось переименовать список воспроизведения" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Импортировать список воспроизведения" #: ../quodlibet/browsers/playlists/menu.py:20 msgid "_New Playlist…" msgstr "_Новый список воспроизведения…" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Подтвердите действие для списка воспроизведения «%s»" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Удалить список воспроизведения «%s»?" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "Список воспроизведения будет удалён безвозвратно." #: ../quodlibet/browsers/playlists/util.py:49 msgid "Enter a name for the new playlist:" msgstr "Введите название нового списка воспроизведения:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet не запущен." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "музыкальный проигрыватель и фонотека" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[параметр]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Вывести название текущей композиции и выйти" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Сразу начать воспроизведение" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Перейти к следующей композиции" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "Перейти к предыдущей композиции или в начало текущей" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Перейти к предыдущей композиции" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Начать воспроизведение" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Приостановить воспроизведение" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Переключить режим воспроизведения/паузы" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Остановить воспроизведение" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Увеличить громкость" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Уменьшить громкость" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Вывести состояние воспроизведения" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Скрыть главное окно" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Показать главное окно" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Показать/скрыть главное окно" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Поместить фокус на окно Quod Libet" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Снять текущие фильтры режимов просмотра" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Обновить фонотеку" #: ../quodlibet/cli.py:106 msgid "List available browsers" msgstr "Вывести список режимов просмотра" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Вывести текущий список воспроизведения" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Вывести содержимое очереди" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Вывести содержимое очереди" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Отключить расширения" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet не запущен." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Выйти из Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Навигация по воспроизводимой композиции" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ЧЧ:]ММ:СС" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Переключить порядок воспроизведения" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Включить/выключить режим повторения композиций" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Установить громкость" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Найти в фонотеке" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "запрос" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Воспроизвести файл" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "имя файла" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Оценить воспроизводимую композицию" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Установить режим просмотра фонотеки" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Открыть новый режим просмотра" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Показать/скрыть/переключить очередь" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Показать/скрыть список композиций" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Фильтровать по случайному параметру" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Тег" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Фильтровать по значению тега" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "тег=значение" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Добавить в очередь файл или результат запроса" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Добавить в очередь несколько файлов" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "имя файла" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Вывести полученные имена файлов на экран (stdout)" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Удалить из очереди файл или результат запроса" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Недопустимый аргумент для «%s»." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Попробуйте %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Неизвестное устройство" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "Не удалось импортировать %s, который необходим для поддержки устройств." #: ../quodlibet/devices/__init__.py:148 #, python-format msgid "%r is not a supported device." msgstr "Устройство «%r» не поддерживается." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: не удалось найти %s." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Инициализация системы поддержки устройств." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Проверка «%s»" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Не удалось подключиться к системе поддержки устройств." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Система поддержки устройств запущена." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod отключён" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Создать новую базу данных на этом iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "_Создать базу данных" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Усиление громкости (дБ):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Копировать обложки _альбомов" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "_Объединить теги с разными значениями" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Название содержит _версию" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Альбом содержит _раздел диска" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Модель:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Ёмкость:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Микропрограмма:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Удаление лишней дорожки с iPod" #: ../quodlibet/devices/ipod.py:310 msgid "Saving iPod database…" msgstr "Сохранение базы данных iPod…" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Не удалось сохранить базу данных iPod" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "Не удалось найти libgpod, поддержка iPod отключена." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Шаблон имени файла:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Удалить неиспользуемые обложки и папки" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "Источник обложек Last.fm" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Загружает обложки из архива Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:18 msgid "MusicBrainz Cover Source" msgstr "Источник обложек MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Загружает обложки из архива MusicBrainz." #: ../quodlibet/ext/editing/iconv.py:33 msgid "Convert Encodings" msgstr "Выбор кодировки" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Позволяет выбрать подходящую кодировку в редакторе тегов." #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "_Изменить кодировку…" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Не удалось найти «Kanji Kana Simple Inverter» (kakasi)." #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "Замена по регулярному выражению" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Позволяет использовать регулярные выражения для замены (s///) при получении " "тегов из имени файла или переименования файла по тегам." #: ../quodlibet/ext/editing/titlecase.py:19 msgid "Title Case" msgstr "Капитализация" #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title-cases tag values in the tag editor." msgstr "Позволяет применять правила капитализации к полям в редакторе тегов." #: ../quodlibet/ext/editing/titlecase.py:39 msgid "Title-_case Value" msgstr "_Применить правила капитализации" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "_Пропускать слова, написанные только заглавными буквами" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "_Соблюдать правила английского языка" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 #, fuzzy msgid "Advanced Preferences" msgstr "Параметры просмотра" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "Анимированные уведомления" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "Показывает на экране информацию при смене композиции." #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "Вверху экрана" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "Посередине экрана" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "Внизу экрана" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "_Положение:" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Общий размер:" #: ../quodlibet/ext/events/animosd/prefs.py:176 msgid "Display" msgstr "Вид" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "_Шрифт:" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "По левому краю" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "По центру" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Right" msgstr "По правому краю" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "_Выравнивание:" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "Текст" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "_Текст:" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "За_ливка:" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "Цвета" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "Т_ени" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "_Контуры" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "З_акруглённые углы" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "За_держка:" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "Эффекты" #: ../quodlibet/ext/events/animosd/prefs.py:267 msgid "Ed_it Display Pattern…" msgstr "_Изменить шаблон…" #: ../quodlibet/ext/events/animosd/prefs.py:271 msgid "Preview" msgstr "Предварительный просмотр" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "Автообновление фонотеки" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Автоматически обновляет фонотеку с помощью inotify. Требует %s." #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Авто_матически" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "Автоматическая оценка" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "Будильник" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "Включает громкую музыку в заданное время." #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "Колыбельная" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "Постепенно убавляет громкость и приостанавливает воспроизведение." #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "Эквалайзер" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "Позволяет менять оттенок звучания музыки." #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" "Используемая система аудиовывода не поддерживает коррекцию аудиосигнала." #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "%.1f кГц" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "%d Гц" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, python-format msgid "%.1f dB" msgstr "%.1f дБ" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Особые" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Очистить ошибки" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "Предотвращает активацию хранителя экрана GNOME при воспроизведении." #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Музыкальный проигрыватель" #: ../quodlibet/ext/events/iradiolog.py:15 msgid "Internet Radio Log" msgstr "Журнал Интернет-радио" #: ../quodlibet/ext/events/iradiolog.py:16 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:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "Сервер MPD" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 msgid "Connection" msgstr "Соединение" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "Проверенные клиенты" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 msgid "Hide main window on close" msgstr "Скрывать главное окно при закрытии" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Параметры" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "Текст уведомления" #: ../quodlibet/ext/events/notify.py:86 msgid "_Title:" msgstr "З_аголовок:" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "Сбросить на шаблон по умолчанию" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "_Тело:" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "_Показать уведомление" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "Показывать уведомления" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "При смене композиции <i>_вручную</i>" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "При <i>авто_матической</i> смене композиции" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "При <i>_любой</i> смене композиции" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "Только когда _фокус не на главном окне" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "Ошибка соединения" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "Не удалось подключиться к системе уведомлений." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "Системные уведомления" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "Показывает системное уведомление при смене композиции." #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 msgid "_Service:" msgstr "_Сервис:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "User_name:" msgstr "_Имя пользователя:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "_Пароль:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 msgid "Other…" msgstr "Другой…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "_Проверить учётную запись" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "Учётная запись" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Исполнитель" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Шаблон имени файла:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "_Автономный режим (ничего не отправлять)" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "Отправка" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "_Случайный альбом" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "альбомы" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 msgid "Weights" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "избегать" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "предпочитать" #: ../quodlibet/ext/events/randomalbum.py:198 msgid "Random Album" msgstr "Случайный альбом" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Импортировать список воспроизведения" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "Импорт из Rhythmbox" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" "Приостанавливает воспроизведение, когда хранитель экрана GNOME активен." #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "Позволяет GNOME Shell искать по фонотеке." #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Остановлен" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d композиция" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Сохранённые шаблоны" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "Тема оформления" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "Позволяет сменить используемую тему GTK+." #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "_Тема:" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "Тема по умолчанию" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "Предпочитать тёмную версию темы" #: ../quodlibet/ext/events/themeswitcher.py:95 #, fuzzy msgid "Use header bars" msgstr "Использовать относительные пути" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Прокрутка колёсиком меняет громкость\n" "Shift и прокрутка колёсиком меняет композицию" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Прокрутка колёсиком меняет композицию\n" "Shift и прокрутка колёсиком меняет громкость" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "_Колёсико мыши" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Содержание подсказки" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Остановлен" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "Значок в трее" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "Позволяет управлять Quod Libet из системного лотка." #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Списки _воспроизведения" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Воспроизведение/Пауза" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Предыдущая композиция" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Следующая композиция" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "О_черёдность" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Повторять" #: ../quodlibet/ext/events/trayicon.py:481 msgid "Stop _after this song" msgstr "_Остановиться после этой композиции" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "Про_смотр фонотеки" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Изменить _теги" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 #, fuzzy msgid "_Information" msgstr "Информация" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 msgid "View Lyrics" msgstr "Текст песни" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "Показывает текст песни под списком композиций." #: ../quodlibet/ext/events/viewlyrics.py:38 msgid "_Lyrics" msgstr "_Текст песни" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "_Порог:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "Пороговое значение амплитуды, выше которой сигнал будет ослабляться" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "_Коэффициент:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "Коэффициент компрессии аудиосигнала" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "Компрессор" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Изменяет амплитуду сигнала, превышающего определённое значение, с указанным " "коэффициентом." #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Предварительный просмотр" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Фильтровать по _исполнителю" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "По умолчанию" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "Расширенная сортировка" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 msgid "Filter _band:" msgstr "_Частота фильтра:" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "Filter _width:" msgstr "_Диапазон фильтра:" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "_Уровень:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "Интенсивность эффекта" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "Караоке" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "Убирает вокал из аудио." #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "_Темп:" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "_Высота:" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Ленты аудиофайлов" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Введите адрес ленты аудиофайлов:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 msgid "Shuffle Playlist" msgstr "Перемешать список воспроизведения" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "Воспроизведение следует за выделением." #: ../quodlibet/ext/playorder/queue.py:16 msgid "Queue Only" msgstr "Только очередь" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" "Только композиции в очереди будут воспроизведены. Добавить любую композицию " "в очередь можно двойным щелчком." #: ../quodlibet/ext/playorder/reverse.py:8 msgid "Reverse" msgstr "В обратном порядке" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "Воспроизводит композиции в обратном порядке." #: ../quodlibet/ext/playorder/track_repeat.py:26 msgid "Track Repeat" msgstr "Повтор композиции" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" "Воспроизводит композиции в случайном порядке, но повторяет каждую заданное " "количество раз." #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "Сколько раз воспроизводить каждую композицию:" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "Не удалось подключиться к %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "Имя машины:" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "Порт:" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 msgid "Username:" msgstr "Имя пользователя:" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "Пароль:" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 msgid "Library path:" msgstr "Путь к фонотеке:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "_Проверить настройки" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 #, fuzzy msgid "Squeezebox Server" msgstr "<b>Сервер Squeezebox</b>" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Отладка" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 msgid "Fit image to _window" msgstr "_Масштаб по размеру окна" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "_Приложение:" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "Из_менить изображение после сохранения" #: ../quodlibet/ext/songsmenu/albumart.py:243 msgid "File_name:" msgstr "_Имя файла:" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "Сохранить не удалось" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, python-format msgid "Unable to save \"%s\"." msgstr "Не удалось сохранить «%s»." #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 msgid "Album Art Downloader" msgstr "Поиск обложек" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "с %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "Разрешение: %s" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, python-format msgid "Size: %s" msgstr "Размер: %s" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Найти:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 msgid "Searching…" msgstr "Поиск…" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "Готово" #: ../quodlibet/ext/songsmenu/albumart.py:820 msgid "Download Album Art" msgstr "Загрузка обложек" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "Загружает обложки альбомов с различных веб-сайтов." #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "Источники" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "APEv2 в ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 msgid "Go to Bookmark…" msgstr "Перейти к закладке…" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "Позволяет перейти к любой закладке в выделенных файлах." #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 msgid "_Edit Bookmarks…" msgstr "_Изменить закладки…" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 msgid "No Bookmarks" msgstr "Нет закладок" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Имя файла" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Дорожка" #: ../quodlibet/ext/songsmenu/brainz.py:119 msgid "Title" msgstr "Название" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Исполнитель" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "_Выпуск:" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "%d _выпуск:" msgstr[1] "%d _выпуска:" msgstr[2] "%d _выпусков:" #: ../quodlibet/ext/songsmenu/brainz.py:348 #, fuzzy msgid "Please enter a query." msgstr "<b>Введите запрос.</b>" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 #, fuzzy msgid "Loading result…" msgstr "<i>Загрузка данных…</i>" #: ../quodlibet/ext/songsmenu/brainz.py:370 msgid "No results found." msgstr "Ничего не найдено." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "Найден %d результат." msgstr[1] "Найдено %d результата." msgstr[2] "Найдено %d результатов." #: ../quodlibet/ext/songsmenu/brainz.py:411 msgid "MusicBrainz lookup" msgstr "Поиск на MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 msgid "_Query:" msgstr "_Запрос:" #: ../quodlibet/ext/songsmenu/brainz.py:442 msgid "S_earch" msgstr "_Найти" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "Результаты <i>(порядок можно изменить перетаскиванием)</i>" #: ../quodlibet/ext/songsmenu/brainz.py:483 msgid "MusicBrainz Lookup" msgstr "Поиск на MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Позволяет найти альбом на MusicBrainz и записать найденные теги." #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Выделить «_disc» из «album»" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "Записывать _стандартные теги MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 msgid "Browse Folders" msgstr "Просмотр папок" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "Позволяет открывать папки с композициями в файловом менеджере." #: ../quodlibet/ext/songsmenu/browsefolders.py:184 msgid "Unable to open folders" msgstr "Не удалось открыть папки" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "Не найдено приложение, способное открывать папки." #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Список композиций" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "Поиск по CDDB" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "Поиск информации об альбоме на FreeDB. Требует CDDB.py." #: ../quodlibet/ext/songsmenu/cddb.py:166 msgid "Timeout" msgstr "Время ожидания истекло" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "Не удалось выполнить запрос, превышено время ожидания соединения" #: ../quodlibet/ext/songsmenu/cddb.py:172 msgid "Select an album" msgstr "Выберите альбом" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "Выберите альбом, который нужно загрузить." #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "В CDDB ничего не найдено (%s)" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "Консоль Python" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "Текущий рабочий каталог:" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "Команда" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "name" msgstr "название" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "Название этой команды" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "command" msgstr "команда" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "параметр" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 msgid "pattern" msgstr "шаблон" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" "Шаблон, который будет использован для получения аргументов к этой команде " "(например, <~filename>)" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Наибольшее количество аргументов, которое будет передано приложению за один " "раз (аналогично xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 msgid "Input value" msgstr "Введите значение" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "Значение %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 msgid "Custom Commands" msgstr "Пользовательские команды" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Позволяет выполнять пользовательские команды над композициями (в пакетном " "режиме, если требуется), используя любые теги в качестве аргументов." #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "Изменить команды" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Поддерживает шаблоны,\n" "например, <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "Свернуть/развернуть всё" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Выражение для поиска повторов: «%s»" #: ../quodlibet/ext/songsmenu/duplicates.py:364 msgid "Duplicates Browser" msgstr "Поиск повторов" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "Поиск и просмотр композиций с похожими тегами." #: ../quodlibet/ext/songsmenu/duplicates.py:404 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:406 msgid "_Group duplicates by:" msgstr "_Группировать повторы по:" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "Выражение для поиска" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "Удалить _пробелы" #: ../quodlibet/ext/songsmenu/duplicates.py:417 msgid "Remove _Diacritics" msgstr "Удалить _диакритические знаки" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Remove _Punctuation" msgstr "Удалить п_унктуацию" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "_Игнорировать регистр" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "Настройки сравнения" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Изменить внешний вид" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "Изменить внедрённые изображения" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "Позволяет удалять или заменять внедрённые изображения." #: ../quodlibet/ext/songsmenu/embedded.py:65 msgid "_Remove all images" msgstr "_Удалить все изображения" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "_Внедрить текущее изображение" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "Точная оценка" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "Возможность ввести точную оценку композиции в виде числа." #: ../quodlibet/ext/songsmenu/exact_rating.py:29 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:79 msgid "Filter on Any Tag" msgstr "Фильтр по любому тегу" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "Позволяет создавать поисковые запросы по тегам выбранных композиций." #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 msgid "Filter on Directory" msgstr "Фильтр по папке" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "Фильтр по папке в новом окне." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "Поиск по акустическому отпечатку" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Поиск информации о композициях по их акустическим отпечаткам." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "Отправка акустических отпечатков" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Позволяет создавать акустические отпечатки композиций, используя " "chromaprint, и отправлять их на acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "Требуется ключ API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "Запросить ключ" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "_Ключ API:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "Веб-сервис AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "В очереди" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "Анализ" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "Поиск" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Error" msgstr "Ошибка" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Записать" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "Состояние" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "Выпуск" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 msgid "Write MusicBrainz tags" msgstr "Записать теги MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 msgid "Group by directory" msgstr "Группировать по папке" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 msgid "Album Mode" msgstr "Режим альбома" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Записывать альбомные теги и пытаться сократить число различных выпусков " "альбома" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "Создание отпечатков:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "_Подробности" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "_Отправить" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 #, fuzzy msgid "Fingerprints:" msgstr "Создание отпечатков:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 #, fuzzy msgid "Songs with MBIDs:" msgstr "" "\n" "<i>Композиций с идентификаторами MBID:</i> %d/%d" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 #, fuzzy msgid "Songs with sufficient tags:" msgstr "" "\n" "<i>Композиций с заполненными тегами:</i> %d/%d" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 #, fuzzy msgid "Songs to submit:" msgstr "" "\n" "<i>Композиций для отправки:</i> %d/%d" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, fuzzy, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Готово. %d/%d композиций для отправки." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "Отправка отпечатков:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "Отправка…" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 msgid "Force Write" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "Экспорт в HTML" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "Экспорт выбранного списка композиций в HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "Отправить на iFP" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "Загружает композиции на устройства iRiver iFP." #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "Экспорт метаданных" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "Экспорт метаданных выбранных композиций в файл .tags." #: ../quodlibet/ext/songsmenu/importexport.py:84 msgid "Import Metadata" msgstr "Импорт метаданных" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "Импорт метаданных выбранных композиций из файла .tags." #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "Запись CD" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Записывает CD с помощью K3b, Brasero или xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "Обновление списка чартов." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "Не требует обновления." #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "Загрузка чарта за неделю от %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "Синхронизация завершена." #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "Произошла ошибка синхронизации" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "Синхронизация с Last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Дополняет статистику фонотеки данными из профиля на Last.fm." #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 msgid "_Username:" msgstr "_Имя пользователя:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "%d композиция" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 msgid "No lyrics found" msgstr "Слова песни не найдены" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 msgid "Lyrics:" msgstr "Текст песни:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 msgid "Lyrics Window" msgstr "Окно с текстом песни" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "Позволяет открыть отдельное окно с текстом песни." #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "Отправить…" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 msgid "Playlist Export" msgstr "Экспорт списка воспроизведения" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "Экспорт композиций в файл M3U или PLS." #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "Использовать относительные пути" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "Использовать абсолютные пути" #: ../quodlibet/ext/songsmenu/playlist.py:150 msgid "Unable to export playlist" msgstr "Не удалось экспортировать список воспроизведения" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Не удалось записать в <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 msgid "Refresh Songs" msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d композиция" msgstr[1] "%d композиции" msgstr[2] "%d композиций" #: ../quodlibet/ext/songsmenu/refresh.py:28 msgid "Refresh songs" msgstr "Обновление композиций" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "Анализ ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "Прогресс" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "Усиление" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "Пик" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, fuzzy, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "Обновляется <b>%d</b> альбом (из %d)" msgstr[1] "Обновляется <b>%d</b> альбома (из %d)" msgstr[2] "Обновляется <b>%d</b> альбомов (из %d)" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "Анализ ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Анализирует и обновляет информацию ReplayGain с помощью GStreamer, группируя " "композиции по альбомам." #: ../quodlibet/ext/songsmenu/replaygain.py:604 #, fuzzy msgid "always" msgstr "<b>всегда</b>" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "Если <b>какие-либо</b> теги ReplayGain отсутствуют" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "Если <b>альбомные</b> теги ReplayGain отсутствуют" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "О_брабатывать альбомы:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "<b>Если теги уже есть</b>" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Изменить теги" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Все альбомы" #: ../quodlibet/ext/songsmenu/splitting.py:41 #, fuzzy msgid "Split out disc number." msgstr "Выделить «_disc» из «album»" #: ../quodlibet/ext/songsmenu/website_search.py:34 msgid "Website Search" msgstr "Поиск в Интернете" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 msgid "Search URL patterns" msgstr "Шаблоны URL для поиска" #: ../quodlibet/ext/songsmenu/website_search.py:89 msgid "Edit search URLs" msgstr "Изменить поисковые шаблоны" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 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 "Позволяет открыть веб-браузер со статьёй об альбоме на Википедии." #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Фонотека" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Проверка точек монтирования" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Сканирование фонотеки" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Сканирование %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Не удалось загрузить файл: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Вывести теги" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "_Показывать программные теги" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Недостаточно аргументов" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "Слишком много аргументов" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 msgid "Description" msgstr "Описание" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Значение" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Вывести все общие теги" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Копировать теги из одного файла в другой" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 msgid "Edit tags in a text editor" msgstr "Изменить теги в текстовом редакторе" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "Изменение прервано" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Не удалось запустить текстовый редактор «%(editor-name)s»." #: ../quodlibet/operon/commands.py:250 msgid "No changes detected" msgstr "Изменения не найдены" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Не удалось установить %r" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "Удалить теги" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "Удалить все теги" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 msgid "Remove a tag value" msgstr "Удалить значение тега" #: ../quodlibet/operon/commands.py:418 msgid "Add a tag value" msgstr "Добавить значение тега" #: ../quodlibet/operon/commands.py:446 msgid "List file information" msgstr "Вывести информацию о файле" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, python-format msgid "Failed to load image file: %r" msgstr "Не удалось загрузить файл: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, 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:525 msgid "Remove all embedded images" msgstr "Удалить все внедрённые изображения" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Извлечь внедрённые изображения в %(filepath)s" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Файл" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Поток" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Буферизация" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "Не удалось создать конвейер GStreamer" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "Не найден элемент GStreamer для обработки формата мультимедиа" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "Формат мультимедиа: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 msgid "No GStreamer audio sink found" msgstr "Не найдено ни одного устройства аудиовывода GStreamer" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "Некорректный конвейер GStreamer для воспроизведения" #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Не удалось создать аудиовыход" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" "Не удалось найти модуль «{module}». Возможно, нужно установить " "соответствующий пакет." #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Не удалось найти элемент GStreamer: «{element}»." #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Расширения" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Поддерживаемые форматы: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Аудиоустройство: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Начало" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "Н/Д" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Время" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Имя закладки" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "ММ:СС" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Закладки" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Фильтры" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "Недавно _прослушанные" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Недавно _добавленные" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 _лучших" #: ../quodlibet/qltk/browser.py:57 msgid "All _Songs" msgstr "_Все композиции" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Фильтровать по _жанру" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Фильтровать по _исполнителю" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Фильтровать по _альбому" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Случайный _жанр" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "_Случайный исполнитель" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "_Случайный альбом" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 композиций, которые воспроизводились большее количество раз, чем " "остальные (может быть выбрано больше 40, если есть композиции, " "воспроизводившиеся равное количество раз)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Нет информации о времени" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Значение:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Сохранённые значения" #: ../quodlibet/qltk/cbes.py:252 msgid "Edit saved values…" msgstr "Изменить сохранённые значения…" #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Композиции" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Отображать оставшееся время" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Авто_матически" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "Режим _дорожки" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "Режим _альбома" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Анализ ReplayGain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 msgid "(unknown)" msgstr "(неизвестно)" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Введите новое значение" #: ../quodlibet/qltk/debugwindow.py:41 #, fuzzy msgid "Error Details" msgstr "_Подробности" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Произошла ошибка" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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> с описанием ваших " "действий до ошибки." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" "Quod Libet может работать некорректно. Рекомендуется перезапустить " "программу. Фонотека будет сохранена." #: ../quodlibet/qltk/delete.py:33 msgid "Files:" msgstr "Файлы:" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Все выбранные композиции будут удалены из фонотеки, а их файлы будут удалены " "с диска." #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "Выбранные файлы будут удалены с диска." #: ../quodlibet/qltk/delete.py:73 #, 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:90 msgid "_Delete Files" msgstr "_Удалить файлы" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Все выбранные композиции будут удалены из фонотеки, а их файлы будут " "перемещены в корзину." #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Переместить в корзину" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Перемещение %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Не удалось переместить файлы в корзину" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 msgid "Moving one or more files to the trash failed." msgstr "Не удалось переместить в корзину некоторые файлы." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Удаление %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 msgid "Unable to delete files" msgstr "Не удалось удалить файлы" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "_Разделить на несколько значений" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Выделить «_disc» из «album»" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Выделить «_version» из «title»" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Выделить «_arranger» из «artist»" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Выделить «_performer» из «artist»" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "Выделить «_performer» из «title»" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "Выделить «_originalartist» из «title»" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Добавить тег" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "Т_ег:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Не удалось добавить тег" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Не удалось добавить композицию" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Недопустимый тег" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Недопустимое значение" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Расширения" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Настройки Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "_Разделять по:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Редактор тегов" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Папки" #: ../quodlibet/qltk/filesel.py:221 msgid "_New Folder…" msgstr "_Создать папку…" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "В_ыбрать все вложенные папки" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Создание папки" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Введите имя новой папки:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Не удалось создать папку" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Не удалось удалить папку" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "в исполнении %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Диск %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Дорожка %s" #: ../quodlibet/qltk/info.py:106 msgid "_Edit Display…" msgstr "_Изменить внешний вид…" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Не выбрана ни одна композиция." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Нет композиций" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Информация" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Текст песни" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "исполнитель" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "исполнители" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "исполнители" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Никогда" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "добавлен" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "последнее воспроизведение" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "количество воспроизведений" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "пропущено" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "оценка" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "время" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Информация" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "По возрастанию" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "битрейт" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "размер" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "изменён" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d выбрано" msgstr[1] "%d выбрано" msgstr[2] "%d выбрано" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Продюсер: %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "исполнитель" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Дорожка недоступна" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Выбранные альбомы" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "альбомы" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Общая продолжительность:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Общий размер:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Файлы" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Загрузить" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Не удалось найти текст этой композиции." #: ../quodlibet/qltk/lyrics.py:78 msgid "Searching for lyrics…" msgstr "Идёт поиск текста песни…" #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Не удалось загрузить текст песни." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "Удалить все композиции?" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "Выбранные композиции будут удалены из фонотеки." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "Восстановить" #: ../quodlibet/qltk/maskedbox.py:85 #, fuzzy msgid "_Unhide" msgstr "Восстановить" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Забыть изменения тегов?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Теги были изменены, но изменения не были сохранены. Сохранить файлы или " "забыть изменения?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "В обратном порядке" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Файл существует" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "Заменить %(file-name)s?" #: ../quodlibet/qltk/msg.py:93 msgid "_Replace File" msgstr "_Заменить файл" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Активные задачи" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d задач активно" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Неизвестно" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "По порядку" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_По порядку" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Случайно" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Случайно" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "По оценкам" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_По оценкам" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Одна композиция" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Одна композиция" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Ошибки расширений" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Включённые" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Отключённые" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Без категории" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Расширения не найдены." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Расширения" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "_Ошибки" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Диск" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Номер дорожки" #: ../quodlibet/qltk/prefs.py:45 msgid "Grou_ping" msgstr "_Классификация" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "_Альбом" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Имя _файла" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "Вре_мя" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Список композиций" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Автоматически переходить к воспроизводимой композиции" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Когда воспроизведение переходит к другой композиции, переходить к ней в " "списке воспроизведения" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "Поведение" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "Д_ругие:" #: ../quodlibet/qltk/prefs.py:93 msgid "_Edit…" msgstr "_Изменить…" #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Добавить или удалить дополнительные столбцы" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Отображаемые столбцы" #: ../quodlibet/qltk/prefs.py:112 msgid "Artist includes all _people" msgstr "Исполнитель содержит всех _людей" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Имя файла содержит _путь" #: ../quodlibet/qltk/prefs.py:132 msgid "Column Preferences" msgstr "Параметры столбцов" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "Применить текущие параметры к списку, добавив новые столбцы в конец" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Дополнительные столбцы" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Режимы отображения" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Общий фильтр:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" "В дополнение к остальным, всегда будет выполняться и этот поисковый запрос" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Найти" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "_Запрашивать подтверждение при множественном изменении оценок" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Запрашивать подтверждение, прежде чем сменить оценку сразу нескольким " "композициям" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "О_ценивать композицию одним щелчком" #: ../quodlibet/qltk/prefs.py:261 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Изменять оценку композиции при щелчке в соответствующем столбце" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Оценка композиций" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Закруглять углы обложек альбомов" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "Закруглять углы миниатюр обложек альбомов." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "_Предпочитать внедрённую обложку" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "Предпочитать изображение, внедрённое в аудиофайл, если таковое имеется" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "_Только с указанным именем:" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "Будут использоваться файлы только с указанным именем" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Будут использоваться файлы только с указанным именем" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Обложки" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Воспроизведение" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Параметры воспроизведения" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Если информация Replay Gain для композиции отсутствует, изменять уровень " "громкости на это значение" #: ../quodlibet/qltk/prefs.py:347 msgid "_Fall-back gain (dB):" msgstr "_Усиление по умолчанию (дБ):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Изменять уровень громкости всех композиций на данное значение, если это не " "приводит к потере качества" #: ../quodlibet/qltk/prefs.py:361 msgid "_Pre-amp gain (dB):" msgstr "_Базовое усиление громкости (дБ):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "Корректировка _громкости Replay Gain" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Настройка Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "_Оценка по умолчанию:" #: ../quodlibet/qltk/prefs.py:463 msgid "Rating _scale:" msgstr "_Шкала оценок:" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Со_хранять оценки и счётчик воспроизведений" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Электронная почта:" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "" "Оценки и счётчики воспроизведений будут привязаны к этому адресу электронной " "почты" #: ../quodlibet/qltk/prefs.py:547 msgid "Auto-save tag changes" msgstr "Сохранять изменения тегов автоматически" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Сохранять изменения тегов без подтверждения при редактировании нескольких " "файлов" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Список разделителей (через пробел), которые будут использоваться для " "разделения тегов" #: ../quodlibet/qltk/prefs.py:579 msgid "Tags" msgstr "Теги" #: ../quodlibet/qltk/prefs.py:600 msgid "Updating for new ratings" msgstr "Обновление оценок" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "_Обновлять фонотеку при запуске" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Обновить фонотеку" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Проверить наличие изменений в фонотеке" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Пере_загрузить фонотеку" #: ../quodlibet/qltk/prefs.py:630 msgid "Reload all songs in your library. This can take a long time." msgstr "" "Перезагрузить все композиции в фонотеке. Это может занять много времени." #: ../quodlibet/qltk/prefs.py:640 msgid "Scan Directories" msgstr "Сканировать папки" #: ../quodlibet/qltk/prefs.py:646 msgid "Hidden Songs" msgstr "Скрытые композиции" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Свойства" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Очередь" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Удалить все композиции из очереди" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Случайно" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "По окончании списка воспроизведения начать его заново" #: ../quodlibet/qltk/quodlibetwindow.py:374 msgid "Playback Error" msgstr "Ошибка воспроизведения" #: ../quodlibet/qltk/quodlibetwindow.py:382 msgid "Set up library directories?" msgstr "Выбрать расположение фонотеки?" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Расположение фонотеки ещё не выбрано. Сделать это сейчас?" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "_Не сейчас" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "_Выбрать" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Не удалось добавить композиции" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s использует неподдерживаемый протокол." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Музыка" #: ../quodlibet/qltk/quodlibetwindow.py:803 msgid "_Add a Folder…" msgstr "Добавить _каталог…" #: ../quodlibet/qltk/quodlibetwindow.py:808 msgid "_Add a File…" msgstr "Добавить _файл…" #: ../quodlibet/qltk/quodlibetwindow.py:813 msgid "_Add a Location…" msgstr "Добавить _адрес…" #: ../quodlibet/qltk/quodlibetwindow.py:818 msgid "Open _Browser" msgstr "П_росмотр в новом окне" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Управление" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "Перейти _к воспроизводимой композиции" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Вид" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Справка" #: ../quodlibet/qltk/quodlibetwindow.py:876 msgid "Stop After This Song" msgstr "Остановиться после этой композиции" #: ../quodlibet/qltk/quodlibetwindow.py:882 msgid "Add Bookmark" msgstr "Добавить закладку" #: ../quodlibet/qltk/quodlibetwindow.py:888 msgid "Edit Bookmarks…" msgstr "Изменить закладки…" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Справка в сети" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Справка по поисковым запросам" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Список композиций" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Добавление адреса" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Введите адрес аудиофайла:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Не удалось добавить адрес" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, python-format msgid "%s is not a valid location." msgstr "%s не является корректным адресом." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Добавление музыки" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Следить за появлением новых файлов в этой папке" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Изменить оценку %d композиций?" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "Установленные оценки будут удалены" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Оценка всех композиций будет установлена в «%s»." #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "О_ценка" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Удалить оценку" #: ../quodlibet/qltk/ratingsmenu.py:76 msgid "_Remove rating" msgstr "_Удалить оценку" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "_Заменить пробел подчёркиванием" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Заменить _Windows-несовместимые символы" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "_Удалить диакритические знаки" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Заменить не-_ASCII символы" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "_Только строчные символы" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Переименовать файлы" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Сохранённые шаблоны" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 msgid "Edit saved patterns…" msgstr "Сохранённые шаблоны…" #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Предварительный просмотр" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Новое имя файла" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Не удалось переименовать файл" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "_Пропустить все ошибки" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Продолжить" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Неабсолютный путь" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "Композиции, расположенные в этих папках, будут добавлены в фонотеку" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "Выбор папок" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Сохранённые запросы" #: ../quodlibet/qltk/searchbar.py:50 msgid "Edit saved searches…" msgstr "Сохранённые запросы…" #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Найти" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" "Поиск по фонотеке (текст в свободной форме или поисковый запрос Quod Libet)" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "_Производить поиск по окончании ввода" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Производить поиск сразу после прекращения ввода." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Ограничение:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "По _оценкам" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Фильтровать по %s" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "_Все заголовки" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Д_орожка" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Альбом" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Люди" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Дата" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Файл" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Производство" #: ../quodlibet/qltk/songlist.py:1092 msgid "_Customize Headers…" msgstr "_Настроить заголовки…" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "_Расширять столбец" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 msgid "Play_lists" msgstr "_Списки воспроизведения" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Добавить в _очередь" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Копировать на устройство" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "Удалить из _фонотеки" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "_Заменить подчёркивание пробелом" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "З_аменить первую букву каждого слова заглавной" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "_Разделить на несколько значений" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Теги из имени файла" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Теги заменят существующие" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Теги будут добавлены к существующим" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 #, fuzzy msgid "Save" msgstr "Со_хранить" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Недопустимые теги" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Изменить внешний вид" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Номера дорожек" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Начинать с:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "Всего _дорожек:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Воспроизведение/Пауза" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Предыдущая композиция" #: ../quodlibet/qltk/views.py:803 #, python-format msgid "and %d more…" msgstr "и ещё %d…" #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Сохранение изменений." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Перемещение %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Список воспроизведения с названием «%s» уже существует." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "Внедрённые обложки" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "Показывает обложки, внедрённые в аудиофайлы." #: ../quodlibet/util/cover/built_in.py:41 msgid "Filesystem cover" msgstr "Обложки из отдельных файлов" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "D: " #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "W: " #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E: " #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Вывести краткую информацию об использовании" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Вывести версию и информацию об авторских правах" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[параметры]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Неопознанный параметр «%r»." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Для параметра «%r» требуется аргумент." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r — не уникальный префикс." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d Кбит/с" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунды" msgstr[2] "%d секунд" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d минута" msgstr[1] "%d минуты" msgstr[2] "%d минут" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d час" msgstr[1] "%d часа" msgstr[2] "%d часов" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d день" msgstr[1] "%d дня" msgstr[2] "%d дней" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "firstcapital" #: ../quodlibet/util/massagers.py:31 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Дата должна быть введена в формате 'ГГГГ', 'ГГГГ-ММ-ДД' или 'ГГГГ-ММ-ДД ЧЧ:" "ММ:СС'." #: ../quodlibet/util/massagers.py:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Значения усилений Replay Gain должны быть введены в формате «x.yy dB»." #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Значения пиков Replay Gain должны быть введены в формате «x.yy»." #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Статус выпуска MusicBrainz должен быть «official», «promotional», либо " "«bootleg»." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Не удалось изменить композицию" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Неверная кодировка]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "альбом" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "аранжировщик" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "аранжировщики" #: ../quodlibet/util/tags.py:72 msgid "arrangement" msgstr "аранжировка" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "автор" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "авторы" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "композитор" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "композиторы" #: ../quodlibet/util/tags.py:75 msgid "composition" msgstr "" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "дирижёр" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "дирижёры" #: ../quodlibet/util/tags.py:76 msgid "conducting" msgstr "дирижирование" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "контакты" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "авторское право" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "дата" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "описание" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "жанр" #: ../quodlibet/util/tags.py:81 msgid "genres" msgstr "жанры" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "классификация" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "язык" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "лицензия" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "место записи" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "автор слов" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "организация" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "название" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "версия" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "веб-сайт" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "автор обложки" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "ударов в минуту" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "раздел диска" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "диск" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "дорожка" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "ID издателя" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "дата первоначального выпуска" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "первоначальный альбом" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "первоначальный исполнитель" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "дата записи" #: ../quodlibet/util/tags.py:107 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:116 msgid "MusicBrainz recording ID" msgstr "MusicBrainz ID записи" #: ../quodlibet/util/tags.py:117 msgid "MusicBrainz release track ID" msgstr "MusicBrainz ID дорожки выпуска" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "MusicBrainz ID выпуска" #: ../quodlibet/util/tags.py:119 msgid "MusicBrainz artist ID" msgstr "MusicBrainz ID исполнителя" #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz release artist ID" msgstr "MusicBrainz ID исполнителя выпуска" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Статус альбома MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Тип альбома MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "усиление дорожки" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "пик дорожки" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "усиление альбома" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "пик альбома" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "эталонная громкость" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "диски" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "дорожки" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "запущено последний раз" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "полное имя" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "точка монтирования" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "люди" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "год" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "год первоначального выпуска" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "закладка" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "формат файла" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Списки воспроизведения" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "сортировка" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" 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 "Clear search" #~ msgstr "Очистить поле поиска" #~ 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 "ошибки" #~ msgid "lyricists" #~ 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.5.3/po/lt.po����������������������������������������������������������������������������0000644�0001750�0001750�00000501757�12646427551�015370� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "audio žymių redaktorius" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "aplankas" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "Pa_vadinimas" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Atlikėjas" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Žanras" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "Į_vertis" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Rikiuoti _pagal..." #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Nuostatos" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albumų sąrašas" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albumų sąrašas" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Visi albumai" #: ../quodlibet/browsers/albums/main.py:473 #, 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:640 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Dainos nėra albume" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, 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:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, 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:66 #, fuzzy msgid "An Example Album" msgstr "Visi albumai" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Albumų sąrašo nuostatos" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Rodyti albumų _viršelius" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Į paiešką įtraukti atlikėju_s" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[pasirinktys]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Albumo vaizdas" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Netaisyklingas šablonas" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Nežinoma" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Naujas kanalas" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Įveskite garso kanalo vietą:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio kanalai" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio kanalai" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Atsisiųsti" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Atsiųsti failus" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Atsiųsti failą" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Negalima pridėti kanalo" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Atnaujinti biblioteką" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Ištrinti failus" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "Nepavyko įkelti %s. Audio kanalų naršyklė išjungta." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Bibliotekos naršyklė" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, python-format msgid "Unknown %s" msgstr "Nežinoma (-s) %s" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "Kelios lauko %s reikšmės" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Individualus" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Žymė" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Sulieti" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Albumų sąrašo nuostatos" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Išjungti naršyklę" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Išjungti naršyklę" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Failų sistema" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Failų sistema" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Negalima kopijuoti dainų" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Pridėti į biblioteką" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Nepalaikomas failo tipas" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Negalima pridėti stoties" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Interneto radijas" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Atsiunčiamas stočių sąrašas" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nauja stotis" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Klasikinė" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Interneto radijas" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nauja stotis" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "_Atnaujinti stotis" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Visos stotys" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Mėgstamiausios" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Be kategorijos" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nerasta stočių" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Jokių Interneto radijo stočių nerasta %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Visos šios stotys jau yra Jūsų bibliotekoje." #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "Pridėti prie Mėgstamiausių" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Pašalinti iš Mėgstamiausių" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Įrenginio savybės" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Įrenginys:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Neprijungtas" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Prijungimo taškas:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Vardas:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Medijos įrenginiai" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Medijos įrenginiai" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "At_jungti" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Savybės" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "Per_vadinti" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nėra prijungtas." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopijuojama <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Negalima kopijuoti dainos" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Šiai dainai nepakanka laisvos vietos." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nepavyko nukopijuoti." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Negalima ištrinti dainų" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Nepavyko ištrinti <b>%(song)s</b>." #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "Nepavyko ištrinti „<b>%s</b>“." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Negalima ištrinti dainos" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Nepavyko atjungti <b>%s</b>." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Negalima atjungti įrenginio" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Langų naršyklė" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Langų naršyklė" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "P_asirinkti viską" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Viskas" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Langų naršyklės nuostatos" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Grojaraščiai" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Grojaraščiai" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Pašalinti iš grojaraščio" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importuoti" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Naujas grojaraštis" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Negalima importuoti grojaraščio" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Negalima pervadinti grojaraščio" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importuoti grojaraštį" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Naujas grojaraštis" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 msgid "Enter a name for the new playlist:" msgstr "Įveskite naujo grojaraščio pavadinimą:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nėra paleistas." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "muzikos biblioteka ir grotuvas" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[pasirinktis]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Parašyti dabar grojamos dainos pavadinimą ir išeiti" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Iškart pradėti groti" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Peršokti į kitą dainą" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Peršokti į praėjusią dainą" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Pradėti grojimą" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pristabdyti grojimą" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Perjungti grojimo/pauzės režimą" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Sustabdyti grojimą" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Pagarsinti" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Pritildyti" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Parašyti apie grotuvo būseną" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Slėpti pagrindinį langą" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Rodyti pagrindinį langą" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Perjungti pagrindinio lango matomumą" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Fokusuoti grojantį grotuvą" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Naikinti aktyvius naršyklių filtrus" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Atnaujinti biblioteką" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Išjungti naršyklę" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Parašyti dabartinį grojaraštį" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Parašyti eilės turinį" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Parašyti eilės turinį" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Paleisti be įskiepių" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nėra paleistas." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Išjungti Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Peršokti grojamoje dainoje" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Įjungti ar perjungti grojimo tvarką" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Išjungti/įjungti kartojimo veikseną" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Nustatyti garsumą" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Ieškoti jūsų garsų bibliotekoje" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "užklausa" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Groti failą" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "failo vardas" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Įvertinti grojamą dainą" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Nustatyti dabartinę naršyklę" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Atverti naują naršyklę" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Rodyti ar slepti eilę" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Rodyti ar slėpti pagrindinį dainų sąrašą" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtruoti pagal atsitiktinę reikšmę" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Žymė" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "žymė=reikšmė" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Pridėti į eilę failą ar užklausą" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Pridėti į eilę kableliu atskirtus failus" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "failo vardas" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Spausdinti užklausų rezultatų failų vardus į standartinę išvestį" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Pašalinti iš eilės failą ar užklausą" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Netaisyklingas „%s“ argumentas." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Pamėginkite „%s“ --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Nežinomas įrenginys" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "„%r“ nėra palaikomas įrenginys." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Nepavyko rasti %s." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Inicijuojama garso posistemė." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Bandoma '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Įrenginio posistemė inicijuota." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Neinicijuotas iPod grotuvas" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Ar norite sukurti tuščią duomenų bazę šiame iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Ga_rsumo derinimas (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopijuoti albumų _viršelius" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Sujungti žymes su keletu _reikšmių" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Pavadinime yra dainos versija" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Albumo pavadinime yra disko _dalis" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modelis:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Talpa:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Programinė įranga:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Šalinamas vienišas takelis iPod grotuve" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Negalima išsaugoti iPod duomenų bazės" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Negalima išsaugoti iPod duomenų bazės" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Nepavyko įkelti python-gpod, iPod palaikymas išjungtas." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Failo _vardo šablonas:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Šalinti nenaudojamus vi_ršelius bei aplankus" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "„MusicBrainz“ takelio ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Netaisyklinga koduotė]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Pa_vadinimas" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Garso žymių redaktorius" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Žymes pradėti iš _didžiosios raidės" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 #, fuzzy msgid "_Human title case" msgstr "Įjungti žmonėms tinkamą pavadinimų tvarkymą" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 #, fuzzy msgid "Advanced Preferences" msgstr "Langų naršyklės nuostatos" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Visas dydis:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Redaguoti rodymą" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Svoris" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Išvestis:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "Perž_iūra" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matinis" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matinis" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Regetonas" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rokas" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%.1f sekundė" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Individualus" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Valyti _klaidas" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Muzikos grotuvas" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Interneto radijas" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "vieta" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Slėpti pagrindinį langą" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Nuostatos" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Pa_vadinimas" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Įrenginys:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Vardas:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Kita:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Atlikėjas" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Failo _vardo šablonas:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Atsitiktinis a_lbumas" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albumai" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Svoris" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Atsitiktinis a_lbumas" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importuoti grojaraštį" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Negrojama" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d daina" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Kelio šablonai" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Negrojama" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Grojaraščiai" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Groti/Pristabdyti" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Ankstesnė" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Kita" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Tvarka:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Kartoti" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Po šios dainos sustabdyti" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Naršyti bibliotekoje" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "_Redaguoti žymes" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 #, fuzzy msgid "_Information" msgstr "Informacija" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Dainos žodžiai" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Dainos žodžiai" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "Perž_iūra" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtras _atlikėjui" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Numatytasis" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "Individualizuotas rikiavimas" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtras _žanrui" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtras _atlikėjui" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio kanalai" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Įveskite garso kanalo vietą:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Naujas grojaraštis" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Eilėje" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Niekada" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "takelio maks. garsumo lygis" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "Per_vadinti" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Biblioteka" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Derinimas" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Slėpti pagrindinį langą" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Failo vardas" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Negalima išsaugoti dainos" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Albumų viršeliai" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Dydis" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Paieška:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Ieškoti" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Albumų viršeliai" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "Redaguoti _žymes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "Redaguoti _žymes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Žymės" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Failo vardas" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Takelis" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Pa_vadinimas" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Atlikėjas" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nerasta priedų." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "ir %d daugiau..." msgstr[1] "ir %d daugiau..." msgstr[2] "ir %d daugiau..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "„MusicBrainz“ albumo tipas" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "užklausa" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Ieškoti" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "„MusicBrainz“ albumo tipas" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Išskaidyti diską iš _albumo" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Naršyklės" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Negalima sukurti aplanko" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Takelių sąrašas" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Laikas" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "P_asirinkti viską" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "žymė" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "Per_vadinti" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "žymė" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Netaisyklingas šablonas" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Netaisyklinga reikšmė" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "Individualizuotas rikiavimas" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Išjungti naršyklę" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtras _žanrui" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Eilėje" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Klaidos" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Įrašyti" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "„MusicBrainz“ takelio ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "aplankas" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Albumo režimas" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Įrašyti" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importuoti grojaraštį" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Klaida įkeliant %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "Per_vadinti" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Negalima išsaugoti dainos" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nerasta priedų." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Dainos žodžiai" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Dainos žodžiai" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Grojaraščiai" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Negalima importuoti grojaraščio" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Nepavyko atjungti <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Atnaujinti biblioteką" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d daina" msgstr[1] "%d dainos" msgstr[2] "%d dainų" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Atnaujinti biblioteką" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Redaguoti žymes" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Redaguoti žymes" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Visi albumai" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Ieškoti" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Kelio šablonai" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Redaguoti išsaugotas paieškos reikšmes..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Biblioteka" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Tikrinami prijungimo taškai" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Peržvelgiama biblioteka" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Peržvelgiama %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Rodyti su_generuotas programines žymes" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Per daug klaidų" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "aprašymas" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Reikšmė" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Garso žymių redaktorius" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nepasirinkta jokių dainų." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Nėra laiko informacijos" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Negalima pervadinti failo" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Failas" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Srautas" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Buferizuojama" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Nepavyko sukurti GStreamer išvesties." #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nerasta stočių" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Netaisyklinga GStreamer išvestis, bandoma naudoti numatytąją." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Negalima sukurti garso išvesties" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Nepavyko susieti GStreamer išvesties: '%s'" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Priedai" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Palaikomi formatai: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Garso įrenginys: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Pradžia" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Laikas" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Žymės vardas" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Žymės" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtrai" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "_Neseniai grota" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Neseniai _pridėta" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 _geriausių" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Visos stotys" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtras _žanrui" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtras _atlikėjui" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "FIltras a_lbumui" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Atsitiktinis žanras" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Atsitiktinis _atlikėjas" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Atsitiktinis a_lbumas" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Nėra laiko informacijos" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Reikšmė:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Išsaugotos reikšmės" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Redaguoti išsaugotas reikšmes..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Dainos" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Rodyti, kiek liko laiko" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_matinis" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "_Takelio režimas" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "_Albumo režimas" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Garsumo derinimas (Replay Gain)" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Nežinoma" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Įvyko klaida" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Failų" #: ../quodlibet/qltk/delete.py:59 #, 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:68 #, 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:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Ištrinti failus" #: ../quodlibet/qltk/delete.py:105 #, 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:114 #, 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Perkelti į šiukšlinę" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Perkeliama %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Nepavyko perkelti į šiukšlinę" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Nepavyko perkelti <b>%s</b> į šiukšlinę." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Ištrinama %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Negalima ištrinti failo" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Iš_skaidyti į keletą reikšmių" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Išskaidyti diską iš _albumo" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Išskaidyti _versiją iš pavadinimo" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Išskaidyti aranžuotoją iš a_tlikėjo" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Išskaidyti muzikantą iš atlikėjo" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "Išskaidyti _Muzikantą iš Pavadinimo žymės" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "Išskaidyti _Originalo atlikėją iš Pavadinimo žymės" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Pridėti žymę" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "Žy_mė:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Negalima pridėti žymės" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Negalima pridėti dainos" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Netaisyklinga žymė" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Netaisyklinga reikšmė" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Priedai" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso nuostatos" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "At_skirti ties:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Žymių redagavimas" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Aplankai" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Naujas aplankas" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Pasirinkti visus poaplankius" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Naujas aplankas" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Įveskite naujo aplanko vardą:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Negalima sukurti aplanko" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Negalima ištrinti aplanko" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "atliko %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Diskas %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Takelis %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nepasirinkta jokių dainų." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Nėra dainų" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informacija" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Dainos žodžiai" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "atlikėjas" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "atlikėjai" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "muzikantai" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Niekada" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "pridėta" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "paskutinį kartą grota" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "grota" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "praleista" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "įvertis" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "trukmė" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informacija" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Didėjančia tvarka" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitų dažnis" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "failo dydis" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "paskutinį kartą pakeista" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Prodiusavo %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "muzikantas" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Takelis neprieinamas" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Pasirinkta diskografija" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albumai" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Visa trukmė:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Visas dydis:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Failų" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Atsisiųsti" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nerasta dainos žodžių šiai dainai." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Ieškoma dainos žodžių..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Negalima atsiųsti dainos žodžių." #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 #, 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:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Atšaukti žymių pakeitimus?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Niekada" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Failas egzistuoja" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Pervadinti failus" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Aktyvios užduotys" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d užduotys vykdomos" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "Nežinoma" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Iš eilės" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "Iš _eilės" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Išmaišytai" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Išmaišytai" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Svertinai" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Svertinai" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Viena daina" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Viena daina" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Priedų klaidos" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Įjungta" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Išjungta" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Be kategorijos" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nerasta priedų." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Priedai" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Rodyti klaidas" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Diskas" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Takelio nr." #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "grupavimas" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bumas" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Failo _vardas" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "T_rukmė" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Dainų sąrašas" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Automatiškai peršokti prie grojamos dainos" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Elgsena" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Kita:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Redaguoti vaizdą..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Matomi stulpeliai" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Į paiešką įtraukti atlikėju_s" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Failo varde yra _aplanko vardas" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Nuostatos" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Matomi stulpeliai" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Naršyklės" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Bendras filtras:" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Ieškoti" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Patvirtinti su_dėtinius įverčius" #: ../quodlibet/qltk/prefs.py:256 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:259 msgid "Enable _one-click ratings" msgstr "Įjungti vien_o paspaudimo įverčius" #: ../quodlibet/qltk/prefs.py:261 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Įverčiai" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "Apvalinti miniatiūrų kamp_us" #: ../quodlibet/qltk/prefs.py:274 #, 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ų." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Pageidautina naudoti į_terptinius albumų viršelius" #: ../quodlibet/qltk/prefs.py:282 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:287 #, fuzzy msgid "_Fixed image filename:" msgstr "_Priverstinai naudotino paveikslėlio failo vardas:" #: ../quodlibet/qltk/prefs.py:289 #, 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:295 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:304 msgid "Album Art" msgstr "Albumų viršeliai" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Grojimas" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Išvesties sąranka" #: ../quodlibet/qltk/prefs.py:344 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:347 msgid "_Fall-back gain (dB):" msgstr "_Numatytasis derinimas (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 msgid "_Pre-amp gain (dB):" msgstr "_Pirminis derinimas (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "Įjungti Replay Gain garso d_erinimą" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Garsumo derinimas (Replay Gain)" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Numatytasis" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Įverčiai" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Saugoti įverčius bei grojimo _kartų vertes" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_El. paštas:" #: ../quodlibet/qltk/prefs.py:532 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:547 msgid "Auto-save tag changes" msgstr "Automatiškai išsaugoti žymių pakeitimus" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Skyriklių, naudojamų žymių reikšmių išskaidymui, sąrašas. Skyrikliai " "atskirti tarpais" #: ../quodlibet/qltk/prefs.py:579 msgid "Tags" msgstr "Žymės" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Atnaujinti stotis" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "At_naujinti biblioteką paleidus programą" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "At_naujinti biblioteką" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Ieškoti pasikeitimų bibliotekoje" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Iš naujo įkelti _biblioteką" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 msgid "Scan Directories" msgstr "Peržvelgiami aplankai" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Nėra dainų" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Savybės" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Eilė" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Iš eilės pašalinti visas dainas" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Atsitiktine tvarka" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Iš naujo pradėti grojaraštį jam pasibaigus" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Grojimas" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Pasirinkti aplankus" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Negalima pridėti dainų" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> naudoja nepalaikomą protokolą." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Muzika" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Pridėti aplanką..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Pridėti failą..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Pridėti vietą" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Atverti naują naršyklę" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Valdymas" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Peršokti ties grojama daina" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Rodymas" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Pagalba" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Po šios dainos sustabdyti" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Žymės" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "Redaguoti _žymes..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Pagalba Internete" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Paieškos bibliotekoje pagalba" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Dainų _sąrašas" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Pridėti vietą" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Įveskite garso failo vietą:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Negalima pridėti vietos" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nėra tinkama vieta." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Pridėti muziką" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Stebėti šį aplanką dėl naujų dainų" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 #, fuzzy msgid "The saved ratings will be removed" msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 #, fuzzy msgid "Change _Rating" msgstr "Į_vertis" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Pakeisti tarpus „_“ simboliu" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Pašalinti su _Windows nesuderinamus simbolius" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Pašalinti _diakritinius ženklus" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Pašalinti ne _ASCII simbolius" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Naudoti tik _mažąsias raides" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Pervadinti failus" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Kelio šablonai" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Redaguoti išsaugotus šablonus..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "Perž_iūra" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Naujas vardas" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Negalima pervadinti failo" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Ignoruoti vis_as klaidas" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Tęsti" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Kelias neabsoliutus" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 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:108 msgid "Select Directories" msgstr "Pasirinkti aplankus" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Išsaugotos paieškos reikšmės" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Redaguoti išsaugotas paieškos reikšmes..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Ieškoti" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Ieško_ti bevedant užklausą" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Rodyti paieškos rezultatus vartotojui baigus įvesti užklausą." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Riba:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Svoris" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtras laukui „%s“" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "_Visos antraštės" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Takelio antraštės" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Albumo antraštės" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "A_tlikėjų antraštės" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Dat_os antraštės" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Failo antraštės" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Produkcijos antraštės" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Individualizuoti antraštes..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Grojaraščiai" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Pridėti į _eilę" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopijuoti į įrenginį" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "_Pašalinti iš bibliotekos" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Pakeisti simbolius „_“ tarpo simboliais" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Žymes pradėti iš _didžiosios raidės" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Išskaidyti į keletą _reikšmių" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Žymės pagal kelią" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Žymės pakeičia jau esamas" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Žymės pridedamos prie esamų" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Netaisyklingos žymės" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Takelių numeriai" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Pradėti _nuo:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "Iš _viso takelių:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Groti/Pristabdyti" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Ankstesnė" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "ir %d daugiau..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Išsaugomos dainos, kurias pakeitėte." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Perkeliama %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Grojaraštis vardu %s jau egzistuoja." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Failų sistema" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "Der:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "Įsp:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "Kl:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Rodyti bendrą vartojimo informaciją" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Rodyti versijos numerį ir autorių teises" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[pasirinktys]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Pasirinkimas „%r“ neatpažintas." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Pasirinkimas „%r“ reikalauja argumento." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "„%r“ nėra unikalus priešdėlis." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, 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:380 #, 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:381 #, 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:382 #, 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:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "nereikia" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 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:102 msgid "Unable to edit song" msgstr "Negalima redaguoti dainos" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Netaisyklinga koduotė]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "albumas" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "aranžuotojas" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "aranžuotojai" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "aranžuotojas" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autorius" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autoriai" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "kompozitorius" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "kompozitoriai" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "kompozitorius" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dirigentas" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dirigentai" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "dirigentas" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontaktai" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "autorių teisės" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "aprašymas" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "žanras" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "žanras" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "grupavimas" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "kalba" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licencija" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "vieta" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "dainos ž. autorius" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organizacija" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "pavadinimas" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versija" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "tinklalapis" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "albumo atlikėjas" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "disko dalis" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "diskas" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "takelio nr." #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "leidinio ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "originalo išleidimo data" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "originalus albumas" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "originalus atlikėjas" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "įrašymo data" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "„MusicBrainz“ takelio ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "„MusicBrainz“ leidimo ID" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "„MusicBrainz“ leidimo ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "„MusicBrainz“ atlikėjo ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "„MusicBrainz“ leidimo ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "„MusicBrainz“ TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "„MusicIP“ PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "„MusicBrainz“ albumo statusas" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "„MusicBrainz“ albumo tipas" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "takelio garso lygis" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "takelio maks. garsumo lygis" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "albumo garso lygis" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "albumo maks. garsumo lygis" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "garsumo etalonas" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "diskai" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "takeliai" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "paskutinį kartą grota" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "pilnas vardas" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "prijungimo taškas" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "atlikėjai" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "metai" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "originalo išleidimo metai" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "žymė" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "failo formatas" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Grojaraščiai" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Išvalyti paiešką" #~ 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 "lyricists" #~ msgstr "dainos ž. autoriai" #~ 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.5.3/po/it.po����������������������������������������������������������������������������0000644�0001750�0001750�00000500634�12646427551�015356� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "un editor di tag audio" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "cartella" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Titolo" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Genere" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Giudizio" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Ordina _per:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Preferenze" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Lista degli Album" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Lista degli _Album" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Tutti gli Album" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:640 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Brani non in un album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d traccia" msgstr[1] "%d tracce" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d dischi" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Tutti gli Album" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Preferenze della lista album" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Mostra le _Cover degli album" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "La ricerca inline include le persone" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[opzioni]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Mostra Album" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Modello non valido" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Sconosciuto" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nuovo Feed" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Inserire la posizione di un feed audio." #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Feed Audio" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "Feed _Audio" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "S_carica" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Scarica i file" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Scarica il file" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Impossibile aggiungere il feed" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "A_ggiorna la Libreria" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Elimina i File" #: ../quodlibet/browsers/audiofeeds.py:501 #, fuzzy, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "Non posso importare il python-feedparser, il navigatore degli Audio Feed è " "disabilitato." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Esplora la Libreria" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Sconosciuto" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Separa in valori _multipli" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Personalizzato" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Rimuovi Stazione" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferenze della lista album" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Disattiva il Catalogo" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Disattiva il Catalogo" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Computer" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Computer" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Impossibile copiare i brani" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Aggiungi alla Libreria" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Tipo di file non supportato" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Impossibile aggiungere la stazione" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internet Radio" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Scarica i file" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nuova Stazione" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internet Radio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nuova Stazione" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Nuova Stazione" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Nuova Stazione" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 #, fuzzy msgid "No Category" msgstr "Nessuna categoria" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nessuna stazione trovata." #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nessuna stazione radio in %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Tutte le stazioni elencate sono già nella libreria." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "Metti in _Scaletta" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Rimuovi dalla Scaletta" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Proprietà del dispositivo" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Dispositivo:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Non montato" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Punto di mount:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nome:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Dispositivo multimediale" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "Dispositivo_Multimediale" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Espelli" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Proprietà" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Rinomina" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> non è connesso." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Sto copiando <b>%(song)s</b>." #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Impossibile copiare il brano" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Non c'è abbastanza spazio libero per questa canzone." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> non può essere copiato." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Impossibile eliminare i brani" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Elimino <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> non può essere eliminato." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Impossibile eliminare il brano" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Esplusione di <b>%s</b>fallita." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Impossibile espellere il dispositivo" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" "Nessun dispositivo di backend, il navigatore dei dispositivi multimediali è " "disabilitato." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Catalogo con Filtri" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Catalogo con Filtri" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "_Seleziona Tutto" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Tutti" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Preferenze del catalogo con filtri" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Scalette" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Scalette" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Rimuovi dalla Scaletta" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importa" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nuova Scaletta" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Impossibile importare la scaletta" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Impossibile rinominare la scaletta" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importa una scaletta" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Nuova Scaletta" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 msgid "Enter a name for the new playlist:" msgstr "Inserisci un nome per la nuova cartella:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet non è in esecuzione" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "una libreria musicale e player" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[opzione]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Mostra il brano in esecuzione ed esci" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Comincia a riprodurre immediatamente" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Salta al prossimo brano" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Salta al precedente brano" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Avvia l'esecuzione" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Metti in pausa" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Commuta play/pausa" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Avvia l'esecuzione" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Aumenta il volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Abbassa il volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Mostra lo stato attuale" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Nascondi la finestra" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Mostra la finestra" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Commuta la visibilità della finestra" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Dai il focus al riproduttore" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Rimuovi i filtri attivi dal navigatore" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Aggiorna e ricarica la libreria" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Disattiva il Catalogo" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Stampa la scaletta attuale" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Stampa il contenuto della coda" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Stampa il contenuto della coda" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet non è in esecuzione" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Chiudi Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Cerca nel brano in esecuzione" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Imposta o commuta l'ordine d'esecuzione" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Commuta o disattiva la ripetizione" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Imposta il volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Cerca nella libreria audio" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "ricerca" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Riproduci un brano" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "nome del file" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Dai un giudizio al brano in esecuzione" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Imposta il browser" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Apri un nuovo browser" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Mostra o nascondi la coda" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Mostra o nascondi la lista di brani" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtro su un valore casuale" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtro su un tag" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=valore" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Codifica un file o ricerca" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Accoda i file separati dalla virgola" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "nome del file" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Stampa i nomi dei file ottenuti dalla query sullo standard output" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Rimuovi dalla coda un file o una ricerca" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argomento non valido per '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Prova %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Dispositivo sconosciuto" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "'%r' non è un dispositivo supportato." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Non trovo libudev." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Annullo l'inizializzazione del dispositivo di backend." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Provo '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Backend del dispositivo inizializzato" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Inizializzazione di iPod annullata" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Vuoi creare un database vuoto su questo iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Volume (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copia le copertine degli _album" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combina i tag con valori _multipli" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Il Titolo include la _versione" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "L'album include il sottotitolo del _disco" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modello:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capienza:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Sto rimuovendo le tracce iPod orfane" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Non riesco a salvare il database iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Non riesco a salvare il database iPod" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Non posso importare python-gpod, il supporto a iPod è disabilitato." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Schema per il nome del file" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Rimuovi le immagini e le directory inutilizzate" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Codifica non valida]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Titolo" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor di tag audio" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Prima lettera maiuscola" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 #, fuzzy msgid "_Human title case" msgstr "Abilita un case del titolo _umano" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 #, fuzzy msgid "Advanced Preferences" msgstr "Preferenze del catalogo con filtri" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Dimensioni totali:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Modifica Display" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "In base al _Giudizio" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Output pipeline:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Modifica Display" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Anteprima" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matic" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matic" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d secondo" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Personalizzato" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Pulisci gli Errori" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Riproduttore" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internet Radio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "posizione" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Nascondi la finestra" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Preferenze" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Titolo" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "Nessuna nuova stazione" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "Nessuna nuova stazione" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Dispositivo:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nome:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "Altr_o:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Schema per il nome del file" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Al_bum casuale" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "album" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "In base al _Giudizio" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Al_bum casuale" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importa una scaletta" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Non in esecuzione" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d brano" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Modello del Percorso" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Modifica Display" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Non in esecuzione" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Scalette" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Player" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Anteprima" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "In _Ordine" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Ripeti" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Ferma dopo questo brano" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Esplora la Libreria" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Modifica _Tag" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informazioni" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Testi" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Testi" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Anteprima" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtro sull'_artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Personalizzato" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtro sul _genere" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtro sull'_artista" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Feed Audio" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Inserire la posizione di un feed audio." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Nuova Scaletta" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Accodato" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Mai" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "picco della traccia" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Rinomina" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Libreria" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Nascondi la finestra" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Nome del file" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Impossibile salvare il brano" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Lista degli Album" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Dimensioni" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Cerca:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Cerca" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Lista degli Album" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Modifica Segnalibri..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Modifica Segnalibri..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Segnalibri" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nome del file" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Traccia" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Titolo" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nessun plugin trovato." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "e altri %d ..." msgstr[1] "e altri %d ..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo di album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "ricerca" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Cerca" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo di album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Separa i dischi dell'_album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Catalogo" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Impossibile creare la cartella" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Lista delle Tracce" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Tempo" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "_Seleziona Tutto" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Rinomina" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Modello non valido" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Valore non valido" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Personalizzato" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Disattiva il Catalogo" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Modifica Display" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtro su un tag" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtro sul _genere" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Accodato" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Errori" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Scrivi" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "cartella" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Modalità _Album" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Scrivi" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importa una scaletta" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Errore mentre carico %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Rinomina" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Impossibile salvare il brano" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nessun plugin trovato." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Testi" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Testi" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Scalette" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Impossibile importare la scaletta" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "A_ggiorna la Libreria" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d brano" msgstr[1] "%d brani" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "A_ggiorna la Libreria" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Modifica Tag" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Modifica Tag" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Tutti gli Album" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Cerca" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Modello del Percorso" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Modifica le ricerche salvate..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Libreria" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Controllo i punti di mount" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Scansiono la libreria" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Scansiono %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostra _commenti" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Troppo errori" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "descrizione" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Valore" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor di tag audio" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nessun brano selezionato." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_Rimuovi Stazione" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "_Rimuovi Stazione" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtro su un tag" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtro su un tag" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Nessuna informazione sul tempo" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Impossibile rinominare il file" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "_Rimuovi Stazione" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "File" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nessuna stazione trovata." #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "GStreamer output pipeline invalido, provo con il default." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Impossibile creare l'uscita audio." #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Plugin" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Formati supportati: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Dispositivo audio: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Inizio" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Tempo" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Nome del Segnalibro" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Segnalibri" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtri" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "M_ai ascoltati" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Primi 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Nuova Stazione" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtro sul _genere" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtro sull'_artista" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtro sull'al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "_Genere casuale" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "_Artista casuale" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Al_bum casuale" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Nessuna informazione sul tempo" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Valore:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Valori salvati" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Modifica i valori salvati..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Brani" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Mostra il tempo rimanente" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_matic" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "Modalità _Traccia" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "Modalità _Album" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ripeti la Modifica al Volume di Uscita" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Sconosciuto" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtro su un tag" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "E' avvenuto un errore" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "File" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Elimina i File" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Sposta nel Cestino" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Sto spostando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Impossibile sposare nel cestino" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, 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:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Sto cancellando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Impossibile eliminare il file" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Separa in valori _multipli" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Separa i dischi dell'_album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Separa la _Versione dal titolo" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Separa l'arrangiatore dall'ar_tista" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Separa l'e_secutore dall'artista" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Separa l'e_secutore dall'artista" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Separa la _Versione dal titolo" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Aggiungi un Tag" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Impossibile aggiungere tag" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Impossibile aggiungere il brano" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Tag non valido" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Valore non valido" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Plugin" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Preferenze di Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Dividi _a:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Modifica dei Tag" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Cartelle" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Nuova Cartella" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Seleziona Tutte le Sottocartelle" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nuova Cartella" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Inserire un nome per la nuova cartella:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Impossibile creare la cartella" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Impossibile eliminare la cartella" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "di %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Traccia %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Modifica Display" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nessun brano selezionato." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Nessun Brano" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informazioni" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Testi" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artisti" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "esecutori" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Mai" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "aggiunto" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "ultimo passaggio" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "riproduzioni" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "saltato" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "giudizio" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "lunghezza" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informazioni" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Codifica non valida]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "dimensioni" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "modificato" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selezionato" msgstr[1] "%d selezionati" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Prodotto da %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "esecutore" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Traccia non disponibile" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Disografia Selezionata" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Lunghezza totale:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Dimensioni totali:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "File" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "S_carica" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nessun testo trovato per questo brano." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Ricerca di testo..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Impossibile scaricare i testi" #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Tralasciare le modifiche ai tag?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Mai" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Il file esiste" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Rinomina i File" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Operazioni attive" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d operazioni in esecuzione" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Sconosciuto" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "In Ordine" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_In Ordine" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Casuale" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Casuale" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "In base al Giudizio" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "In base al _Giudizio" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Un Brano" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Un Brano" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Errori dei plugin" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Attivo" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Disattivato" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Nessuna categoria" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nessun plugin trovato." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Plugin" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Mostra _Errori" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Traccia" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "raggruppamento" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Nome del _file" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Lunghezza" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Lista dei Brani" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Salta automaticamente al brano in esecuzione" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "Altr_o:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Modifica Display..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Colonne Visibili" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "La ricerca inline include le persone" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Il nome del file include la _cartella" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Preferenze" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Colonne Visibili" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Catalogo" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Filtro _Globale:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Cerca" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Conferma voti _multipli" #: ../quodlibet/qltk/prefs.py:256 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:259 msgid "Enable _one-click ratings" msgstr "Abilita voti con un click" #: ../quodlibet/qltk/prefs.py:261 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Giudizi" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Usa angoli arrotondati nelle anteprime" #: ../quodlibet/qltk/prefs.py:274 #, 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." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Lista degli Album" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Metti in pausa" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Output Log" #: ../quodlibet/qltk/prefs.py:344 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:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Volume di Fall-back (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Volume Pre-amp (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Abilita la possibilità di Ripetere la modifica al volume di Uscita" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Ripeti la Modifica al Volume di Uscita" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Giudizi" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Salva i giudizi e il _numero di riproduzioni" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Tralasciare le modifiche ai tag?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Modifica Tag" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Nuova Stazione" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "_Aggiorna il catalogo all'avvio" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "A_ggiorna la Libreria" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Controlla cambiamenti effettuati sulla libreria" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Ri_carica la Libreria" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Esamina le _Cartelle" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Nessun Brano" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Proprietà" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "Co_da" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Rimuovi tutti i brani dalla coda" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "Ca_suale" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Ricomincia la scaletta una volta finito" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Metti in pausa" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Selezionare le Cartelle" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Impossibile aggiungere i brani" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> usa un protocollo non supportato." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Musica" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Aggiungi una Cartella..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Aggiungi un File..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Aggiungi una Posizione" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Apri un nuovo browser" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "Con_trolli" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Salta al brano in esecuzione" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Visualizza" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "A_iuto" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Ferma dopo questo brano" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Segnalibri" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Modifica Segnalibri..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Cerca" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Lista dei Brani" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Aggiungi una Posizione" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Inserire la posizione di un file audio." #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Impossibile aggiungere la stazione" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> non è una posizione valida" #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Aggiungi Musica" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Controlla la presenza di nuovi brani in questa cartella" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Giudizio" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Rimuovi Stazione" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Rimuovi Stazione" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Sostituisci gli spazi con _underscore" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Elimina i caratteri incompatibili con _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Elimina i segni _diacritici" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Elimina i caratteri non-_ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Usa solo caratteri _minuscoli" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Rinomina i File" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Modello del Percorso" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Modifica i modelli salvati..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Anteprima" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nuovo Nome" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Impossibile rinominare il file" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Ignora _Tutti gli Errori" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Continua" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Il percorso non è assoluto" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Selezionare le Cartelle" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Ricerche Salvate" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Modifica le ricerche salvate..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Cerca" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Cerca dopo aver digitato" #: ../quodlibet/qltk/searchbar.py:122 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:177 msgid "_Limit:" msgstr "_Limita:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "In base al _Giudizio" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtro su %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Headers degli _Album" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Headers delle _Tracce" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Headers degli _Album" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Headers della _Gente" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Headers della _Data" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Headers dei _File" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Headers della _Produzione " #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizza gli Headers..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Scalette" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Metti in _Coda" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "Copia sul dispositivo" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Rimuovi dalla Scaletta" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Sostituisci _underscore con spazi" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Prima lettera maiuscola" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Separa in _valori multipli" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tag dal File" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "I tag rimpiazzano quelli esistenti" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "i tag sono aggiunti a quelli esistenti" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Tag non validi" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Modifica Display" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Numeri delle Tracce" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Parti _da:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Totale tracce:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Player" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Anteprima" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "e altri %d ..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Salvataggio dei brani modificati." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Sto spostando %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Esiste già una scaletta chiamata %s." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Computer" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "W: " #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "W: " #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E: " #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Mostra brevi informazioni sull'utilizzo" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Mostra versione e copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opzioni]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Opzione '%s' non riconosciuta." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "L'opzione '%s' richiede un argomento." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "'%s' non è un prefisso unico." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d secondo" msgstr[1] "%d secondi" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minuti" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d ora" msgstr[1] "%d ore" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d giorno" msgstr[1] "%d giorni" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Usare titoli maiuscoli?" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Impossibile modificare il brano" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Codifica non valida]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arrangiatore" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangiatori" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "arrangiatore" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autore" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "compositore" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "compositori" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "compositore" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "direttore" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "direttori" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "direttore" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contatto" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "descrizione" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "genere" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "genere" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "raggruppamento" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "lingua" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licenza" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "posizione" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "paroliere" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "etichetta discografica" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "titolo" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versione" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "sito web" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "artista dell'album" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "Sottotitolo" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "traccia" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "numero di catalogo" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "data d'uscita originale" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "album originale" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "artista originale" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "data di registrazione" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID MusicBrainz dell'artista" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "ID TRM MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Stato dell'album MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Tipo di album MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "volume della traccia" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "picco della traccia" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "volume dell'album" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "picco dell'album" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "volume di riferimento" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "dischi" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "tracce" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "ultima riproduzione" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "nome e percorso" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "Punto di mount" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "gente" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "anno" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "data d'uscita originale" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "segnalibri" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "formato file" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Scalette" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Pulisci la ricerca" #~ 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 "lyricists" #~ msgstr "parolieri" #~ 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.5.3/po/cs_CZ.po�������������������������������������������������������������������������0000644�0001750�0001750�00000471033�12646427551�015743� 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: 2016-01-16 12:54+0100\n" "PO-Revision-Date: 2013-04-18 22:07+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.5.4\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 "" #: ../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 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 "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Přehrávač hudby" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "editor tagů " #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "adresář" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Název" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Umělec" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Datum" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Žánr" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Hodnocení" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Seřadit podle:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Nastavení" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Seznam alb" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Seznam alb" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Všechna alba" #: ../quodlibet/browsers/albums/main.py:473 #, 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:640 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Skladby neobsažené v albu" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, 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:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, 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:66 #, fuzzy msgid "An Example Album" msgstr "Všechna alba" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Nastavení seznamu skladeb" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Zobrazovat _přebaly alb" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "_Hledání obsahuje osoby" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[možnosti]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Zobrazení alba" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Neplatné zadání" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Neznámé" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nový zdroj" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Zadejte umístění audio zdroje:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio zdroje" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio zdroje" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Stahování" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Stáhnout soubory" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Stáhnout soubor" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Nelze přidat zdroj" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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 být přidán. Buď může mít server problémy, nebo na tomto " "místě nemusí být žádný audio zdroj." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Obnovit sbírku" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Smazat soubory" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "Nelze importovat %s. Prohlížeč zdrojů zakázán." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Prohlížeč sbírky" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, python-format msgid "Unknown %s" msgstr "Neznámé %s" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "Více %s hodnot" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Vlastní" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Odstranění duplicit" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "sloučit" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Nastavení sbírky alb" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Zakázat prohlížeč" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Zakázat prohlížeč" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Systém souborů" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Systém souborů" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Nelze kopírovat skladby" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Přidat do sbírky" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Nepodporovaný formát souboru" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Nelze přidat stanici" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internetová rádia" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Stahování seznamu stanic" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nová stanice" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Klasická" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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 "_Aktualizace stanic" #: ../quodlibet/browsers/iradio.py:483 msgid "_Internet Radio" msgstr "_Internetová rádia" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nová stanice" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "_Aktualizace stanic" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Všechny stanice" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Oblíbené" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Žádná kategorie" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nenalezeny žádné stanice" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Na %s nebyly nalezeny žádné stanice." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Všechny stanice na seznamu jsou už ve sbírce." #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "Přidat do oblíbených" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Odstranit z oblíbených" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Vlastnosti zařízení" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Zařízení:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Není připojeno" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Přípojný bod:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Jméno:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Zařízení s médii" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Zařízení s médii" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Vysunout" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Vlastnosti" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Přejmenovat" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s je využito,%s</b> je k dispozici" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> není připojeno." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>Kopírování %(song)s </b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Skladbu nelze kopírovat" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Pro tuto skladbu již není dost místa." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nelze zkopírovat." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Skladby nelze smazat" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>Odstraňování %(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nelze odstranit." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Skladbu nelze smazat" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>Vysunutí %s</b> selhalo." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Zařízení nelze vysunout" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Prohlížeč s panely" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Prohlížeč s panely" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Vybrat _vše" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Vše" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Nastavení prohlížeče s panely" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Seznamy skladeb" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Seznamy skladeb" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Odstranit ze seznamu" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importovat" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nový seznam skladeb" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Seznam skladeb nelze importovat" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Seznam skladeb nelze přejmenovat" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importovat seznam skladeb" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Nový seznam skladeb" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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] "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?" #: ../quodlibet/browsers/playlists/menu.py:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 msgid "Enter a name for the new playlist:" msgstr "Zadejte jméno nového seznamu:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet neběží" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "hudební sbírka a přehrávač" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[volba]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Vypsat přehrávanou skladbu a skončit." #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Ihned začít přehrávat" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Další skladba" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Předchozí skladba" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Přehrávat" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pauza" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Prohodit režim přehrávání/pauza" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Přehrávat" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Zesílit hlasitost" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Snížit hlasitost" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Zobrazit stav přehrávače" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Skrýt hlavní okno" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Obnovit hlavní okno" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Přepnout viditelnost hlavního okna" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Zaměřit běžící přehrávač" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Odstranit aktivní fiiltry procházení" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Obnovit a znovu načíst sbírku" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Zakázat prohlížeč" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Zobrazit současný seznam skladeb" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Zobrazit obsah fronty" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Zobrazit obsah fronty" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Start bez zásuvných modulů" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet neběží" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Ukončit Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Vyhledávat v přehrávané skladbě" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ HH:] MM: SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Nastavit nebo přepnout pořadí přehrávání" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Vypnout/zapnout či přepnout opakování" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Nastavit hlasitost" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Procházet sbírku skladeb" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "dotaz" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Přehrát soubor" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "název souboru" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Ohodnotit přehrávanou skladbu" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Nastavit aktuální prohlížeč" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Otevřít nový prohlížeč" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Zobrazit nebo skrýt frontu" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Zobrazit nebo skrýt hlavní seznam skladeb" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filtr s náhodnou hodnotou" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filtr na hodnotu tagu" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=hodnota" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Zařadit do fronty soubor nebo dotaz" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Vyřadit z fronty soubory oddělené čárkou" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "název souboru" #: ../quodlibet/cli.py:135 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:137 msgid "Unqueue a file or query" msgstr "Vyřadit z fronty soubor nebo dotaz" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Neplatný argument pro '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Zkuste %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Neznámé zařízení" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r není podporované zařízení." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: %s nelze nalézt." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Načítání zařízení." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Zkoušení '%s'" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Nelze se připojit k obslužné aplikaci zařízení." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Zařízení načteno." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Nenačtený iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Chcete vytvořit pro tento iPod prázdnou databázi?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Úprava _Hlasitosti (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopírovat _obaly alb" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "_Kombinovat tagy s více hodnotami" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Název obsahuje _verzi" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Album obsahuje podnázev _disku" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Kapacita:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Odstraňování nezařazené skladby z iPodu" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Nelze uložit iPod dazabázi" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Nelze uložit iPod dazabázi" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Nelze importovat python-gpod, podpora iPodu zakázána." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Vzor názvu souborů:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Odstranit nepoužívané přebaly a adresáře" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID skladby na MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Neplatné kódování]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "_Název" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor tagů" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Tagy Kapitálkami" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Nastavení prohlížeče s panely" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Celková velikost" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Zobrazení alba" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Váha" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Výstupní roura:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Upravit zobrazení" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Náhled" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_maticky" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_maticky" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "Současná obslužná aplikace nepodporuje URL, prohlížeč audio zdrojů je " "zakázán." #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%.1f vteřin" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Vlastní" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Vyčistit Chyby" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Přehrávač hudby" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internetová rádia" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "místo" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Skrýt hlavní okno" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Nastavení" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "_Název" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Nelze se připojit k obslužné aplikaci zařízení." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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 "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Nelze se připojit k obslužné aplikaci zařízení." #: ../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:461 #, fuzzy msgid "_Service:" msgstr "Zařízení:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Jméno:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Ostatní:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Umělec" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Vzor názvu souborů:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Náhodné al_bum" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "alba" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Váha" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Náhodné al_bum" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importovat seznam skladeb" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importovat" #: ../quodlibet/ext/events/screensaver.py:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Nepřehrává se" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d skladba" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Vzory cesty" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Upravit zobrazení" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Nepřehrává se" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Seznamy skladeb" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Přehrávat/Pauza" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Předchozí" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Další" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Pořadí:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Opakovat" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Po této skladbě zastavit přehrávání" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Procházet sbírku" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Editovat _Tagy" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 #, fuzzy msgid "_Information" msgstr "Informace" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Texty" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Texty" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Soubory" #: ../quodlibet/ext/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Náhled" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filtrovat podle _Umělce" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Výchozí" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "Vlastní řazení" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filtrovat podle _Žánru" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filtrovat podle _Umělce" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio zdroje" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Zadejte umístění audio zdroje:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Odstranění duplicit" #: ../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] "Jste si jistí, že chcete odstranit %d duplikátní skladbu?" msgstr[1] "Jste si jistí, že chcete odstranit %d duplikátní skladbu?" msgstr[2] "Jste si jistí, že chcete odstranit %d duplikátní skladbu?" #: ../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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Nový seznam skladeb" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Zařazeno do fronty" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nikdy" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "nejvyšší hodnota u skladby" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Nelze se připojit k obslužné aplikaci zařízení." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Přejmenovat" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Sbírka" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Ladit" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Skrýt hlavní okno" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Název souboru" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Skladbu nelze uložit" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Přebaly alb" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Velikost" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Hledat:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Hledání" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Přebaly alb" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Upravit záložky..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Upravit záložky..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Záložky" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Název souboru" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Skladba" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "_Název" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "Umělec" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nebyly nalezeny žádné zásuvné moduly." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format 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..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Typ alba na MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "dotaz" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Hledání" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Typ alba na MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Oddělit disk od _Alba" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Prohlížeče" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Složku nelze vytvořit" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Seznam skladeb" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Čas" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Vybrat _vše" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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 více" msgstr[1] "%(title)s a %(count)d více" msgstr[2] "%(title)s a %(count)d více" #: ../quodlibet/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "příkaz | tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Přejmenovat" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "příkaz | tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Neplatné zadání" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Neplatná hodnota" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "Vlastní řazení" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Nelze kopírovat 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Zakázat prohlížeč" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Odstranění duplicit" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Odstranění duplicit" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Odstranění duplicit" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "Odstranění duplicit" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Upravit zobrazení" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Odstranění duplicit" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Odstranění duplicit" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Odstranění duplicit" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtr na hodnotu tagu" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Filtrovat podle _Žánru" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Zařazeno do fronty" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Chyby" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Zapsat" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID skladby na MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "adresář" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Režim alb" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Zapsat" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importovat seznam skladeb" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Chyba načítání %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Přejmenovat" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Skladbu nelze uložit" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nebyly nalezeny žádné zásuvné moduly." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Texty" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Texty" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Seznamy skladeb" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Seznam skladeb nelze importovat" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>Vysunutí %s</b> selhalo." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Obnovit sbírku" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d skladba" msgstr[1] "%d skladby" msgstr[2] "%d skladby" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Obnovit sbírku" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Upravit tagy" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Upravit tagy" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Všechna alba" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Hledání" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Vzory cesty" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Upravit uložené hodnoty..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Sbírka" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Kontrola přípojných bodů" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Načítání sbírky" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Načítání %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Ukázat _" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Příliš mnoho chyb." #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "popis" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Hodnota" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor tagů" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nejsou vybrány žádné skladby." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "Odstranění duplicit" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Odstranění duplicit" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filtr na hodnotu tagu" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filtr na hodnotu tagu" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Informace o čase nejsou dostupné" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Soubor nelze přejmenovat" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Odstranění duplicit" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Soubor" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, fuzzy msgid "Display help information" msgstr "Zobrazit stručné info o využ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> není platné umístění." #: ../quodlibet/player/gstbe/player.py:92 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Načítání do vyrovnávací paměti" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Nelze vytvořit výchozí rouru GStreameru." #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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 "" "Roura výstupu GStreameru používána pro přehrávání, jako např. 'alsasink " "device=default'. Nechte prázdné pro použití výchozí roury." #: ../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 "" #: ../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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nenalezeny žádné stanice" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Neplatná výstupní roura GStreameru, zkouším výchozí." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Nelze vytvořit audio výstup." #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Nemohu spojit rouru GStreameru: '%s'" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Zásuvné moduly" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Podporované formáty: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Zvukové zařízení: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Začátek" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Čas" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Název záložky" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Záložky" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtry" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "_Nedávno hrané" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Nedávno _Přidané" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Všechny stanice" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filtrovat podle _Žánru" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filtrovat podle _Umělce" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filtrovat podle alba" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Náhodný _Žánr" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Náhodný Umělec" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Náhodné al_bum" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Informace o čase nejsou dostupné" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Hodnota:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Upravit uložené hodnoty..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Skladby" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Zobrazit zbývající čas" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_maticky" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "_Režim skladeb" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "_Režim alb" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Úprava hlasitosti" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Neznámé" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filtr na hodnotu tagu" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Vyskytla se chyba" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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>%s</" "b>, může pomoci závadu odstranit. Prosíme, ohlašte ji na code.google.com 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>%s</b> s popisem, co jste právě dělali.\n" "\n" "Quod Libet může být nyní nestabilní. Doporučujeme aplikaci restartovat. " "Sbírka bude uložena." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Soubory" #: ../quodlibet/qltk/delete.py:59 #, fuzzy msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "Duplikátní skladby budou ze seznamu skladeb '%s' odstraněny." #: ../quodlibet/qltk/delete.py:68 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Duplikátní skladby budou ze seznamu skladeb '%s' odstraněny." #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Smazat soubory" #: ../quodlibet/qltk/delete.py:105 #, fuzzy msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "Duplikátní skladby budou ze seznamu skladeb '%s' odstraněny." #: ../quodlibet/qltk/delete.py:114 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "Duplikátní skladby budou ze seznamu skladeb '%s' odstraněny." #: ../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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Přesunout do koše" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Přesouvání %(current)d/%(total).d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Nelze přesunout do koše" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Přesunování <b>%s</b> do koše selhalo." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Mazání %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Soubor nezle smazat" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, fuzzy msgid "Deleting one or more files failed." msgstr "Mazání <b>%s</b> 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Rozdělit do _Více položek" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Oddělit disk od _Alba" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Oddělit _Verzi od názvu" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Oddělit aranžmá od Umělce" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Oddělit _Interpreta od umělce" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "Oddělit _Interpreta od názvu" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "Oddalit _Původního umělce od názvu" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Přidat tag" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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 #, 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:657 msgid "Unable to add tag" msgstr "Tag nelze přidat" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Nelze přidat skladbu" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Nelze přidat <b>%s</b>\n" "\n" "Vybrané soubory nepodporují zadávání více položek." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Neplatný tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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" "Vybrané soubory nepodporují označení tímto tagem." #: ../quodlibet/qltk/edittags.py:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Neplatná hodnota" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Neplatná hodnota: <b>%(value)s</b>\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 #, 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> se za běhu programu změnily. Uložení bez obnovení sbírky (refresh) " "by mohlo přepsat jiné změny.\n" "\n" "Přesto skladbu uložit?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Skladbu nelze uložit" #: ../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 "" "Ukládání <b>%s</b> selhalo. Soubor může být jen pro čtení, poškozený, nebo " "nemáte právo ho měnit." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Více možností..." #: ../quodlibet/qltk/entry.py:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Zásuvné moduly" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Nastavení Ex Falsa" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Rozdělit _v:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Úprava tagů" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Složky" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Nová složka" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Vybrat všechny podsložky" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nová složka" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Jméno nové složky:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Složku nelze vytvořit" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Složku nelze smazat" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "podle %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Skladba %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Upravit zobrazení" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nejsou vybrány žádné skladby." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Žádné skladby." #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informace" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Texty" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "umělec" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "umělci" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "interpreti" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nikdy" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "přidáno" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "naposledy hrané" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "přehrání" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "přeskočení" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "hodnocení" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "délka" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informace" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Stoupání" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "velikost souboru" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "naposledy změněno" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Vydáno %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "interpret" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Skladba je nedostupná" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Vybraná diskografie" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "alba" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Celková delka:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Celková velikost" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Soubory" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Stahování" #: ../quodlibet/qltk/lyrics.py:37 #, fuzzy msgid "_Edit" msgstr "_Upravit zobrazení..." #. 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ke skladbě nebyly nalezeny žádné texty." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Hledání textů skladby..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Nelze stáhnout texty skladby." #: ../quodlibet/qltk/maskedbox.py:19 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "Jste si jistí, že chcete odstranit %d duplikátní skladbu?" #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "Duplikátní skladby budou ze seznamu skladeb '%s' odstraněny." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Zahodit změny v tagu?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nikdy" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Soubor existuje" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Přejmenovat soubory" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Aktivní úlohy" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d úlohy běží" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Neznámé" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "V pořadí" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_V pořadí" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Zamíchat" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Promíchat" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Vyváženo" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Vyváženo" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Jedna skladba" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Jedna skladba" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Chyby zásuvného modulu" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Povoleno" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Zakázáno" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Žádná kategorie" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nebyly nalezeny žádné zásuvné moduly." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Zásuvné moduly" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Ukázat _Chyby" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Skladba" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "slučování" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Název souboru" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Délka" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Seznam skladeb" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Rovnou automaticky přehrávat skladbu" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Chování" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Ostatní:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Upravit zobrazení..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Viditelné položky" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "_Hledání obsahuje osoby" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Název souboru obsahuje_složku" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Nastavení" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Viditelné položky" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Prohlížeče" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globální filtr:" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Hledání" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Potvrdit _hromadné hodnocení" #: ../quodlibet/qltk/prefs.py:256 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:259 msgid "Enable _one-click ratings" msgstr "Povolit hodnocení _jedním klikem" #: ../quodlibet/qltk/prefs.py:261 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Hodnocení" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Použít v náhledech zaoblené rohy" #: ../quodlibet/qltk/prefs.py:274 #, 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." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Upřednostnit _vložené grafiky alb" #: ../quodlibet/qltk/prefs.py:282 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:287 #, fuzzy msgid "_Fixed image filename:" msgstr "_Vynucený název souboru obrázku:" #: ../quodlibet/qltk/prefs.py:289 #, fuzzy msgid "The single image filename to use if selected" msgstr "Použít soubor grafiky alba vynuceně" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Použít soubor grafiky alba vynuceně" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Přebaly alb" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Přehrávání" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Nastavení výstupu" #: ../quodlibet/qltk/prefs.py:344 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:347 msgid "_Fall-back gain (dB):" msgstr "_Vyrovnání hlasitosti (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 msgid "_Pre-amp gain (dB):" msgstr "_Předzesílení (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Povolit úpravu hlasitosti" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Úprava hlasitosti" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Výchozí" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Hodnocení" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Uložit hodnocení a _počet přehrání" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:532 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:547 msgid "Auto-save tag changes" msgstr "Automaticky ukládat změny tagů" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. 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:579 msgid "Tags" msgstr "Tagy" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Aktualizace stanic" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "_Obnovit sbírku při startu" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Obnovit sbírku" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Zkontrolovat změny ve sbírce" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Znovu načíst sbírku" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Znovu načíst všechny skladby ve sbírce (to může trvat dost dlouho)" #: ../quodlibet/qltk/prefs.py:640 msgid "Scan Directories" msgstr "Pohledávat adresáře" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Žádné skladby." #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Vlastnosti" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Fronta" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Odstranit všechny skladby z fronty" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Náhodně" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Začít znovu přehrávat po přehrání seznamu skladeb" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Přehrávání" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Vybrané adresáře" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Nelze přidat skladby" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> používá nepodporovaný protokol." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Hudba" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Přidat složku..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Přidat soubor..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Přidat umístění" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Otevřít nový prohlížeč" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Ovládání" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Skočit na přehrávanou skladbu" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Zobrazení" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Pomoc" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Po této skladbě zastavit přehrávání" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Záložky" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Upravit záložky..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Online pomoc" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Hledat pomoc" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Se_znam skladeb" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Přidat umístění" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Zadejte umístění zvukového souboru:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Umístění nelze přidat" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> není platné umístění." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Přidat hudbu" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Hledat ve složce nové skladby" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 #, fuzzy msgid "The saved ratings will be removed" msgstr "Duplikátní skladby budou ze seznamu skladeb '%s' odstraněny." #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 #, fuzzy msgid "Change _Rating" msgstr "_Hodnocení" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "Odstranění duplicit" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "Odstranění duplicit" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Nahradit mezery _podtržítky" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Nahradit znaky nekompatibilní s _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Nahradit _diakritiku" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Nahradit ne-_ASCII znaky" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Použít jen _malá písmena" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Přejmenovat soubory" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Vzory cesty" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Upravit uložené hodnoty..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Náhled" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nový název" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Soubor nelze přejmenovat" #: ../quodlibet/qltk/renamefiles.py:253 #, 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 "" "Přejmenovávání <b>%s</b> na <b>%s</b> selhalo. Cílový soubor už možná " "existuje, nebo nemáte práve soubory vytvářet a měnit. " #: ../quodlibet/qltk/renamefiles.py:261 msgid "Ignore _All Errors" msgstr "Ignorovat _všechny chyby" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Pokračovat" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Uvedená cesta není absolutní" #: ../quodlibet/qltk/renamefiles.py:294 #, 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<b>%s</b>\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:41 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:108 msgid "Select Directories" msgstr "Vybrané adresáře" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Upravit uložené hodnoty..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Hledání" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Hledat po _psaní" #: ../quodlibet/qltk/searchbar.py:122 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:177 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Váha" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filtr na %s" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "Všechny _Hlavičky" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Hlavičky _Skladeb" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Hlavičky _Alb" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Hlavičky _Lidí" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Hlavičky _Dat" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Hlavičky _Souborů" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Hlavičky _Produkce" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Upravit hlavičky..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Seznamy skladeb" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Přidat do _Fronty" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopírovat do zařízení" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "_Odstranit ze seznamu" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Nahradit _podtržítka mezerami" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Tagy Kapitálkami" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Rozdělit do více _hodnot" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tagy z cesty" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Nahradit existující tagy" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tagy jsou přidány k již existujícím" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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<b>%s</b>\n" "je neplatný. Možná obsahuje duplicitní tag nebo nemá uzavřené závorky " "(< / >)." #: ../quodlibet/qltk/tagsfrompath.py:213 msgid "Invalid tags" msgstr "Neplatné tagy" #: ../quodlibet/qltk/tagsfrompath.py:214 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Neplatné tagy <b>%s</b>\n" "\n" "Vybrané položky nepodporují vkládání těchto tagů." #: ../quodlibet/qltk/textedit.py:138 #, 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:154 msgid "Edit Display" msgstr "Upravit zobrazení" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Čísla skladeb" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Začít _od:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Celkem skladeb:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Přehrávat/Pauza" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Předchozí" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "a %d více..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Ukládání změněných skladeb." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Přesouvání %(current)d/%(total).d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Seznam skladeb s názvem %s již existuje." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Systém souborů" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "D:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "W:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Zobrazit stručné info o využití" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Zobrazit verzi a copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[možnosti]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Volba %r nerozpoznána." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Volba %r vyžaduje parametry." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r není jedinečný prefix." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, 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:380 #, 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:381 #, 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:382 #, 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:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "kontrola|první velké" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "Status MusicBrainz musí být 'official', 'promotional', nebo 'bootleg'." #: ../quodlibet/util/massagers.py:113 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:102 msgid "Unable to edit song" msgstr "Skladbu nelze upravit" #: ../quodlibet/util/songwrapper.py:103 #, 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í <b>%s</b> selhalo. Soubor může být jen pro čtení, poškozený, nebo " "nemáte právo ho měnit." #: ../quodlibet/util/string/__init__.py:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Neplatné kódování]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "aranžmá" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "aranžmá" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "aranžmá" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autoři" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "skladatel" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "skladatelé" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "skladatel" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dirigenti" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "dirigent" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "rok" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "popis" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "žánr" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "žánr" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "slučování" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "jazyk" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "místo" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "texty" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organizace" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "název" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "verze" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "webová stránka" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "umělec alba" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "podnázev disku" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "skladba" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "ID labelu" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "datum původního vydání" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "původní album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "původní umělec" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "datum nahrávání" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID skladby na MusicBrainz" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID vydání na MusicBrainz" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "ID vydání na MusicBrainz" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID umělce na MusicBrainz" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID vydání na MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "ID TRM na MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "PUID MusicIP" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Status alba na MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Typ alba na MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "úprava hlasitosti skladby" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "nejvyšší hodnota u skladby" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "úprava hlasitosti alba" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "nejvyšší hodnota u alba" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "určující hlasitost" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "disky" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "skladby" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "poslední start" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "celé jméno" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "přípojný bod" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "lidé" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "rok" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "rok původního vydání" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "záložka" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "formát souboru" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Seznamy skladeb" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Vyčistit hledání" #~ 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 "lyricists" #~ msgstr "textaři" #~ 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.5.3/po/zh_CN.po�������������������������������������������������������������������������0000644�0001750�0001750�00000440542�12646427552�015745� 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: 2016-01-16 12:54+0100\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 "音乐播放器" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "音频标签编辑器" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "目录" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "标题" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "歌手(_A)" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "日期(_D)" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "流派" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "评分(_R)" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "按日期排序" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "专辑列表" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "专辑列表(_A)" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "所有专辑" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "显示专辑封面(_C)" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "不在专辑里的曲目" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d 音轨" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d 唱片" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "所有专辑" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "专辑列表首选项" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "显示专辑封面(_C)" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[选项]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "专辑显示" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "非法参数" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "未知" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "新的源" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "输入音频源的位置:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 #, fuzzy msgid "Audio Feeds" msgstr "音频设备:%s" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "下载(_D)" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "下载文件" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "下载文件" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "无法加入源" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "刷新库(_F)" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "删除文件" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "库浏览器" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "未知" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "自定义(_C)" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "删除站点(_R)" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "标签" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "专辑列表首选项" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "关掉浏览器" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "关掉浏览器" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "文件系统" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "文件系统(_F)" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "无法复制曲目" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "被选定的文件无法被复制到其它曲目列表或队列。" #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "加入到库(_A)" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "不支持的文件类型" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "无法加入站点" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "网上广播" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "下载文件" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "新站点" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "网上广播(_I)" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "新站点" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "新站点(_N)" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "新站点" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "没有发现站点" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "没有发现网上广播站点 %s" #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "所有列出的站点都已经在您的库里。" #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "加入到播放列表(_A)" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "从播放列表里删除(_R)" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "" #: ../quodlibet/browsers/media.py:34 #, fuzzy msgid "Device Properties" msgstr "属性" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "挂载点" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "名字(_N):" #: ../quodlibet/browsers/media.py:133 #, fuzzy msgid "Media Devices" msgstr "音频设备:%s" #: ../quodlibet/browsers/media.py:134 #, fuzzy msgid "_Media Devices" msgstr "音频设备:%s" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 #, fuzzy msgid "_Eject" msgstr "选择(_S)" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "属性" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "重命名(_R)" #: ../quodlibet/browsers/media.py:459 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 #, fuzzy msgid "Unable to copy song" msgstr "无法复制曲目" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/browsers/media.py:543 #, fuzzy msgid "Unable to delete songs" msgstr "无法添加曲目信息" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/browsers/media.py:577 #, fuzzy msgid "Unable to delete song" msgstr "无法编辑曲目" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/browsers/media.py:595 #, fuzzy msgid "Unable to eject device" msgstr "无法删除文件" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 #, fuzzy msgid "Paned Browser" msgstr "关掉浏览器" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "全选(_A)" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "所有" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "播放列表" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "播放列表(_P)" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "从播放列表里删除(_R)" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "导入(_I)" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "新播放列表" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "无法导入播放列表" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet 只能导入 M3U 或者 PLS 格式的播放列表" #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "无法重命名播放列表" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "导入播放列表" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "新播放列表(_N)" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" #: ../quodlibet/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "输入新文件夹的名字:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet 没有在运行。" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "音乐库和播放器" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[选项]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "显示正在播放的曲目并退出" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "立即开始播放" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "跳到下一首曲目" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "跳到前一首曲目" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "开放回放" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "暂停回放" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "切换播放/暂停模式" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "开放回放" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "加大音量" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "减小音量" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "显示播放器状态" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "隐藏主窗口" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "显示主窗口" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "切换主窗口可见性" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "焦点移到运行中的播放器" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "刷新库(_F)" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "关掉浏览器" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "显示当前播放列表" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "显示队列内容" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "显示队列内容" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet 没有在运行。" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "退出 Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "在正在播放的曲目中定位" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "设定或切换回放顺序" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "开、关或切换重复播放" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "设定音量" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "搜索您的音频库" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "查询" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "播放文件" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "文件名" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "评估正在播放的曲目" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "设定当前浏览器" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "打开新的浏览器" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "显示或隐藏队列" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "显示或隐藏主曲目列表" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "以随机值过滤" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "标签" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "以标签值过滤" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "文件名" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "错误:%s 的非法参数。" #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "错误:试试 %s --help。" #: ../quodlibet/devices/_base.py:63 #, fuzzy msgid "Unknown Device" msgstr "未知" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, python-format msgid "%r is not a supported device." msgstr "" #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "非法的值" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "显示专辑封面(_C)" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "标题包含版本(_V)" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "专辑包含部分(_P)" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "无法保存库" #: ../quodlibet/devices/ipod.py:313 #, fuzzy msgid "Unable to save iPod database" msgstr "无法保存库" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "文件名(_F)" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[非法编码]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "标题" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "音频标签编辑器" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "标题大小写标签(_T)" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "总大小:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "编辑显示" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "权重(_W)" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "编辑显示" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "预览(_P)" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d 秒" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "自定义(_C)" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "插件错误" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "音乐播放器" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "网上广播" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "位置" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "隐藏主窗口" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "标题" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "没有新的站点" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "没有新的站点" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 msgid "_Service:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "名字(_N):" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "其它(_O):" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "歌手(_A)" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "文件名(_F)" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "随机专辑(_B)" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "专辑" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "权重(_W)" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "随机专辑(_B)" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "导入播放列表" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 msgid "Playing:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "No song:" msgstr "" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "参数" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "编辑显示" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "系统托盘图标首选项" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "播放列表(_P)" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "播放器" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "预览(_P)" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "播放次序(_O)" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "重复(_R)" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "这首曲目放完后就停止" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "浏览库(_B)" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "编辑标签(_T)" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "信息(_I)" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "歌词" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "歌词" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "预览(_P)" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "以歌手过滤(_A)" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "自定义(_C)" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "以流派过滤(_G)" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "以歌手过滤(_A)" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "音频设备:%s" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "输入音频源的位置:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "新播放列表" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "队列(_Q)" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "从来没有" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "音轨号" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "重命名(_R)" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "库" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "隐藏主窗口" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "文件名" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "无法保存曲目" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "专辑列表" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "大小" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "搜索(_S):" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "搜索" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "专辑列表" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "编辑书签(_E)..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "编辑书签(_E)..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "书签" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "文件名" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "音轨" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "标题" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "歌手(_A)" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "没有找到插件。" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "" #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz 专辑 ID" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "查询" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "搜索" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz 专辑 ID" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 msgid "Split _disc from album" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "浏览器" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "无法创建文件夹" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "音轨列表" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "时间" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "全选(_A)" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, python-format msgid "%(title)s and %(count)d more…" msgid_plural "%(title)s and %(count)d more…" msgstr[0] "" #: ../quodlibet/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "重命名(_R)" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "文件名" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "非法参数" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "非法的值" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "自定义(_C)" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "关掉浏览器" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "编辑显示" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "以标签值过滤" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer 无法导入选定的曲目。" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "以流派过滤(_G)" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "队列(_Q)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "显示错误(_E)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "写入" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "目录" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "专辑列表(_A)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "写入" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "导入播放列表" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "重命名(_R)" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "无法保存曲目" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "没有找到插件。" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "歌词" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "歌词" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "播放列表" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "无法导入播放列表" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "删除 <b>%s</b> 失败。" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "刷新库(_F)" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "刷新库(_F)" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "编辑标签" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "编辑标签" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "所有专辑" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "搜索" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "参数" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "编辑已保存的值..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "库" #: ../quodlibet/library/libraries.py:657 #, fuzzy msgid "Checking mount points" msgstr "挂载点" #: ../quodlibet/library/libraries.py:667 #, fuzzy msgid "Scanning library" msgstr "已导入曲目库。" #: ../quodlibet/library/libraries.py:722 #, fuzzy, python-format msgid "Scanning %s" msgstr "正在检查 %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 msgid "Also list programmatic tags" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "描述" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "值" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "音频标签编辑器" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "没有选中曲目。" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "删除站点(_R)" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "删除站点(_R)" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "以标签值过滤" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "以标签值过滤" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "没有时间信息" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "无法重命名文件" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "删除站点(_R)" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "文件" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "没有发现站点" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "无法创建文件夹" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "插件(_P)" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "支持的格式: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "音频设备:%s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "开头" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "无" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "时间" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "书签名" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "书签" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "过滤器(_F)" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "从来没有播放过(_N)" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "前40(_T)" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "新站点" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "以流派过滤(_G)" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "以歌手过滤(_A)" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "以专辑过滤(_B)" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "随机流派(_G)" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "随机歌手(_A)" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "随机专辑(_B)" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "40首您播放得最多的歌(如果有绑定的话,可能会多于40首)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "没有时间信息" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "值(_V):" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "已保存值" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "编辑已保存的值..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "曲目" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "显示剩下的时间" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "音轨号" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "专辑列表(_A)" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "无音量调整" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "未知" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "以标签值过滤" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "文件" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:90 #, fuzzy msgid "_Delete Files" msgstr "删除文件" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "移到回收站(_M)" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "正在移动 %d/%d" #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "无法保存库" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "正在删除 %d/%d" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "无法删除文件" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "增加一个标签" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "标签(_T):" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "无法增加标签" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "无法添加曲目" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "非法标签" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "非法的值" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "插件(_P)" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "标签编辑" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "文件夹" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "新文件夹" #: ../quodlibet/qltk/filesel.py:230 #, fuzzy msgid "_Select All Subfolders" msgstr "全选(_A)" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "新文件夹" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "输入新文件夹的名字:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "无法创建文件夹" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "无法删除文件夹" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "唱片 %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "音轨 %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "编辑显示" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "没有选中曲目。" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "没有曲目" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "信息" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "歌词" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "歌手" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "歌手" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "演员" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "从来没有" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 时间" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "加入" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "最近一次播放" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "评分" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "长度" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "信息" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[非法编码]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "比特率" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "文件大小" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "修改" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d 选中" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "%s 制造" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "表演" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "音轨不可用" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d 首曲目没有专辑信息" #: ../quodlibet/qltk/information.py:490 msgid "Selected Discography" msgstr "" #: ../quodlibet/qltk/information.py:543 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "" #: ../quodlibet/qltk/information.py:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "专辑" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "总长度:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "总大小:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "文件" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "下载(_D)" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "" #: ../quodlibet/qltk/lyrics.py:78 msgid "Searching for lyrics…" msgstr "" #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "从来没有" #: ../quodlibet/qltk/msg.py:85 #, fuzzy msgid "File exists" msgstr "文件系统" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "重命名文件" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "未知" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "顺序" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "顺序(_I)" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Shuffle" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "权重" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "权重(_W)" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "单曲" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "单曲(_O)" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "插件错误" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "关掉浏览器" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "没有找到插件。" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "插件(_P)" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "显示错误(_E)" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "唱片(_D)" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "音轨(_T)" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "组合" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "专辑(_B)" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "文件名(_F)" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "长度(_L)" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "曲目列表" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "自动跳到正在播放的曲目" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "当正在播放的曲目改变的时候,在曲目列表里相应跳过去" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "其它(_O):" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "编辑书签(_E)..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "可见的栏" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "标题包含版本(_V)" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "文件名包含文件夹(_F)" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "可见的栏" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "浏览器" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "全局过滤器:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "搜索" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "当正在播放的曲目改变的时候,在曲目列表里相应跳过去" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "评分(_R)" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "专辑列表" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "暂停回放" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "无音量调整" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "无音量调整" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "评分(_R)" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "Auto-save tag changes" msgstr "" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "编辑标签" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "新站点(_N)" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "刷新库(_F)" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "刷新库(_F)" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "检查您的库的更改" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "重新导入库(_L)" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "重新导入您的库里的所有曲目(可能会花费较长时间)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "扫描目录(_D)" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "没有曲目" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "属性" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "队列(_Q)" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "删除队列里的所有曲目" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "随机(_R)" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "完成后重新开始播放列表" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "暂停回放" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "选择目录" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "无法添加曲目信息" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b>使用不支持的协议。" #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "音乐(_M)" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "加入文件夹(_A)..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "加入文件(_A)..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "打开新的浏览器" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "控制(_C)" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "跳到正在播放的曲目(_J)" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "查看(_V)" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "帮助(_H)" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "这首曲目放完后就停止" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "书签" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "编辑书签(_E)..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "搜索" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "曲目列表(_L)" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "输入音频文件的位置:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "无法添加位置" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "添加音乐" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "监视这个文件夹的新曲目" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "评分(_R)" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "删除站点(_R)" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "删除站点(_R)" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "重命名文件" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "参数" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "编辑已保存的值..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "预览(_P)" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "新的名字" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "无法重命名文件" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "显示错误(_E)" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "继续(_C)" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "路径不是绝对的" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "这些文件夹里的曲目(由“:”分隔)将会被加入到您的库里" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "选择目录" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "已保存值" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "编辑已保存的值..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "搜索" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "这首曲目放完后就停止" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "限制(_L):" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "权重(_W)" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "以 %s 过滤(_F)" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "专辑列表(_A)" #: ../quodlibet/qltk/songlist.py:1072 #, fuzzy msgid "_Track Headers" msgstr "音轨号" #: ../quodlibet/qltk/songlist.py:1073 #, fuzzy msgid "_Album Headers" msgstr "专辑列表(_A)" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1076 #, fuzzy msgid "_File Headers" msgstr "过滤器(_F)" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "过滤器(_F)" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "播放列表" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "加入到队列(_Q)" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "从播放列表里删除(_R)" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "用空格替换下划线(_U)" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "标题大小写标签(_T)" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "非法标签" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "编辑显示" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "音轨号" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "开始于(_M):" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "总音轨数:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "播放器" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "预览(_P)" #: ../quodlibet/qltk/views.py:803 #, python-format msgid "and %d more…" msgstr "" #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "正在保存改变过的曲目。" #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "正在移动 %d/%d" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "名为 %s 的播放列表已经存在" #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "文件系统" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "显示版本和版权" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[选项]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "" #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "" #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "" #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d 秒" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d 分" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d 小时" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d 天" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "标题" #: ../quodlibet/util/massagers.py:31 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" #: ../quodlibet/util/massagers.py:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "无法编辑曲目" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[非法编码]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "专辑" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "" #: ../quodlibet/util/tags.py:72 msgid "arrangement" msgstr "" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "作者" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "作者" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "作曲" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "作曲" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "作曲" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "执导" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "执导" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "执导" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "版权" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "日期" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "描述" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "流派" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "流派" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "组合" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "语言" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "许可" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "位置" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "作词" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "组织" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "标题" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "版本" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "网站" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "专辑歌手" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "唱片" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "音轨" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "原始发行日期" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "原始专辑" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "原始歌手" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "录制日期" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz 歌手 ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz album status" msgstr "MusicBrainz 专辑歌手 ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz album type" msgstr "MusicBrainz 专辑 ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "音轨调整" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "专辑调整" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "唱片" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "音轨" #: ../quodlibet/util/tags.py:140 #, fuzzy msgid "last started" msgstr "最近一次播放" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "全名" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "挂载点" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "年份" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "原始发行日期" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "书签" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "格式" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "播放列表" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "无法打开文件" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "非法的值" #, fuzzy #~ msgid "ql-revert" #~ msgstr "移除" #~ msgid "Clear search" #~ 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 "lyricists" #~ 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)" #, fuzzy #~ msgid "Confirm rating" #~ 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 "选择(_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.5.3/po/nl.po����������������������������������������������������������������������������0000644�0001750�0001750�00000527360�12646427552�015361� 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: 2016-01-16 12:54+0100\n" "PO-Revision-Date: 2015-05-22 21:19+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.5.4\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "een audiotagbewerker" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "directory" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Titel" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artiest" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Datum" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "Beoo_rdeling" #: ../quodlibet/browsers/albums/main.py:160 msgid "Sort _by…" msgstr "Sorteren o_p…" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Voorkeuren" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albumlijst" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albumlijst" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Alle albums" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:640 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Album_hoes herladen" msgstr[1] "Album_hoezen herladen" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Nummers niet in een album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d nummer" msgstr[1] "%d nummers" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disc" msgstr[1] "%d discs" #: ../quodlibet/browsers/albums/prefs.py:66 msgid "An Example Album" msgstr "Een voorbeeldalbum" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Albumlijstvoorkeuren" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Toon album_hoezen" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Inline _zoeken zoekt ook personen" #: ../quodlibet/browsers/albums/prefs.py:93 msgid "Options" msgstr "Opties" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Albumweergave" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "_Sluit" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Ongeldig patroon" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Onbekend" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Nieuwe feed" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Voer de locatie van een audiofeed in:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audiofeeds" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audiofeeds" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 msgid "_Download…" msgstr "_Download…" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Download bestanden" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 #, fuzzy msgid "_Cancel" msgstr "Dance" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "Op_slaan" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Download bestand" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "_Nieuw" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Kan feed niet toevoegen" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 msgid "_Refresh" msgstr "Ve_rvers" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Verwij_der bestanden" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "Kon %s niet importeren. Audiofeedsbrowser uitgeschakeld." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Bibliotheekbrowser" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, python-format msgid "Unknown %s" msgstr "Onbekende %s" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "Meerdere %s waarden" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Aangepast" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Waardering ve_rwijderen" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Voeg samen" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Albumverzamelingsvoorkeuren" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Zet browser uit" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Zet browser uit" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Bestandssysteem" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Bestandssysteem" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Kan nummers niet kopiëren" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Voeg toe aan bibliotheek" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Bestandstype wordt niet ondersteund" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Kan zender niet toevoegen" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internetradio" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Zenderlijst wordt gedownload" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nieuwe zender" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Klassiek" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internetradio" #: ../quodlibet/browsers/iradio.py:549 msgid "_New Station…" msgstr "_Nieuwe zender…" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "_Zenders bijwerken" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Alle zenders" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Favorieten" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Geen categorie" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Geen zenders gevonden" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Geen internetradiozenders werden gevonden op %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Alle vermelde zenders staan al in je bibliotheek." #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "Toevoegen aan favorieten" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Verwijder uit favorieten" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Apparaateigenschappen" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Apparaat" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Niet gekoppeld" #: ../quodlibet/browsers/media.py:53 msgid "Mount point:" msgstr "Koppelpunt:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Naam:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Media-apparaten" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Media-apparaten" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "Uitwerp_en" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Eigenschappen" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "He_rnoem" #: ../quodlibet/browsers/media.py:459 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s gebruikt, %(free-size)s beschikbaar" #: ../quodlibet/browsers/media.py:477 #, python-format msgid "%s is not connected." msgstr "%s is niet aangesloten." #: ../quodlibet/browsers/media.py:497 #, python-format msgid "Copying %(song)s" msgstr "Kopiëren van %(song)s" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Kan nummer niet kopiëren" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Er is onvoldoende beschikbare ruimte voor dit nummer." #: ../quodlibet/browsers/media.py:524 #, python-format msgid "%s could not be copied." msgstr "%s kon niet worden gekopieerd." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Kan nummers niet verwijderen" #: ../quodlibet/browsers/media.py:555 #, python-format msgid "Deleting %(song)s" msgstr "Verwijderen van %(song)s" #: ../quodlibet/browsers/media.py:573 #, python-format msgid "%s could not be deleted." msgstr "%s kon niet worden verwijderd." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Kan nummer niet verwijderen" #: ../quodlibet/browsers/media.py:592 #, python-format msgid "Ejecting %s failed." msgstr "Uitwerpen van %s mislukt." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Kan apparaat niet uitwerpen" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "Geen apparaatsbackend, media-apparatenbrowser uitgeschakeld." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Paneelbrowser" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Paneelbrowser" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Selecteer _alles" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Alles" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "_Wijde modus" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Paneelbrowser-voorkeuren" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Speellijsten" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Speellijsten" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Verwijder uit speellijst" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importeer" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nieuwe speellijst" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Kan speellijst niet importeren" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Kan speellijst niet hernoemen" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importeer speellijst" #: ../quodlibet/browsers/playlists/menu.py:20 msgid "_New Playlist…" msgstr "_Nieuwe speellijst…" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Bevestig actie voor speellijst \"%s\"" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 msgid "Enter a name for the new playlist:" msgstr "Voer een naam in voor de nieuwe speellijst:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 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:82 msgid "a music library and player" msgstr "een muziekbibliotheek en -speler" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[optie]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Print het spelende nummer en sluit af" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Begin afspelen onmiddellijk" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Ga naar het volgend nummer" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Ga naar het vorig nummer" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Begin afspelen" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pauzeer afspelen" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Wissel tussen afspelen en pauzeren" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Afspelen stoppen" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Verhoog volume" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Verlaag volume" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Geef status van speler weer" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Verberg hoofdvenster" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Toon hoofdvenster" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Wissel zichtbaarheid van hoofdvenster" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Focus de spelende speler" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Verwijder actieve browserfilters" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Ververs en scan bibliotheek opnieuw" #: ../quodlibet/cli.py:106 msgid "List available browsers" msgstr "Lijst van beschikbare browsers" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Print de huidige speellijst" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Print de inhoud van de wachtrij" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Print de inhoud van de wachtrij" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Start zonder plugins" #: ../quodlibet/cli.py:111 msgid "Start Quod Libet if it isn't running" msgstr "Start Quod Libet als het niet draait." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Sluit Quod Libet af" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Zoek in spelend nummer" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][UU:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Stel de afspeelvolgorde in of wissel ze" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Zet repeat uit, aan of wissel ze" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Bepaal volume" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Zoek in je audiobibliotheek" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "zoekopdracht" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Speel een bestand" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 msgctxt "command" msgid "filename" msgstr "bestandsnaam" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Beoordeel het spelende nummer" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Stel de huidige browser in" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Open een nieuwe browser" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Toon of verberg de wachtrij" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Hoofdsonglijst tonen of verbergen" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filter op een willekeurige waarde" #: ../quodlibet/cli.py:129 msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filter op een tagwaarde" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=waarde" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Zet bestand of zoekopdracht in wachtrij" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Plaats door komma's gescheiden bestanden in wachtrij" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "bestandsnaam" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Print bestandsnamen van zoekresultaten naar stdout" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Haal bestand of zoekopdracht uit wachtrij" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Ongeldig argument voor '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Probeer %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Onbekend apparaat" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r is geen ondersteund apparaat." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "Kon '%s' niet vinden." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Apparaatsbackend wordt geïnitialiseerd." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "'%s' proberen" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Kon niet verbinden met een apparaatsbackend." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Apparaatsbackend geïnitialiseerd." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Ongeïnitialiseerde iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Wil je een lege database aanmaken op deze iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "Database aanma_ken" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Volume gain (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopieer _albumhoezen" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Combineer tags met _meerdere waarden" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Titel bevat _versie" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Album bevat _discondertitels" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Capaciteit:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Verweesd iPodnummer wordt verwijderd" #: ../quodlibet/devices/ipod.py:310 msgid "Saving iPod database…" msgstr "iPod-database wordt opgeslagen…" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Kan iPod-database niet opslaan" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "Kon libgpod niet vinden, iPod-ondersteuning uitgeschakeld." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Bestandsnaampatroon:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Verwijder ongebruikte covers en mappen" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "Last.fm albumhoesbron" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Downloadt albumhoezen van Last.fm's albumhoesarchief." #: ../quodlibet/ext/covers/musicbrainz.py:18 msgid "MusicBrainz Cover Source" msgstr "MusicBrainz albumhoesbron" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Downloadt albumhoezen van Musicbrainz's albumhoesarchief." #: ../quodlibet/ext/editing/iconv.py:33 msgid "Convert Encodings" msgstr "Coderingen converteren" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" "Verbetert verkeerde geïnterpreteerd tagwaardecoderingen in de tagbewerker." #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "Codering _converteren…" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "Kana/kanji eenvoudige omvormer" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "Converteert kana/kanji naar romaji voor hernoemen." #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "Romaniseer _Japanse tekst" #: ../quodlibet/ext/editing/kakasi.py:55 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:13 msgid "Regex Substitution" msgstr "Regex-substitutie" #: ../quodlibet/ext/editing/resub.py:14 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:19 msgid "Title Case" msgstr "Hoofdletters" #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title-cases tag values in the tag editor." msgstr "Geeft hoofdletters aan tagwaarden in de tagbewerker." #: ../quodlibet/ext/editing/titlecase.py:39 msgid "Title-_case Value" msgstr "Hoof_dletterwaarde" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "Laat ALLEEN-HOOFDLETTERS in tags toe" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "Begin_hoofdletters" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 #, fuzzy msgid "Advanced Preferences" msgstr "Paneelbrowser-voorkeuren" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "Geanimeerde weergave op scherm" #: ../quodlibet/ext/events/animosd/main.py:25 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:152 msgid "Top of screen" msgstr "Bovenkant van scherm" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "Midden van scherm" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "Onderkant van scherm" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "_Positie:" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Totale grootte:" #: ../quodlibet/ext/events/animosd/prefs.py:176 msgid "Display" msgstr "Weergave" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "_Lettertype:" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "Links" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "Midden" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Right" msgstr "Recht" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "Tekst _uitlijnen:" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "Tekst" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "_Tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "_Vullen:" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "Kleuren" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "_Schaduwen" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "C_ontour" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "Ro_nde hoeken" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "Ver_traging:" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "Effecten" #: ../quodlibet/ext/events/animosd/prefs.py:267 msgid "Ed_it Display Pattern…" msgstr "Weergavepa_troon bewerken…" #: ../quodlibet/ext/events/animosd/prefs.py:271 msgid "Preview" msgstr "Vooruitblik" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "Bibliotheek automatisch bijwerken" #: ../quodlibet/ext/events/auto_library_update.py:124 #, 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:23 msgid "Automatic Masking" msgstr "Automatisch verbergen" #: ../quodlibet/ext/events/automask.py:24 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:13 msgid "Automatic Rating" msgstr "Automatische beoordeling" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "Wekker" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "Maakt je wakker met luide muziek." #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "Slaapliedje" # betere vertaling dan 'vervagen' nodig #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "Vervaagt en pauzeert je muziek." #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "Flat" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "Live" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "Volle bas & treble" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "Club" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "Large Hall" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "Feest" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "Zacht" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "Volle bas" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "Hoofdtelefoon" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "Zachte rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "Volle treble" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "Dance" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "Laptop" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "Equalizer" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "Bepaalt de toon van je muziek met een equalizer." #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "De huidige backend biedt geen ondersteuning voor equalizing." #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 msgid "Custom" msgstr "Aangepast" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Schoon Fouten" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "Gajim statusbericht" #: ../quodlibet/ext/events/gajim_status.py:30 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:144 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:153 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:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" "Statussen waarvoor statusbericht\n" "veranderd zal worden" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "Schermbeveiliging verhinderen" #: ../quodlibet/ext/events/inhibit.py:41 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:50 msgid "Music is playing" msgstr "Muziek wordt afgespeeld" #: ../quodlibet/ext/events/iradiolog.py:15 msgid "Internet Radio Log" msgstr "Internetradiolog" #: ../quodlibet/ext/events/iradiolog.py:16 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:28 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Schrijft een Jabber User Tunes-bestand naar ~/.quodlibet/jabber." #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "UPnP AV mediaserver" #: ../quodlibet/ext/events/mediaserver.py:37 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:63 msgid "MPD Server" msgstr "MPD-server" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 msgid "Connection" msgstr "Verbinding" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "Geteste cliënten" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "MPRIS D-Bus-ondersteuning" #: ../quodlibet/ext/events/mpris.py:45 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.py:51 ../quodlibet/ext/events/trayicon.py:42 msgid "Hide main window on close" msgstr "Verberg hoofdvenster bij sluiten" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Voorkeuren" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "Meldingstekst" #: ../quodlibet/ext/events/notify.py:86 msgid "_Title:" msgstr "_Titel:" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "Terug naar standaardpatroon" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "_Lichaam:" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "Too_n melding" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "Toon meldingen" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "Enkel bij <i>hand_matige</i> songwijzigingen" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "Enkel bij <i>_automatische</i> songwijzigingen" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "Bij <i>a_lle</i> songwijzigingen" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "Enkel wanneer _focus niet op het hoofdvenster staat" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "Verbindingsfout" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "Kon niet verbinden met meldingsdaemon." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "Songmeldingen" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "Toont een melding wanneer het liedje verandert." #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 msgid "_Service:" msgstr "_Dienst:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "_URL:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "User_name:" msgstr "Gebruikers_naam:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "_Wachtwoord:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 msgid "Other…" msgstr "Overige…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "_Verifieer accountgegevens" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "Account" #: ../quodlibet/ext/events/qlscrobbler.py:528 msgid "_Artist pattern:" msgstr "_Artiestpatroon:" #: ../quodlibet/ext/events/qlscrobbler.py:528 msgid "_Title pattern:" msgstr "_Titelpatroon:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "_Filter uitsluiten:" #: ../quodlibet/ext/events/qlscrobbler.py:547 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:557 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:566 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:574 msgid "_Offline mode (don't submit anything)" msgstr "_Offlinemodus (niets indienen)" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "Indiening" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "Reclame op radio dempen" #: ../quodlibet/ext/events/radioadmute.py:18 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:25 msgid "Random Album Playback" msgstr "Willekeurig album afspelen" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "Hoger gewaardeerd" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "Meer afgespeeld" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "Meer overgeslagen" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "Meer recent afgespeeld" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "Meer recent gestart" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "Meer recent toegevoegd" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Longer albums" msgstr "Langere albums" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "seconden voor volgend album wordt gestart" #: ../quodlibet/ext/events/randomalbum.py:84 msgid "Weights" msgstr "Gewichten" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "Speel sommige albums meer dan andere" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "vermijden" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "verkiezen" #: ../quodlibet/ext/events/randomalbum.py:198 msgid "Random Album" msgstr "Willekeurig album" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "Wachten om %s te starten" #: ../quodlibet/ext/events/rbimport.py:115 msgid "Import Failed" msgstr "Importeren mislukt" #: ../quodlibet/ext/events/rbimport.py:120 #, 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:128 msgid "Rhythmbox Import" msgstr "Rhythmbox-import" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "Schermbeveiligingspauze" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Pauzeert afspelen wanneer de GNOME-schermbeveiliging actief is." #: ../quodlibet/ext/events/searchprovider.py:71 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:77 msgid "GNOME Search Provider" msgstr "GNOME zoekmachine" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "Laat GNOME Shell toe de bibliotheek te doorzoeken." #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "Squeezebox-synchronisatie" #: ../quodlibet/ext/events/squeezebox_sync.py:28 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:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "Fout bij zoeken naar Squeezebox-server" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "Fout bij zoeken naar %s. Controleer de instellingen" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "Telepathy statusberichten" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "gepauzeerd" #: ../quodlibet/ext/events/telepathy_status.py:121 msgid "Playing:" msgstr "Wordt afgespeeld:" #: ../quodlibet/ext/events/telepathy_status.py:122 #, 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:138 msgid "Paused:" msgstr "Gepauzeerd:" #: ../quodlibet/ext/events/telepathy_status.py:139 #, 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:155 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:156 msgid "No song:" msgstr "Geen nummer:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 msgid "Status Patterns" msgstr "Statuspatronen" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "Themawisselaar" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "Verandert het actieve GTK+-thema." #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "_Thema:" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "Standaardthema" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "Verkies donkere versie van thema" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "Gebruik headerbars" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "Scrollwiel verandert volume\n" "Shift en scrollwiel verandert liedje" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "Scrollwiel verandert liedje\n" "Shift en scrollwiel verandert volume" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "Scroll_wiel" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "Knopinfo-weergave" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Speelt niet" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "Systeemvakpictogram" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "Bestuur Quod Libet vanuit het systeemvak." #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Speellijsten" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Gepauzeerd:" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Vorige" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Volgende" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "Afspeelv_olgorde" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "He_rhaal" #: ../quodlibet/ext/events/trayicon.py:481 msgid "Stop _after this song" msgstr "Stop n_a deze song" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Doorzoek bibliotheek" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Bewerk _tags" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informatie" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 msgid "View Lyrics" msgstr "Bekijk teksten" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "Toont songteksten onder songlijst." #: ../quodlibet/ext/events/viewlyrics.py:38 msgid "_Lyrics" msgstr "Te_ksten" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "Foto-opslager" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "Evenementloggen" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "Stuurt songevenementen naar de Zeitgeist evenementlogdienst." #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "_Drempel:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "Drempel vooraleer filter wordt geactiveerd" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "Verho_uding:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "Compressieverhouding" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "%d %%" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "Audiocompressor" #: ../quodlibet/ext/gstreamer/compressor.py:105 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:24 msgid "_Preset:" msgstr "_Voorinstelling:" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 msgid "Filter preset" msgstr "Filter-voorinstelling" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "_Frequentie-cutoff:" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "Low-pass filter-cutoff-frequentie" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "Feed_niveau:" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "Feedniveau" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "Standaard" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Dichtst bij virtuele luidsprekerplaatsing (30°, 3 meter)" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Dichtbij Chu Moys crossfeeder (populair)" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Dichtbij Jan Meiers CORDA-versterkers (weinig verandering)" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 msgid "Custom settings" msgstr "Aangepaste instellingen" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "Crossfeed" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 msgid "Filter _band:" msgstr "Filter op _band:" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "De frequentieband van de filter" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "Filter _width:" msgstr "Filter op bree_dte:" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "De frequentiebreedte van de filter" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "_Niveau:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "Niveau van het effect" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "Verwijdert belangrijkste zang van audio." #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "Mono downmix" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "Downmixt audiokanalen naar mono." #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "Verho_uding:" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "Toon_hoogte:" #: ../quodlibet/ext/gstreamer/pitch.py:95 msgid "Audio Pitch / Speed" msgstr "Audio-toonhoogte / snelheid" #: ../quodlibet/ext/gstreamer/pitch.py:96 msgid "Controls the pitch of an audio stream." msgstr "Bepaalt de toonhoogte van een audiostream." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "Exporteren naar Squeezebox…" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." 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:70 msgid "Export playlist to Squeezebox" msgstr "Speellijst exporteren naar Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "Naam van speellijst (bestaande naam wordt overschreven)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 msgid "Shuffle Playlist" msgstr "Speellijst schudden" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "Afspelen volgt je selectie" #: ../quodlibet/ext/playorder/queue.py:16 msgid "Queue Only" msgstr "Enkel wachtrij" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" "Beperkt afspelen tot nummers in de wachtrij. Dubbelklik op een nummer om het " "in de wachtrij te plaatsen." #: ../quodlibet/ext/playorder/reverse.py:8 msgid "Reverse" msgstr "Omkeren" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "Keert de afspeelvolgorde van de nummers om." #: ../quodlibet/ext/playorder/track_repeat.py:26 msgid "Track Repeat" msgstr "Track herhalen" #: ../quodlibet/ext/playorder/track_repeat.py:28 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:43 msgid "Number of times to play each song:" msgstr "Aantal keer dat elk nummer afgespeeld moet worden::" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, 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:85 #, python-format msgid "Couldn't connect to %s" msgstr "Kon niet verbinden met %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "Hostnaam:" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "Poort:" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 msgid "Username:" msgstr "Gebruikersnaam:" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "Wachtwoord:" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "Bibliotheekdirectory waarmee de server verbindt." #: ../quodlibet/ext/_shared/squeezebox/base.py:131 msgid "Library path:" msgstr "Bibliotheekpad" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "Instellingen _verifiëren" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "Squeezebox-server" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debuggen" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Squeezebox-server op {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "niet-geïdentificeerde Squeezebox-server" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "niet-geïdentificeerde Squeezebox-speler: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "Kies Squeezebox-speler" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Squeezebox-server gevonden.\n" "Kies de speler" #: ../quodlibet/ext/songsmenu/albumart.py:227 msgid "Fit image to _window" msgstr "Pas afbeeldingsgrootte aan aan _venster" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "_Programma:" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "B_ewerk afbeelding na opslaan" #: ../quodlibet/ext/songsmenu/albumart.py:243 msgid "File_name:" msgstr "Bestands_naam" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "Opslaan mislukt" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, python-format msgid "Unable to save \"%s\"." msgstr "Kan \"%s\" niet opslaan." #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] HTTP-fout: %s" #: ../quodlibet/ext/songsmenu/albumart.py:511 msgid "Album Art Downloader" msgstr "Albumhoesdownloader" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "van %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "Resolutie: %s" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, python-format msgid "Size: %s" msgstr "Grootte: %s" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Zoek:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 msgid "Searching…" msgstr "Bezig met zoeken…" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "Klaar" #: ../quodlibet/ext/songsmenu/albumart.py:820 msgid "Download Album Art" msgstr "Download albumhoes" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "Downloadt albumhoezen van verscheidene websites." #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "Bronnen" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "APEv2 naar ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 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:20 msgid "Go to Bookmark…" msgstr "Ga naar bladwijzer…" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "Lijst van alle bladwijzers in de geselecteerde bestanden." #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 msgid "_Edit Bookmarks…" msgstr "B_ewerk bladwijzers…" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 msgid "No Bookmarks" msgstr "Geen bladwijzers" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Bestandsnaam" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Nummer" #: ../quodlibet/ext/songsmenu/brainz.py:119 msgid "Title" msgstr "Titel" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artiest" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "_Release:" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "%d _release:" msgstr[1] "%d _releases:" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "Voer een zoekopdracht in." #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "Er trad een fout op, probeer opnieuw." #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "Resultaten worden geladen…" #: ../quodlibet/ext/songsmenu/brainz.py:370 msgid "No results found." msgstr "Geen resultaten gevonden." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "%d resultaat gevonden." msgstr[1] "%d resultaten gevonden." #: ../quodlibet/ext/songsmenu/brainz.py:411 msgid "MusicBrainz lookup" msgstr "MusicBrainz opzoeken" #: ../quodlibet/ext/songsmenu/brainz.py:439 msgid "_Query:" msgstr "Zoe_kopdracht:" #: ../quodlibet/ext/songsmenu/brainz.py:442 msgid "S_earch" msgstr "Zo_ek" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "Resultaten <i>(versleep om rangschikking te wijzigen)</i>" #: ../quodlibet/ext/songsmenu/brainz.py:483 msgid "MusicBrainz Lookup" msgstr "MusicBrainz opzoeken" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Hertagt een album gebaseerd op een MusicBrainz-zoekopdracht." #: ../quodlibet/ext/songsmenu/brainz.py:510 msgid "Split _disc from album" msgstr "Splits _disc van album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "Splits uit_voerenden uit track" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "Gebruik enkel jaar voor \"date\"-tag" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "Schrijf \"_albumartist\" indien nodig" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "Schrijf sorteertags voor artiestnamen" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "Schrijf _standaard-MusicBrainz-tags" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "Schrijf _labelid-tags (oplossing voor multi-disc albums)" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 msgid "Browse Folders" msgstr "Bladeren door mappen" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "Opent de mappen van de nummers in een bestandsbeheerder." #: ../quodlibet/ext/songsmenu/browsefolders.py:184 msgid "Unable to open folders" msgstr "Kan mappen niet openen" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "Geen programma beschikbaar voor het openen van mappen." #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Nummerlijst" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "CDDB opzoeken" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "Zoekt albuminformatie op FreeDB. Vereist CDDB.py." #: ../quodlibet/ext/songsmenu/cddb.py:166 msgid "Timeout" msgstr "Time-out" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "Zoekopdracht kon niet worden uitgevoerd, time-out bij verbinden" #: ../quodlibet/ext/songsmenu/cddb.py:172 msgid "Select an album" msgstr "Kies een album" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "Kies het album dat je wil ophalen." #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "CDDB opzoeken mislukt (%s)" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "Python-console" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "Je huidige werkdirectory is:" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "Commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "name" msgstr "naam" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "De naam van dit commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "command" msgstr "commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "De uit te voeren shellcommandosyntax" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "parameter" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 msgid "pattern" msgstr "patroon" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" "Het te gebruiken QL-patroon, bv. <~filename>, voor het berekenen van een " "waarde van het commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "uniek" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 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:58 msgid "max args" msgstr "maximum argumenten" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 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:82 msgid "Input value" msgstr "Invoerwaarde" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "Waarde voor %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 msgid "Custom Commands" msgstr "Aangepaste commando's" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 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:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "Aangepaste commando's bewerken" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 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:235 #, 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:344 msgid "Collapse / Expand all" msgstr "Alles samenvouwen / uitvouwen" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Dubbele sleutelexpressie is '%s'" #: ../quodlibet/ext/songsmenu/duplicates.py:364 msgid "Duplicates Browser" msgstr "Duplicatenbrowser" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "Zoekt en toont gelijkaardig getagde versies van nummers." #: ../quodlibet/ext/songsmenu/duplicates.py:404 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:406 msgid "_Group duplicates by:" msgstr "Duplicaten _groeperen op:" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "Dubbele sleutel" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "_Witruimte verwijderen" #: ../quodlibet/ext/songsmenu/duplicates.py:417 msgid "Remove _Diacritics" msgstr "_Diakritische tekens verwijderen" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Remove _Punctuation" msgstr "_Leestekens verwijderen" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "N_iet hoofdlettergevoelig" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "Bijpassende opties" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Bewerk weergave" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "Ingebedde afbeeldingen bewerken" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "Verwijdert of vervangt ingebedde afbeeldingen." #: ../quodlibet/ext/songsmenu/embedded.py:65 msgid "_Remove all images" msgstr "Alle afbeeldingen ve_rwijderen" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "Huidige afbeeldingen inb_edden" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "Exacte waardering instellen" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 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:29 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:79 msgid "Filter on Any Tag" msgstr "Filter op eender welke tag" #: ../quodlibet/ext/songsmenu/filterall.py:80 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:17 msgid "Filter on Directory" msgstr "Filter op Directory" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "Filtert op directory in een nieuw browservenster." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "Akoestische vingerafdruk opzoeken" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 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:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "Akoestische vingerafdrukken indienen" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 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:53 msgid "API Key Missing" msgstr "API-sleutel ontbreekt" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "API-sleutel aanvragen" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "API-_sleutel:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "AcoustID-webdienst" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "In wachtrij" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "Analyseren" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "Opzoeken" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Error" msgstr "Fout" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Schrijf" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "Status" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "Release" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 msgid "Write MusicBrainz tags" msgstr "Schrijf MusicBrainz-tags" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 msgid "Group by directory" msgstr "Groeperen op directory" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 msgid "Album Mode" msgstr "Albummodus" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 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:46 msgid "Generating fingerprints:" msgstr "Aanmaken van vingerafdrukken:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "_Details" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "In_dienen" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "Vingerafdrukken:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "Nummers met MBID's:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "Nummers met voldoende tags:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "In te dienen nummers:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, 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:175 msgid "Submitting fingerprints:" msgstr "Indienen van vingerafdrukken:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "Indienen…" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 msgid "Force Write" msgstr "Schrijven dwingen" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure 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:63 msgid "Export to HTML" msgstr "Exporteren naar HTML" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "Exporteert de gekozen songlijst naar HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "Sturen naar iFP" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "Uploadt nummer naar een iRiver iFP-apparaat." #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "Metadata exporteren" #: ../quodlibet/ext/songsmenu/importexport.py:47 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:84 msgid "Import Metadata" msgstr "Metadata importeren" #: ../quodlibet/ext/songsmenu/importexport.py:85 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:20 msgid "Burn CD" msgstr "CD branden" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Brandt CD's met K3b, Brasero of xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "Hitlijsten worden bijgewerkt." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "Reeds actueel." #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "Hitlijst voor week van %s wordt opgehaald." #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "Synchronisatie voltooid." #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "Fout tijdens synchronisatie" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "Last.fm-synchronisatie" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 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:277 msgid "_Username:" msgstr "Gebr_uikersnaam:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 msgid "No active song" msgstr "Geen liedje actief" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 msgid "No lyrics found" msgstr "Geen teksten gevonden" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 msgid "Lyrics:" msgstr "Teksten:" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 msgid "Lyrics Window" msgstr "Tekstvenster" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "Toont een venster met teksten van het huidige nummer." #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "Sorteertags aanmaken" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "Converteert album- en artiestnames in sorteernamen, slecht." #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "Sturen naar…" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "Algemene plugin voor openen van bestanden." #: ../quodlibet/ext/songsmenu/playlist.py:52 msgid "Playlist Export" msgstr "Speellijst exporteren" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "Exporteert nummers naar een M3U- of PLS-speellijst." #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "Gebruik relatieve paden" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "Gebruik absolute paden" #: ../quodlibet/ext/songsmenu/playlist.py:150 msgid "Unable to export playlist" msgstr "Kan speellijst niet exporteren" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Schrijven naar <b>%s</b> mislukt." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 msgid "Refresh Songs" msgstr "Ververs nummers" #: ../quodlibet/ext/songsmenu/refresh.py:20 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:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d nummer" msgstr[1] "%d nummers" #: ../quodlibet/ext/songsmenu/refresh.py:28 msgid "Refresh songs" msgstr "Ververs nummers" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "ReplayGain-analyzer" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "Voortgang" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "Gain" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "Piek" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" 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:568 msgid "Replay Gain" msgstr "ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:569 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:604 msgid "always" msgstr "altijd" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "indien <b>enige</b> RG tags ontbreken" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "indien <b>album</b> RG tags ontbreken" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "Te verwerken al_bums:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 msgid "Existing Tags" msgstr "Bestaande tags" #: ../quodlibet/ext/songsmenu/splitting.py:15 msgid "Split Tags" msgstr "Tags splitsen" #: ../quodlibet/ext/songsmenu/splitting.py:16 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:40 msgid "Split Album" msgstr "Album splitsen" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "Splits discnummer." #: ../quodlibet/ext/songsmenu/website_search.py:34 msgid "Website Search" msgstr "Zoek op website" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 msgid "Search URL patterns" msgstr "Zoek-URL patronen" #: ../quodlibet/ext/songsmenu/website_search.py:89 msgid "Edit search URLs" msgstr "Zoek-URLs bewerken" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 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." #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Bibliotheek" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Koppelpunten worden gecontroleerd" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Bibliotheek wordt gescand" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "%s wordt gescand" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Laden van bestand mislukt: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Lijst van tags" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Print beknopte uitvoer" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, 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:43 msgid "Also list programmatic tags" msgstr "Laat ook _programmatische tags zien" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Niet genoeg argumenten" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "Te veel argumenten" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 msgid "Description" msgstr "Beschrijving" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Waarde" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Lijst van veelgebruikte tags" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Kopieer tags van een bestand naar een ander" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Toon veranderingen, pas ze niet toe" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Sla tags die niet geschreven kunnen worden over" #: ../quodlibet/operon/commands.py:135 #, 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:147 msgid "Edit tags in a text editor" msgstr "Tags bewerken in een tekstverwerker" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "Bewerken geannuleerd" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Starten van tekstverwerker '%(editor-name)s' mislukt." #: ../quodlibet/operon/commands.py:250 msgid "No changes detected" msgstr "Geen wijzigingen gevonden" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Stel een tag in en verwijder bestaande waarden" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Kan %r niet instellen" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "Verwijder tags" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "Waarde is een reguliere expressie" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "Verwijder alle tags" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "Kan '--all' niet met '--regexp' combineren" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "Kan %r niet verwijderen van %r" #: ../quodlibet/operon/commands.py:369 msgid "Remove a tag value" msgstr "Een tagwaarde verwijderen" #: ../quodlibet/operon/commands.py:418 msgid "Add a tag value" msgstr "Een tagwaarde toevoegen" #: ../quodlibet/operon/commands.py:446 msgid "List file information" msgstr "Bestandsinformatie weergeven" #: ../quodlibet/operon/commands.py:492 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:505 #, python-format msgid "Failed to load image file: %r" msgstr "Laden van afbeeldingsbestand mislukt: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, 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:525 msgid "Remove all embedded images" msgstr "Verwijder alle ingebedde afbeeldingen" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Pak ingebedde afbeeldingen uit naar %(filepath)s" #: ../quodlibet/operon/commands.py:564 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:623 msgid "Rename files based on tags" msgstr "Hernoem bestanden op basis van tags" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "Vul tags op basis van bestandspad" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Bestand" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Vul nummer-nummers voor alle bestanden" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "Print tags op basis van gegeven patroon" #: ../quodlibet/operon/commands.py:752 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Bufferen" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "Kon GStreamer-pijplijn niet aanmaken" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "Geen GStreamer-element gevonden om mediaformaat te verwerken" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "Mediaformaat: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 msgid "No GStreamer audio sink found" msgstr "Geen GStreamer-audiosink gevonden" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "Ongeldige GStreamer-uitvoerpijplijn" #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Kan audio-uitvoer niet aanmaken" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, 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:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Kon GStreamer-element '{element}' niet vinden." #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d 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:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 msgid "_Run Plugin" msgstr "Plugin uitvoe_ren" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Ondersteunde formaten: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Audio-apparaat: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Begin" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/B" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Tijd" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Bladwijzernaam" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Bladwijzers" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filters" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "Recent afges_peeld" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Recent _toegevoegd" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 msgid "All _Songs" msgstr "Alle liedje_s" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filter op _genre" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filter op _artiest" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filter op al_bum" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Willekeurig _genre" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Willekeurige _artiest" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Willekeurig al_bum" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Geen tijdsinformatie" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Waarde:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Opgeslagen waarden" #: ../quodlibet/qltk/cbes.py:252 msgid "Edit saved values…" msgstr "Opgeslagen waarden bewerken…" #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Nummers" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Geef resterende tijd weer" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_matisch" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "_Trackmodus" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "_Albummodus" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "ReplayGain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "Nieuw %s" #: ../quodlibet/qltk/data_editors.py:212 msgid "(unknown)" msgstr "(onbekend)" #: ../quodlibet/qltk/data_editors.py:349 #, fuzzy msgid "Tag expression" msgstr "Waarde is een reguliere expressie" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Nieuwe waarde invoeren" #: ../quodlibet/qltk/debugwindow.py:41 #, fuzzy msgid "Error Details" msgstr "_Details" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Er trad een fout op" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 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." #: ../quodlibet/qltk/delete.py:33 msgid "Files:" msgstr "Bestanden:" #: ../quodlibet/qltk/delete.py:59 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:68 msgid "The selected files will be deleted from disk." msgstr "De geselecteerde bestanden zullen worden verwijderd van de schijf." #: ../quodlibet/qltk/delete.py:73 #, 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:90 msgid "_Delete Files" msgstr "Verwij_der bestanden" #: ../quodlibet/qltk/delete.py:105 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:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Verplaats naar vuilnisbak" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Verplaatsen van %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Kan niet verplaatsen naar prullenbak" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 msgid "Moving one or more files to the trash failed." msgstr "Verplaatsen van een of meerdere bestanden naar prullenbak mislukt." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Verwijderen van %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 msgid "Unable to delete files" msgstr "Kan bestanden niet verwijderen" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Splits in _meerdere waarden" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Splits disc van _album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Splits _versie uit titel" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Splits arrangeerder van ar_tiest" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Splits _uitvoerende van artiest" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "Splits _uitvoerende uit titel" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "Splits _oorspronkelijke artiest uit titel" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Voeg een tag toe" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Omkeren" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 #, fuzzy msgctxt "edittags" msgid "_Save" msgstr "Op_slaan" #: ../quodlibet/qltk/edittags.py:657 msgid "Unable to add tag" msgstr "Kan tag niet toevoegen" #: ../quodlibet/qltk/edittags.py:658 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Kan <b>%s</b> niet toevoegen" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Ongeldige tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Ongeldige waarde" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso voorkeuren" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Splits _op:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Tagbewerken" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Mappen" #: ../quodlibet/qltk/filesel.py:221 msgid "_New Folder…" msgstr "_Nieuwe map…" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Selecteer alle submappen" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nieuwe map" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Voer een naam in voor de nieuwe map:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Kan map niet aanmaken" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Kan map niet verwijderen" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "door %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disc %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Nummer %s" #: ../quodlibet/qltk/info.py:106 msgid "_Edit Display…" msgstr "Weergave b_ewerken…" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Er zijn geen nummers geselecteerd." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Geen nummers" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informatie" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Tekst" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artiest" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artiesten" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "uitvoerenden" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nooit" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "toegevoegd" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "laatst gespeeld" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "speelt" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "slaat over" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "beoordeling" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "lengte" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informatie" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Coderingen converteren" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "bestandsgrootte" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "gewijzigd" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d geselecteerd" msgstr[1] "%d geselecteerd" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Geproduceerd door %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "uitvoerende" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Nummer niet beschikbaar" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Selectieve discografie" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Totale lengte:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Totale grootte:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Bestanden" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:37 #, fuzzy 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Geen tekst gevonden voor dit nummer." #: ../quodlibet/qltk/lyrics.py:78 msgid "Searching for lyrics…" msgstr "Zoeken naar tekst…" #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Kan tekst niet downloaden." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "Ben je zeker dat je alle nummers wil verwijderen?" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "De geselecteerde nummers zullen worden verwijderd van de bibliotheek." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "Zichtbaar maken" #: ../quodlibet/qltk/maskedbox.py:85 #, fuzzy msgid "_Unhide" msgstr "Zichtbaar maken" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Gooi tagwijzigingen weg?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Omkeren" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Bestand bestaat" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "%(file-name)s vervangen?" #: ../quodlibet/qltk/msg.py:93 msgid "_Replace File" msgstr "Bestand ve_rvangen" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Actieve taken" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d taken worden uitgevoerd" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Onbekend" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "In volgorde" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_In volgorde" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Shuffle" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Shuffle" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Gewogen" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "Ge_wogen" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Één nummer" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Één nummer" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Pluginfouten" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Ingeschakeld" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Uitgeschakeld" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Geen categorie" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Geen plugins gevonden." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Plugins" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Toon fout_en" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disc" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Nummer" #: ../quodlibet/qltk/prefs.py:45 msgid "Grou_ping" msgstr "Groe_peren" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Bestandsnaam" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Lengte" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Songlijst" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Ga automatisch naar nummer dat wordt afgespeeld" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Gedrag" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Overige:" #: ../quodlibet/qltk/prefs.py:93 msgid "_Edit…" msgstr "B_ewerken…" #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Kolomhoofdingen toevoegen of verwijderen" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Zichtbare kolommen" #: ../quodlibet/qltk/prefs.py:112 msgid "Artist includes all _people" msgstr "Artiest bevat alle _personen" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Bestandsnaam bevat _map" #: ../quodlibet/qltk/prefs.py:132 msgid "Column Preferences" msgstr "Kolomvoorkeuren" #: ../quodlibet/qltk/prefs.py:138 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:221 #, fuzzy msgid "Edit Columns" msgstr "Extra kolommen" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Browsers" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globale filter:" #: ../quodlibet/qltk/prefs.py:242 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:249 msgctxt "heading" msgid "Search" msgstr "Zoek" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "_Meerdere waarderingen bevestigen" #: ../quodlibet/qltk/prefs.py:256 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:259 msgid "Enable _one-click ratings" msgstr "Ee_n-klik-waarderingen inschakelen" #: ../quodlibet/qltk/prefs.py:261 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Waarderingen" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "Gebr_uik ronde hoeken voor miniaturen" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "Rondt de hoeken van albumhoezen in miniaturen af." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Verkies ing_ebedde hoes" #: ../quodlibet/qltk/prefs.py:282 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:287 msgid "_Fixed image filename:" msgstr "Vaste bestandsnaam voor a_fbeelding:" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "De te gebruiken bestandsnaam voor afbeeldingen indien geselecteerd" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Het te gebruiken albumhoesbestand indien gedwongen" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Albumhoes" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Afspelen" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Uitvoerconfiguratie" #: ../quodlibet/qltk/prefs.py:344 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:347 msgid "_Fall-back gain (dB):" msgstr "_Fall-back gain (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 msgid "_Pre-amp gain (dB):" msgstr "_Pre-amp gain (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "ReplayGain volume-aanpassing inschak_elen" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "ReplayGain volume-aanpassing" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "Stan_daardbeoordeling:" #: ../quodlibet/qltk/prefs.py:463 msgid "Rating _scale:" msgstr "Waarderings_schaal:" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "_Bayesiaans gemiddelde-waarde:" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Sla waarderingen en speeltellin_gen op" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_E-mail:" #: ../quodlibet/qltk/prefs.py:532 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:547 msgid "Auto-save tag changes" msgstr "Tagwijzigingen automatisch opslaan" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. 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:579 msgid "Tags" msgstr "Tags" #: ../quodlibet/qltk/prefs.py:600 msgid "Updating for new ratings" msgstr "Bijwerken voor nieuwe waarderingen" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "Ve_rvers bibliotheek bij opstarten" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Ver_vers bibliotheek" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Controleer op wijzigingen in je bibliotheek" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Her_laad bibliotheek" #: ../quodlibet/qltk/prefs.py:630 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:640 msgid "Scan Directories" msgstr "Scan directories" #: ../quodlibet/qltk/prefs.py:646 msgid "Hidden Songs" msgstr "Verborgen nummers" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Eigenschappen" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Wachtrij" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Verwijder alle nummers uit de wachtrij" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "Willekeu_rig" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Start de speellijst opnieuw nadat alle nummers gespeeld zijn" #: ../quodlibet/qltk/quodlibetwindow.py:374 msgid "Playback Error" msgstr "Afspeelfout" #: ../quodlibet/qltk/quodlibetwindow.py:382 msgid "Set up library directories?" msgstr "Bibliotheekdirectories instellen?" #: ../quodlibet/qltk/quodlibetwindow.py:383 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:389 msgid "_Not Now" msgstr "_Niet nu" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "In_stellen" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Kan nummers niet toevoegen" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s gebruikt een protocol dat niet wordt ondersteund." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Muziek" #: ../quodlibet/qltk/quodlibetwindow.py:803 msgid "_Add a Folder…" msgstr "_Een m_ap toevoegen…" #: ../quodlibet/qltk/quodlibetwindow.py:808 msgid "_Add a File…" msgstr "Een best_and toevoegen…" #: ../quodlibet/qltk/quodlibetwindow.py:813 msgid "_Add a Location…" msgstr "_Een loc_atie toevoegen…" #: ../quodlibet/qltk/quodlibetwindow.py:818 msgid "Open _Browser" msgstr "_Browser openen" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Ga naar spelend nummer" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Weergave" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Hulp" #: ../quodlibet/qltk/quodlibetwindow.py:876 msgid "Stop After This Song" msgstr "Stop na deze song" #: ../quodlibet/qltk/quodlibetwindow.py:882 msgid "Add Bookmark" msgstr "Bladwijzer toevoegen" #: ../quodlibet/qltk/quodlibetwindow.py:888 msgid "Edit Bookmarks…" msgstr "Bewerk bladwijzers…" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Online hulp" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Zoekhulp" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Song_lijst" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Voeg een locatie toe" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Voer de locatie van een audiobestand in:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Kan locatie niet toevoegen" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, python-format msgid "%s is not a valid location." msgstr "%s is geen geldige locatie." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Voeg muziek toe" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Controleer deze map op nieuwe nummers" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 msgid "The saved ratings will be removed" msgstr "De opgeslagen beoordelingen zullen verwijderd worden" #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 msgid "Change _Rating" msgstr "Waa_rdering veranderen" #: ../quodlibet/qltk/ratingsmenu.py:58 msgid "_Remove Rating" msgstr "Waardering ve_rwijderen" #: ../quodlibet/qltk/ratingsmenu.py:76 msgid "_Remove rating" msgstr "Waardering ve_rwijderen" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Vervangen spaties door _underscores" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Verwijder _Windows-incompatibele tekens" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Verwijder _diakritische tekens" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Verwijder niet-_ASCII-tekens" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Gebruik enkel k_leine letters" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Hernoem bestanden" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Padpatronen" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 msgid "Edit saved patterns…" msgstr "Opgeslagen patronen bewerken…" #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Voorbeeld" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nieuwe naam" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Kan bestand niet hernoemen." #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "_Alle fouten negeren" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Ga door" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Pad is niet absoluut" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 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:108 msgid "Select Directories" msgstr "Kies directories" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Opgeslagen zoekopdrachten" #: ../quodlibet/qltk/searchbar.py:50 msgid "Edit saved searches…" msgstr "Opgeslagen zoekopdrachten bewerken…" #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Zoek" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "Doorzoek je bibliotheek met vrije tekst of QL-zoekopdrachten" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Zoeken na _typen" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Toon zoekresultaten nadat de gebruiker stopt met typen." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limiet:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "Ge_wicht" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filter op %s" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "Alle _hoofdingen" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Nummerhoofdingen" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Albumhoofdingen" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Persoonhoofdingen" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Datumhoofdingen" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Bestandshoofdingen" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Productiehoofdingen" #: ../quodlibet/qltk/songlist.py:1092 msgid "_Customize Headers…" msgstr "Hoofdin_gen aanpassen…" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "Kolom uitvouw_en" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 msgid "Play_lists" msgstr "Speel_lijsten" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Voeg toe aan _wachtrij" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopieer naar apparaat" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "Ve_rwijder uit bibliotheek" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Vervang _underscores door spaties" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Tags met hoofdletters" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Splits in meerdere _waarden" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tags vanuit pad" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Tags vervangen bestaande tags" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tags worden toegevoegd aan de bestaande tags" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 #, fuzzy msgid "Save" msgstr "Op_slaan" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Ongeldige tags" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Bewerk weergave" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Nummer-nummers" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Begin va_n:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Totaal aantal nummers:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Afspelen/pauzeren" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Vorige" #: ../quodlibet/qltk/views.py:803 #, python-format msgid "and %d more…" msgstr "en %d meer…" #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Slaat aangepaste songs op." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, python-format msgid "%(current)d of %(all)d" msgstr "%(current)d van %(all)d" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Een speellijst genaamd %s bestaat al." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "Albumhoes inbedden" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "Gebruikt albumhoezen ingebed in audiobestanden." #: ../quodlibet/util/cover/built_in.py:41 msgid "Filesystem cover" msgstr "Bestandssysteemhoes" #: ../quodlibet/util/cover/built_in.py:42 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." #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "D:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "W:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "E:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Toon korte gebruikersinformatie" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Toon versie en auteursrecht" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Gebruik: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[opties]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Optie %r niet herkend." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Optie %r vereist een argument." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r is geen uniek prefix." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d seconde" msgstr[1] "%d seconden" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuut" msgstr[1] "%d minuten" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d uur" msgstr[1] "%d uur" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dag" msgstr[1] "%d dagen" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 msgctxt "check" msgid "titlecase?" msgstr "hoofdletters?" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status moet zijn: 'official', 'promotional', of " "'bootleg'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Taal moet een ISO 639-2 drielettercode zijn" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Kan nummer niet aanpassen" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Ongeldige codering]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "arrangeur" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "arrangeurs" #: ../quodlibet/util/tags.py:72 msgid "arrangement" msgstr "arrangement" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "auteur" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "auteurs" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "componist" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "componisten" #: ../quodlibet/util/tags.py:75 msgid "composition" msgstr "compositie" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dirigenten" #: ../quodlibet/util/tags.py:76 msgid "conducting" msgstr "uitvoeren" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "auteursrecht" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "datum" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "beschrijving" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:81 msgid "genres" msgstr "genres" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "groeperen" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "taal" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licentie" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "locatie" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "tekstschrijver" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organisatie" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "titel" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versie" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "website" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "albumartiest" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "discondertitel" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "nummer" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "label-ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "originele releasedatum" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "origineel album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "originele artiest" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "opnamedatum" #: ../quodlibet/util/tags.py:107 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:116 msgid "MusicBrainz recording ID" msgstr "MusicBrainz opname-ID" #: ../quodlibet/util/tags.py:117 msgid "MusicBrainz release track ID" msgstr "MusicBrainz release track-ID" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:119 msgid "MusicBrainz artist ID" msgstr "MusicBrainz artiest-ID" #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz release artist ID" msgstr "MusicBrainz release artiest-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz albumstatus" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz albumtype" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "nummer gain" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "nummer peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "indicatieve geluidssterkte" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "discs" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "nummers" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "laatst gestart" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "volledige naam" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "koppelpunt" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "personen" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "jaar" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "originele release datum" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "bladwijzer" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "bestandsformaat" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Speellijsten" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "sorteren" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "rollen" #~ 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 "Clear search" #~ msgstr "Wis zoekopdracht" #~ 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 "lyricists" #~ msgstr "tekstschrijvers" #~ 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.5.3/po/uk.po����������������������������������������������������������������������������0000644�0001750�0001750�00000512545�12646427552�015366� 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: 2016-01-16 12:54+0100\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 "Музичний програвач" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "програма для редагування аудіо-тегів" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "каталог" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Назва" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Виконавець" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Дата" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "жанр" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Рейтинг" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "За датою" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Налаштування" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Список альбомів" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Список _альбомів" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Всі альбоми" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d альбом" msgstr[1] "%d альбомb" msgstr[2] "%d альбомів" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Показувати _обкладинки альбомів" msgstr[1] "Показувати _обкладинки альбомів" msgstr[2] "Показувати _обкладинки альбомів" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Пісні, що не входять в альбом" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d трек" msgstr[1] "%d треки" msgstr[2] "%d треків" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d диск" msgstr[1] "%d диски" msgstr[2] "%d дисків" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Всі альбоми" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Налаштування списку альбомів" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Показувати _обкладинки альбомів" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[параметри]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Перегляд альбомів" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Неправильний шаблон" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Невідомо" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Новий фід" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Введіть адресу аудіо-фіду" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Аудіо-фіди" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Аудіо-фіди" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Завантажити" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Завантажити файли" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Завантажити файл" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Не вдалося додати фід" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "_Оновити бібліотеку" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Видалення фалів" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Перегляд бібліотеки" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Невідомо" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "_Розділити на кілька значень" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Інший" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Рейтинг" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Тег" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Налаштування списку альбомів" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Вимкнути переглядач" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Вимкнути переглядач" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Файлова система" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Файлова система" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Не вдалося скопіювати пісню" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Вибрані файли не можуть бути скопійовані до іншого списку пісень або черги." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "_Додати до бібліотеки" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Непідтримуваний тип файлу" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Не вдалося додати станцію" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Інтернет-радіо" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Завантажити файли" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Нова станція" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Інтернет-радіо" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Нова станція" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Нова станція" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Нова станція" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Станцій не знайдено" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "За адресою %s інтернет-радіостанцій не знайдено" #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Всі перелічені станції вже є в бібліотеці." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Додати до списку програвання" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Вилучити зі cписку програвання" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Властивості пристрою" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Пристрій:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Не змонтовано" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Точка монтування:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Назва:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Медіа-пристрої:" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Медіа-пристрої" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Витягнути" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Властивості" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Перейменувати" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> використано, <b>%s</b> наявно" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> не під'єднано" #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Копіювання <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Не вдалося скопіювати пісню" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Недостатньо вільного місця для цієї пісні." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> не може бути скопійовано." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Не вдалося видалити пісні" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Видалення <b>%s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> не може бути видалений." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Не вдалося видалити пісню" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Не вдалося витягнути <b>%s</b>." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Не вдалося витягнути пристрій" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Вибір пісень" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "В_ибір пісень" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Вибрати _все" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Всі" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Налаштування 'Вибору пісень''" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Списки програвання" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Списки програвання" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Вилучити зі cписку програвання" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Імпортувати" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Новий список програвання" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Не вдалося імпортувати список програвання" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet здатне імпортувати списки програвання тільки у форматах M3U та " "PLS." #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "Не вдалося перейменувати список програвання" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Імпортувати список програвання" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Новий список програвання" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Введіть назву нового каталоги" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet не запущено." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "музична бібліотека та програвач" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[параметри]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Показати, яка пісня програється, і вийти" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Відразу почати програвання" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Перейти до наступної пісні" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Перейти до попередньої пісні" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Почати програвання" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Призупинити програвання" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Перемикнути режим програвання/паузи" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Почати програвання" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Збільшити гучність" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Зменшити гучність" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Показати стан програвача" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Сховати головне вікно" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Показати головне вікно" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Показати/сховати головне вікно" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Помістити фокус на вікно Quod Libet" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Видалити фільтри активного переглядача" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "_Оновити бібліотеку" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Вимкнути переглядач" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Показати поточний список програвання" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Показати вміст черги" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Показати вміст черги" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet не запущено." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Вийти з Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Переміститись всередині відтворюваної пісні" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ГГ:]ХХ:СС" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Перемикнути порядок програвання" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Увімкнути/вимкнути/перемикнути повторення" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Встановити гучність" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Шукати в бібліотеці" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "запит" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Відтворити файл" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "назва файлу" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Оцінити відтворювану пісню" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Встановити режим перегляду бібліотеки" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Відкрити новий переглядач" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Показати/сховати чергу" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Показати/сховати список пісень" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Фільтрувати за випадковим параметром" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Тег" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Фільтрувати за тегом" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "тег=значення" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Додати в чергу файл або результат пошуку" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "назва файлу" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Видалити з черги файл або результат пошуку" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Неправильний аргумент для '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Спробуйте %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Невідомий пристрій" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' неоднозначний" #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Неправильне значення" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Неініціалізований iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Бажаєте створити порожню базу на цьому iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "Приріст гучності (дБ):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Копіювати обкладинки _альбомів" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Комбінувати теги з _різними значеннями" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Назва включає _версію" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Альбом включає _частину" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Модель:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Ємність:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Мікропрограми:" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "W: видалення 'самотнього' треку iPod" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Не вдалося зберегти базу iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Не вдалося зберегти базу iPod" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Шаблон назви файлу:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Видалити невикористовувані обкладинки та каталоги" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Неправильне кодування]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Назва" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Редактор аудіо-тегів" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Замінити першу букву кожного слова великою" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Налаштування 'Вибору пісень''" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Загальний розмір:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "За _оцінками" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Попередній перегляд" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d секунда" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Інший" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Очистити помилки" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Музичний програвач" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Інтернет-радіо" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "місце запису" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Сховати головне вікно" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Налаштування" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Назва" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Пристрій:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Назва:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Інші:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Виконавець" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Шаблон назви файлу:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Випадковий _альбом" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "альбоми" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "За _оцінками" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Випадковий _альбом" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Імпортувати список програвання" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Не грає" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d пісня" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "шаблон" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Не грає" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Списки програвання" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Програвач" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Попередній перегляд" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Порядок:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Повторювати" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Зупинитись після цієї пісні" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Переглянути бібліотеку" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Редагувати _теги" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Інформація" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Текст пісні" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Текст пісні" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Попередній перегляд" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Фільтрувати за _виконавцем" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Інший" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Фільтрувати за _жанром" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Фільтрувати за _виконавцем" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Аудіо-фіди" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Введіть адресу аудіо-фіду" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Новий список програвання" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_Черга" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Ніколи" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "пік треку" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Перейменувати" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Бібліотека" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Сховати головне вікно" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Назва файлу" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Не вдалося зберегти пісню" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Список альбомів" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Розмір" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Пошук" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Пошук" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Список альбомів" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Редагувати закладки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Редагувати закладки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Закладки" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Назва файлу" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Трек" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Назва" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Виконавець" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Розширень не знайдено" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "%d інших..." msgstr[1] "%d інших..." msgstr[2] "%d інших..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "Тип альбому MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "запит" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Пошук" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Тип альбому MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Відділити номер диску від альбому" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Вибір пісень" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Не вдалося створити каталог" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Список треків" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Час" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Вибрати _все" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "команда|тег" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Перейменувати" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "команда|тег" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Неправильний шаблон" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Неправильне значення" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Інший" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Вимкнути переглядач" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "_Рейтинг" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Рейтинг" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "_Рейтинг" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Фільтрувати за тегом" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Фільтрувати за _жанром" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Черга" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Помилки" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Записати" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "каталог" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Альбом" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Записати" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Імпортувати список програвання" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Перейменувати" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Не вдалося зберегти пісню" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Розширень не знайдено" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Текст пісні" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Текст пісні" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Списки програвання" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Не вдалося імпортувати список програвання" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Не вдалося витягнути <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "_Оновити бібліотеку" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d пісня" msgstr[1] "%d пісні" msgstr[2] "%d пісень" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "_Оновити бібліотеку" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Редагувати теги" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Редагувати теги" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Всі альбоми" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Пошук" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "шаблон" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Редагувати збережені параметри..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Бібліотека" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Перевірка точок монтування" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Сканування бібліотеки" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Сканування %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Показувати _програмні теги" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "опис" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Значення" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Редактор аудіо-тегів" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Не вибрано жодної пісні" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Фільтрувати за тегом" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Фільтрувати за тегом" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Немає інформації про час" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Не вдалося перейменувати файл" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Файл" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Станцій не знайдено" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Не вдалося створити каталог" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Розширення" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Підтримуються формати: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Аудіо-пристрій: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Початок" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "Немає" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Час" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Назва закладки" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "ХХ:СС" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Закладки" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Фільтри" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "Що _ніколи не відтворювались" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 _кращих" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Нова станція" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Фільтрувати за _жанром" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Фільтрувати за _виконавцем" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Фільтрувати за _альбомом" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Випадковий _жанр" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Випадковий _виконавець" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Випадковий _альбом" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 пісень, що відтворювались найчастіше (може бути вибрано більше 40,якщо є " "пісні, що відтворювались однакову кількість разів)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Немає інформації про час" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Значення:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Збережені значення" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Редагувати збережені параметри..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Пісні" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Відображати час, що лишився" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Трек" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Альбом" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Корегування гучності Replay Gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Невідомо" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Фільтрувати за тегом" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Файли" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Видалення фалів" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Перемістити в Trash" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Перенесення %d/%d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Не вдалося зберегти базу iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Не вдалося витягнути <b>%s</b>." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Видалення %d/%d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Не вдалося видалити файл" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "_Розділити на кілька значень" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Відділити номер диску від альбому" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Відділити _версію від назви" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Відділити аранжувальника від _виконавця" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Відділити поле \"виконавець \" від поля \"артист\"" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Відділити поле \"виконавець \" від поля \"артист\"" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Відділити _версію від назви" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Додати тег" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Тег" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Не вдалося додати тег" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Не вдалося додати пісню" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Неправильний тег" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Неправильне значення" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Розширення" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Налаштування Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "_Розділяти по:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Редагування тегів" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Каталоги" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Створення каталогу" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Вибрати всі підкаталоги" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Створення каталогу" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Введіть назву нового каталоги" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Не вдалося створити каталог" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Не вдалося видалити каталог" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "%s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Диск %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Трек %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Не вибрано жодної пісні" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Немає пісень" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Інформація" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Текст пісні" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "артист" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "виконавці" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "виконавці" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Ніколи" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "доданий" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "востаннє відтворено" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "відтворень" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "перервано" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "рейтинг" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "тривалість" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Інформація" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Неправильне кодування]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "бітрейт" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "розмір файлу" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "змінено" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d вибрано" msgstr[1] "%d вибрано" msgstr[2] "%d вибрано" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Продюсер: %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "виконавець" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Трек недоступний" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Вибрані альбоми" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "альбоми" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Загальна тривалість:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Загальний розмір:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Файли" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Завантажити" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Для цієї пісні текст не знайдено." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Пошук тексту пісні..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Не вдалося завантажити текст пісні." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Скасувати зміни в тегу?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Теги було змінено, але зміни не були збережені. Зберегти їх чи повернути " "зміни?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Ніколи" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Файл існує" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Перейменувати файли" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Невідомо" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "По порядку" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_По порядку" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Випадково" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Випадково" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "За оцінками" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_За оцінками" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Одна пісня" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Одна пісня" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Помилки розширень" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Вимкнути переглядач" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Розширень не знайдено" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Розширення" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "_Помилки" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Диск" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Номер треку" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "групування" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "_Альбом" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Назва _файлу" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Тривалість" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Список пісень" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "" "Автоматично переходити _до відтворюваної \n" "пісні" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "При зміні пісні переходити до неї в списку програвання" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Інші:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Змінити зовнішній вигляд..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Стовпець" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Назва включає _версію" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Назва файлу включає _каталог" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Налаштування" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Стовпець" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Вибір пісень" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Загальний фільтр" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Пошук" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "При зміні пісні переходити до неї в списку програвання" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "_Рейтинг" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Список альбомів" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Призупинити програвання" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Приріст гучності (дБ):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Приріст гучності (дБ):" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "Корегування гучності Replay Gain" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "Корегування гучності Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "_Рейтинг" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Зберігати рейтинги та лічильники програвань" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Електронна пошта:" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "Рейтинги та лічильники програвань будуть прив'язані до цієї адреси" #: ../quodlibet/qltk/prefs.py:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Скасувати зміни в тегу?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Редагувати теги" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Нова станція" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "_Оновити бібліотеку" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Оновити бібліотеку" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Перевірити наявність змін в бібліотеці" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "_Перезавантажити бібліотеку" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Перезавантажити всі пісні в бібліотеці (це може зайняти багато часу)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "_Сканувати каталоги" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Немає пісень" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Властивості" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Черга" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Видалити всі пісні з черги" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Випадково" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Почати спочатку після програвання всіх пісень" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Призупинити програвання" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Вибір каталогів" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Не вдається додати пісні" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> використовує протокол, що не підтримується." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Музика" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Додати каталог..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Додати файл..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Додати адресу" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Відкрити новий переглядач" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Керування" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Перейти до відтворюваної пісні" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Вигляд" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Довідка" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Зупинитись після цієї пісні" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Закладки" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Редагувати закладки..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Пошук" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Список пісень" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Додати адресу" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Введіть адресу аудіо-файлу:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Не вдалося додати адресу" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> не є правильною адресою." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Додати музику" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Слідкувати за появою нових пісень в цьому каталозі" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Рейтинг" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Рейтинг" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Рейтинг" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Замінити пробіли на підкреслення" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Замінити _Windows-несумісні символи" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Замінити _діакритичні знаки" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Замінити не-_ASCII символи" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Перейменувати файли" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "шаблон" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Редагувати збережені параметри..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Попередній перегляд" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Нова назва" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Не вдалося перейменувати файл" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "_Помилки" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Продовжити" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Неабсолютний шлях" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Пісні, розташовані в цих каталогах (розділені ':'), будуть додані до " "бібліотеки" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "Вибір каталогів" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Збережені значення" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Редагувати збережені параметри..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Пошук" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Зупинитись після цієї пісні" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Обмеження:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "За _оцінками" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Фільтрувати по %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Альбом" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Трек" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Альбом" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Люди" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Дата" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Файл" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Виробництво" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Налаштувати заголовки..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Списки програвання" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Додати до _черги" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Копіювати до пристрою" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Вилучити зі cписку програвання" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Замінити підкреслення на пробіл" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Замінити першу букву кожного слова великою" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "_Розділити на кілька значень" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Теги з імен файлів" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Теги замінять існуючі" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Теги будуть додані до існуючих" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Неправильні теги" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Номери треків" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Починати _з:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Всього треків:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Програвач" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Попередній перегляд" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "%d інших..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Збереження змінених вами пісень." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Перенесення %d/%d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Список програвання %s вже існує." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Файлова система" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Вивести коротку інформацію з користування" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Вивести версію та інформацію про авторські права" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[параметри]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Невідомий параметр '%s'" #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Параметр '%s' вимагає аргументу." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' неоднозначний" #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d Кбіт/с" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунди" msgstr[2] "%d секунд" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d хвилина" msgstr[1] "%d хвилини" msgstr[2] "%d хвилин" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d година" msgstr[1] "%d години" msgstr[2] "%d годин" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d день" msgstr[1] "%d дні" msgstr[2] "%d днів" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:31 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Дату слід вводити в форматі 'РРРР', 'РРРР-ММ-ДД' або 'РРРР-ММ-ДД ГГ:ХХ:СС'" #: ../quodlibet/util/massagers.py:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Підсилення Replay Gain слід вводити в форматі 'x.yy dB'." #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Піки Replay Gain слід вводити в форматі 'x.yy'" #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Статус випуску MusicBrainz повинен бути 'official', 'promotional', або ж " "'bootleg'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Не вдалося редагувати пісню" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Неправильне кодування]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "альбом" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "аранжувальник" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "аранжувальники" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "аранжувальник" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "автор" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "автори" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "композитор" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "композитори" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "композитор" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "диригент" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "диригенти" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "диригент" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "зв'язок" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "авторське право" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "дата" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "опис" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "жанр" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "жанр" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "групування" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "мова" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "ліцензія" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "місце запису" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "автор слів" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "організація" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "назва" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "версія" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "веб-сайт" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "автор альбому" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "ударів на хвилину" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "диск" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "трек" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "ID видавця" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "оригінальна дата випуску" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "оригінальний альбом" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "оригінальний виконавець" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "дата запису" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "Ідентифікатор виконавця MusicBrainz" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "Ідентифікатор TRM MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "Статус альбому MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "Тип альбому MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "підсилення треку" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "пік треку" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "підсилення альбому" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "пік альбому" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Налаштування" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "диски" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "треки" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "востаннє запущено" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "повна назва" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "точка монтування" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "люди" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "рік" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "оригінальна дата випуску" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Закладки" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "формат" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Списки програвання" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Не вдалося відкрити файл" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Неправильне значення" #, fuzzy #~ msgid "ql-revert" #~ msgstr "_Видалити з бібліотеки" #~ msgid "Clear search" #~ 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 "lyricists" #~ 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 "_Продовжити" #, fuzzy #~ 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 "" #~ "%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.5.3/po/he.po����������������������������������������������������������������������������0000644�0001750�0001750�00000475350�12646427552�015345� 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: 2016-01-16 12:54+0100\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 "נגן מוסיקה" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "עורך תגיות שירים" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "ספריה" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "שם" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "א_מן" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "ת_אריך" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "סגנון" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "ד_ירוג" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "מיין לפי תאריך" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "מאפיינים" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "רשימת אלבומים" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "רשימת א_לבומים" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "כל האלבומים" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d אלבום" msgstr[1] "%d אלבומים" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "ה_צג עטיפות אלבומים" msgstr[1] "ה_צג עטיפות אלבומים" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "שירים ללא אלבום" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d רצועה" msgstr[1] "%d רצועות" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d תקליטור" msgstr[1] "%d תקליטורים" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "כל האלבומים" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "מאפייני רשימת אלבומים" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "ה_צג עטיפות אלבומים" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "מיקום" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "תצוגת אלבום" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "תבנית שגויה" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "לא ידוע" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "ערוץ חדש" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "הכנס את הכתובת אינטנרט של ערוץ השמע" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "ערוצי שמע" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_ערוצי שמע" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "הורד_" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "הורד קבצים" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "הורד קובץ" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "לא ניתן להוסיף את הערוץ המבוקש" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "_רענן ספרית שירים" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "מחק קבצים" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "דפדפן הספריה" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "לא ידוע" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "פצל ל_ערכים נפרדים" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_חופשי" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_הסר תחנה" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "תגית" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "מאפייני רשימת אלבומים" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "הסתר דפדפן שירים" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_הסתר דפדפן שירים" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "מערכת קבצים" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_מערכת קבצים" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "לא ניתן להעתיק את השיר" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "לא ניתן להעביר את השירים שנבחרו לרשימת ניגון או לסדר ההשמעה." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "_הוסף לספרית השירים" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "תסדיר זה אינו נתמך" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "לא ניתן להוסיף תחנה" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "רדיו אינטרנט" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "הורד קבצים" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "תחנה חדשה" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "רדיו _אינטרנט" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "תחנה חדשה" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_תחנה חדשה" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "תחנה חדשה" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "לא נמצאו תחנות" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "לא נמצאו תחנות ב %s" #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "כל התחנות שנבחרו כבר נמצאות בספריה שלך" #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "הוסף לרשימת _ניגון" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "ה_סר מרשימת הניגון" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d תחנה" msgstr[1] "%(count)d תחנות" #: ../quodlibet/browsers/media.py:34 msgid "Device Properties" msgstr "מאפייני התקן" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "התקן:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "לא מעוגן" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "נקודת עגינה:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "ש_ם:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "התקני שמע" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "התקני _שמע" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_נתק" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "מאפיינים" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_שנה שם" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "נפח בשימוש <b>%s</b>, פנוי <b>%s</b>" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "ההתקן <b>%s</b> אינו מחובר" #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "מעתיק את <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "לא ניתן להעתיק את השיר" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "אין מספיק מקום פנוי על מנת להעביר את השיר" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "לא ניתן להעתיק את <b>%s</b>" #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "לא ניתן למחוק את השיר" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "מוחק את <b>%s</b> " #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "לא ניתן למחוק את <b>%s</b>" #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "לא ניתן למחוק את השיר" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "ניתוק <b>%s</b> נכשל" #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "לא ניתן לנתק את ההתקן" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "תצוגת חלוניות" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_תצוגת חלוניות" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "ב_חר הכל" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "הכל" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "מאפייני דיפדוף חלוניות" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "רשימות ניגון" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_רשימות ניגון" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "ה_סר מרשימת הניגון" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "יי_בא" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "רשימת ניגון חדשה" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "לא ניתן לייבא את רשימת הניגון" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet מסוגל לייבא רק רשימון ניגון מסוג M3U או PLS." #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "לא ניתן לשנות שם לרשימת הניגון" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "ייבא רשימת ניגון" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_רשימת ניגון חדשה" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "הזן שם עבור התיקיה החדשה:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "" # If not in command line # msgstr "לא ניתן לכתוב אל %s ולכן הוא הוסר" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "מיקום" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "_רענן ספרית שירים" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "הסתר דפדפן שירים" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "" #: ../quodlibet/cli.py:109 msgid "Print the active text query" msgstr "" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 msgid "Start Quod Libet if it isn't running" msgstr "" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "שם קובץ" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "תגית" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "שם קובץ" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "" #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "" #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "התקן לא ידוע" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, python-format msgid "%r is not a supported device." msgstr "" #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "ערך שגוי" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "התקן ה iPod אינו מאותחל" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "האם ברצונך ליצור מסד נתונים ריק ב iPod?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "הגבר עוצמה (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "ה_עתק עטיפות אלבומים" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "מזג תגיות עם ערכים מרובים" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "כלול _גרסה בשם" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "כלול חל_ק באלבום" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "מודל:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "קיבולת:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "קושחה:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "לא ניתן לשמור את מסד הנתונים של ה iPod" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "לא ניתן לשמור את מסד הנתונים של ה iPod" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_תבנית שם קובץ:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "ה_סר תיקיות ועטיפות אלבום שאינן בשימוש" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[קידוד לא נתמך]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "שם" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "עורך תגיות שירים" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_שנה לאות גדולה ראשונה בכל מילה" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "מאפייני דיפדוף חלוניות" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "גודל כללי:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "תצוגת עריכה" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "לפי _דירוג" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "תצוגת עריכה" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_תצוגה מקדימה" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d שניה" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_חופשי" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "שגיאות בהרחבות" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "נגן מוסיקה" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "רדיו אינטרנט" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "מיקום" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 msgid "Hide main window on close" msgstr "" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "מאפיינים" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "שם" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 #, fuzzy msgid "Show notifications" msgstr "אין תחנות חדשות" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 #, fuzzy msgid "Song Notifications" msgstr "אין תחנות חדשות" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "התקן:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "ש_ם:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "אח_רים" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "א_מן" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_תבנית שם קובץ:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "אל_בום אקראי" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "אלבומים" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "לפי _דירוג" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "אל_בום אקראי" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "ייבא רשימת ניגון" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "לא מנגן" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "שיר %d" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "תבנית" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" "השתמש בגלילת העכבר לשינוי עוצמת הקול\n" "לחיצה על Shift וגלילת עכבר יחד להחלפת שיר" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" "השתמש בגלילת העכבר להחלפת שירים\n" "לחיצה על Shift וגלילת עכבר יחד לשינוי עוצמת הקול" #: ../quodlibet/ext/events/trayicon.py:56 #, fuzzy msgid "Scroll _Wheel" msgstr "גלילת עכבר" #: ../quodlibet/ext/events/trayicon.py:83 msgid "Tooltip Display" msgstr "תצוגת בלון" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "לא מנגן" #: ../quodlibet/ext/events/trayicon.py:224 #, fuzzy msgid "Tray Icon" msgstr "מאפייני צלמית מגש המערכת" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_רשימות ניגון" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "נגן" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_תצוגה מקדימה" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 msgid "Play _Order" msgstr "_סדר השמעה" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_חזור" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "עצור לאחר השיר הנוכחי" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_עיין בספרית השירים" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "ע_רוך תגיות" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "מי_דע" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "מילים" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "מילים" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_תצוגה מקדימה" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "סנן לפי _אמן" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_חופשי" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "סנן לפי _סגנון" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "סנן לפי _אמן" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "ערוצי שמע" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "הכנס את הכתובת אינטנרט של ערוץ השמע" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "רשימת ניגון חדשה" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_סדר השמעה" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "מעולם לא" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "עוצמת רצועה מקסימלית" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_שנה שם" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "ספריה" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 msgid "Fit image to _window" msgstr "" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "שם קובץ" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "לא ניתן לשמור שיר" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "רשימת אלבומים" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "גודל" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "חפש:_" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "חפש" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "רשימת אלבומים" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_ערוך סימניות" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_ערוך סימניות" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "סימניות" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "שם קובץ" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "רצועה" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "שם" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "א_מן" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "לא נמצאו הרחבות" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "%d נותרו..." msgstr[1] "%d נותרו..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "סימון סוג אלבום של MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "_סדר השמעה" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "חפש" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "סימון סוג אלבום של MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "פצל תקליטור מתוך _אלבום" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "דפדפנים" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "לא ניתן ליצור תיקיה חדשה" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "רשימת רצועות" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "זמן" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "ב_חר הכל" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_שנה שם" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "תבנית שגויה" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "ערך שגוי" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_חופשי" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "הסתר דפדפן שירים" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_הסר תחנה" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "תצוגת עריכה" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "סנן לפי א_לבום" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "לא ניתן לטעון את השיר המבוקש" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "סנן לפי _סגנון" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_סדר השמעה" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "הצג שגיא_ות" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "שמור" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "ספריה" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "כ_ותרות אלבומים" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "שמור" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "ייבא רשימת ניגון" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_שנה שם" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "לא ניתן לשמור שיר" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "לא נמצאו הרחבות" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "מילים" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "מילים" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "הצג וערוך תגיות בשיר נוכחי" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "רשימות ניגון" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "לא ניתן לייבא את רשימת הניגון" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "ניתוק <b>%s</b> נכשל" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "_רענן ספרית שירים" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "שיר %d" msgstr[1] "%d שירים" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "_רענן ספרית שירים" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "ערוך תגיות" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "ערוך תגיות" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "כל האלבומים" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "חפש" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "תבנית" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "ערוך ערכים שמורים" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "ספריה" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "בודק מחיצות מעוגנות" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "סורק את ספרית השירים" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "סורק %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "_הצג תגיות תיכנותיות" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "תיאור" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "ערך" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "עורך תגיות שירים" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "לא נבחרו שירים" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "_הסר תחנה" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "הסר תגית נבחרת" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 msgid "Remove a tag value" msgstr "" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "הוסף תגית" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "נתוני זמן חסרים" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "לא ניתן לשנות שם קובץ" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "הסר תגית נבחרת" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "קובץ" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "לא נמצאו תחנות" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "לא ניתן ליצור תיקיה חדשה" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "הר_חבות" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "התקן שמע: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "התחלה" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "לא זמין" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "זמן" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "שם סימניה" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "סימניות" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "מ_סננים" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "לא נוגנו מ_עולם" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 ה_פופולארים" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "תחנה חדשה" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "סנן לפי _סגנון" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "סנן לפי _אמן" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "סנן לפי א_לבום" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "ס_גנון אקראי" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "א_מן אקראי" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "אל_בום אקראי" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 השירים שהושמעו מספר הפעמים הרב ביותר (ניתן לבחור יותר מ 40 שירים אם ישנם " "קשרים בינם)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "נתוני זמן חסרים" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_ערך:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "ערכים שמורים" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "ערוך ערכים שמורים" #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "שירים" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "הצג זמן שנשאר לנגן" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_כותרות רצועות" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "כ_ותרות אלבומים" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "יי_צוב עוצמה של Replay Gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "לא ידוע" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "הוסף תגית חדשה" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "קבצים" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "מחק קבצים" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "העבר ל_אשפה" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "מעביר %d/%d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "לא ניתן לשמור את מסד הנתונים של ה iPod" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "ניתוק <b>%s</b> נכשל" #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "מוחק %d/%d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "לא ניתן למחוק קובץ" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "חסר לשיר %d" msgstr[1] "חסר ל %d שירים" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "שונה בשיר %d" msgstr[1] "חסר ל %d שירים" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "פצל ל_ערכים נפרדים" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "פצל תקליטור מתוך _אלבום" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "פצל _גרסה מתוך שם" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "פצל _מעבד מתוך אמן" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "פצל מ_בצע מתוך אמן" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "פצל מ_בצע מתוך אמן" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "פצל _גרסה מתוך שם" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "הוסף תגית" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_תגית:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "לא ניתן להוסיף תגית" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "לא ניתן להוסיף שיר" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "תגית שגויה" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "ערך שגוי" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "הר_חבות" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "מאפייני Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "_פצל ב:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "עריכת תגיות שיר" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "תיקיות" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "תיקיה חדשה" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "בח_ר הכל את כל תתי התיקיות" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "תיקיה חדשה" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "הזן שם עבור התיקיה החדשה:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "לא ניתן ליצור תיקיה חדשה" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "לא ניתן למחוק תיקיה" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "בביצוע %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "תקליטור %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "רצועה %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "תצוגת עריכה" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "לא נבחרו שירים" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "ללא שירים" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "מידע" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "מילים" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "אמן" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "אמנים" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "מבצעים" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "מעולם לא" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "פעם %d" msgstr[1] "%d פעמים" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "נוסף" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "הושמע לאחרונה" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "נוגן" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "דולג" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "דירוג" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "משך השיר" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "מידע" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[קידוד לא נתמך]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "איכות" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "גודל קובץ" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "שונה לאחרונה" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d נבחר" msgstr[1] "%d נבחרו" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "הופק על ידי %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "מבצע" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "רצועה לא זמינה" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "דיסקוגרפיה נבחרת" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "אלבומים" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "משך כללי:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "גודל כללי:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "קבצים" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "הורד_" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "לא נמצאו מילים לשיר" #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "מחפש מילים לשירים..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "לא ניתן להוריד מילים לשיר" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "התעלם משינויים בתגיות?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "תגיות שונו אך לא נשמרו. לשמור את השינויים או לחזור למקור תוך התעלמות " "מהשינויים?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "מעולם לא" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "הקובץ קיים" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "שינוי שמות קבצים" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "לא ידוע" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "לפי הסדר" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "לפי _הסדר" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "מעורבב" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_מעורבב" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "לפי דירוג" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "לפי _דירוג" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "שיר בודד" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_שיר בודד" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "שגיאות בהרחבות" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "הסתר דפדפן שירים" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "לא נמצאו הרחבות" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "הר_חבות" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "הצג שגיא_ות" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_תקליטור" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_רצועה" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "איגוד" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "אל_בום" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_שם קובץ" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "מש_ך" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "רשימת שירים" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_דלג לשיר המושמע באופן אוטומטי" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "כאשר מתחלף שיר מושמע, הצג אותו ברשימת השירים" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "אח_רים" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "תצוגת _עריכה..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "עמודות מוצגות" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "כלול _גרסה בשם" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "כלול _נתיב בשם הקובץ" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "מאפיינים" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "עמודות מוצגות" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "דפדפנים" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "מ_סנן כללי" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "חפש" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "כאשר מתחלף שיר מושמע, הצג אותו ברשימת השירים" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "ד_ירוג" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "רשימת אלבומים" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "הגבר עוצמה (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "הגבר עוצמה (dB):" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "יי_צוב עוצמה של Replay Gain" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "יי_צוב עוצמה של Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "ד_ירוג" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "שמור דירוגים וספירות השמעה" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_דואר אלקטרוני" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "הדירוגים וספירות ההשמעה ישויכו לכותבת הדואר האלקטרוני המופיעה כאן" #: ../quodlibet/qltk/prefs.py:547 #, fuzzy msgid "Auto-save tag changes" msgstr "התעלם משינויים בתגיות?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "ערוך תגיות" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_תחנה חדשה" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "_רענן ספרית שירים" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_רענן ספרית שירים" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "בדוק אם נעשו שינויים בספרית השירים" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "_טען מחדש את ספרית השירים" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "טען את כל השירים בספרית השירים (פעולה זו עלולה לקחת משך זמן ארוך)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "סר_וק ספריות" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "ללא שירים" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "מאפיינים" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_סדר השמעה" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "הסר את כל השירים מסדר ההשמעה" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_נגן בסדר אקראי" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "התחל מחדש את רשימת הניגון בהגיעה לסופה" #: ../quodlibet/qltk/quodlibetwindow.py:374 msgid "Playback Error" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "בחר ספריות" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "לא ניתן להוסיף שיר או שירים" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "ב <b>%s</b> מתבצע שימוש בתסדיר אשר אינו נתמך" #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_מוסיקה" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "הוסף _תיקיה..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "ה_וסף קובץ..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "הוסף כתובת" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "תצוגת חלוניות" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_בקרה" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_דלג לשיר מושמע" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_תצוגה" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_עזרה" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "עצור לאחר השיר הנוכחי" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "סימניות" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_ערוך סימניות" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "חפש" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "רשימת _שירים" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "הוסף כתובת" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "הכנס את הכתובת אינטנרט של קובץ המוסיקה:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "לא ניתן להוסיף את הנתיב שצוין" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "הנתיב <b>%s</b> אינו נתיב חוקי" #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "הוסף מוסיקה" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "עקוב אחר שירים חדשים בתיקייה זו" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "ד_ירוג" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_הסר תחנה" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_הסר תחנה" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "החלף _רווחים בקווים תחתיים" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "הסר תווים שאינם נתמכים ב_חלונות" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "הסר תווי _הטייה" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "ה_סר תווים שאינם תווי ASCII" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "שינוי שמות קבצים" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "תבנית" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "ערוך ערכים שמורים" #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_תצוגה מקדימה" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "שם חדש" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "לא ניתן לשנות שם קובץ" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "הצג שגיא_ות" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "המ_שך" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "הנתיב אינו מלא" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "שירים בספריות אלו (מופרדות ב ':') יוספו לספרית השירים שלך" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "בחר ספריות" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "ערכים שמורים" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "ערוך ערכים שמורים" #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "חפש" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "עצור לאחר השיר הנוכחי" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_גבול:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "לפי _דירוג" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_מיין לפי %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "כ_ותרות אלבומים" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_כותרות רצועות" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "כ_ותרות אלבומים" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "כותרות _מבצעים" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "כותרות ת_אריך" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "כו_תרות קבצים" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "כות_רות הפקה" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "כותרות _מותאמות אישית..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "רשימות ניגון" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "הו_סף לסדר ההשמעה" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "ה_עתק להתקן שמע חיצוני" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "ה_סר מרשימת הניגון" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "החלף _קווים תחתיים ברווחים" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_שנה לאות גדולה ראשונה בכל מילה" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "פצל ל_תגיות נפרדות" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "תגיות משם הקובץ" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "תגיות מחליפות תגיות קיימות" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "תגיות נוספות לתגיות קיימות" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "תגיות שגויות" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "תצוגת עריכה" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "מספרי רצועות" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "התחל _מ:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_סך הכל רצועות:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "נגן" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_תצוגה מקדימה" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "%d נותרו..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "שומר שירים שבוצעו בהם שינויים..." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "מעביר %d/%d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "רשימת ניגון בשם %s כבר קיימת" #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "מערכת קבצים" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "" #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "" #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "" #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d שניה" msgstr[1] "%d שניות" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d דקה" msgstr[1] "%d דקות" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d שעה" msgstr[1] "%d שעות" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d יממה" msgstr[1] "%d יממות" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "לא_רלוונטי_בעברית" #: ../quodlibet/util/massagers.py:31 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:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "על הגברת העוצמה של Replay Gain להיות מוזנת בתצורה 'x.yy dB'" #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "על העוצמת המירבית של Replay Gain להיות מוזנת בתצורה 'x.yy dB'" #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "סטטוס של MusicBrainz יכול להיות 'official' (רשמי), 'promotional' (לצרכי " "קידום) או 'bootleg' (לא רשמי)." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "לא ניתן לערוך שיר" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[קידוד לא נתמך]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "אלבום" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "עיבוד" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "עיבוד" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "עיבוד" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "מחבר" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "מחברים" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "מלחין" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "מלחינים" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "מלחין" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "מנצח" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "מנצחים" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "מנצח" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "איש קשר" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "זכויות יוצרים" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "תאריך" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "תיאור" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "סגנון" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "סגנון" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "איגוד" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "שפה" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "רישוי" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "מיקום" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "מילים" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "ארגון" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "שם" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "גרסה" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "אתר אינטרנט" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "אמן האלבום" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "תקליטור" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "רצועה" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "זיהוי תגית" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "תאריך הפצה מקורי" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "אלבום מקורי" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "אמן מקורי" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "הוקלט" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "סימון אמן של MusicBrainz" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "סימון TRM של MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "סימון PUID של MusicIP" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "סימון MusicBrainz של מצב אלבום " #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "סימון סוג אלבום של MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "הגברת רצועה" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "עוצמת רצועה מקסימלית" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "הגברת אלבום" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "עוצמת אלבום מקסימלית" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "מאפיינים" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "תקליטורים" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "רצועות" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "נוגן לאחרונה" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "שם מלא" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "נקודת עגינה" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "יוצרים" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "שנה" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "תאריך הפצה מקורי" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "סימניות" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "תסדיר" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "רשימות ניגון" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "לא ניתן לפתוח את הקבצים" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "ערך שגוי" #, fuzzy #~ msgid "ql-revert" #~ msgstr "_הסר" #~ msgid "Clear search" #~ 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 "lyricists" #~ 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 "המ_שך" #, fuzzy #~ msgid "Confirm rating" #~ 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.5.3/po/ko.po����������������������������������������������������������������������������0000644�0001750�0001750�00000456432�12646427552�015362� 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: 2016-01-16 12:54+0100\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 "음악 재생기" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "오디오 태그 편집기" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "디렉토리" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "제목" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "아티스트" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "날짜" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "장르" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "재생율" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "날짜 순 정렬" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "설정" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "앨범 목록" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "앨범 목록" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "모든 앨범" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d 앨범" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "앨범 표지 보이기" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "앨범에 없는 노래" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d 트랙" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d 디스크" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "모든 앨범" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "앨범 목록 설정" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "앨범 표지 보이기" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[옵션]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "앨범 표시" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "유효하지 않은 양식" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Unknown" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "새 피드" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "오디오 피드의 주소를 입력하십시오:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "오디오 피드" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "오디오 피드" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "내려받기" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "파일 내려받기" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "파일 내려받기" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "피드를 추가할 수 없습니다" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "라이브러리 새로고침" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "파일 지우기" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "라이브러리 브라우저" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d song (%(time)s)" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Unknown" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Split into _Multiple Values" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Custom" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "재생율" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "태그" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "앨범 목록 설정" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "브라우저 비활성" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "브라우저 비활성" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "파일 시스템" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "파일 시스템" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "노래를 복사할 수 없습니다" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "선택한 파일은 다른 노래 목록이나 대기열로 복사 할 수 없습니다." #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "라이브러리 추가" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "지원하지 않는 파일 형식" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "방송국을 추가할 수 없습니다" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "인터넷 라디오" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "파일 내려받기" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "새방송국" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "인터넷 라디오" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "새방송국" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "새 방송국" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "새방송국" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "발견된 방송국이 없습니다" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%s 에서 발견된 인터넷 라디오 방송국이 없습니다." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "목록에 있는 모든 방송국은 이미 라이브러리에 존재합니다." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "재생목록 추가" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "재생목록으로부터 제거" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d station" #: ../quodlibet/browsers/media.py:34 #, fuzzy msgid "Device Properties" msgstr "등록정보" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "마운트 지점" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "이름:" #: ../quodlibet/browsers/media.py:133 #, fuzzy msgid "Media Devices" msgstr "오디오 장치: %s" #: ../quodlibet/browsers/media.py:134 #, fuzzy msgid "_Media Devices" msgstr "오디오 장치: %s" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 #, fuzzy msgid "_Eject" msgstr "선택" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "등록정보" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "이름 바꾸기" #: ../quodlibet/browsers/media.py:459 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 #, fuzzy msgid "Unable to copy song" msgstr "노래를 복사할 수 없습니다" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/browsers/media.py:543 #, fuzzy msgid "Unable to delete songs" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/browsers/media.py:577 #, fuzzy msgid "Unable to delete song" msgstr "노래를 편집할 수 없습니다" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/browsers/media.py:595 #, fuzzy msgid "Unable to eject device" msgstr "파일 삭제에 실패했습니다" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Paned Browser" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "모두 선택" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "All" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Paned Browser 설정" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "재생목록" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "재생목록" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "재생목록으로부터 제거" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "가져오기" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "새 재생목록" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "재생목록을 가져올 수 없습니다" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet 은 M3U 와 PLS 포맷에서만 재생목록을 가져올 수 있습니다." #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "재생목록 이름을 바꿀 수 없습니다" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "재생목록 가져오기" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "새 재생목록" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "새 폴더 이름을 입력하십시오:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet 이 실행중이 아닙니다." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "음악 라이브러리 및 재생기" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[옵션]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "재생중인 노래 표시 후 마침" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "곧 노래 시작" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "다음 노래로 가기" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "이전 노래로 가기" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "연주 시작" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "연주 일시정지" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "재생/일시정지 토글(Toggle) 모드" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "연주 시작" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "음량 증가" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "음량 감소" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "재생기 상태 표시" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "메인 창 숨기기" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "메인 창 보이기" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "메인 창 표시 토글(Toggle)" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "실행중인 재생기 강조" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "라이브러리 새로고침" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "브라우저 비활성" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "현재 재생목록 표시" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "대기열 내용 표시" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "대기열 내용 표시" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet 이 실행중이 아닙니다." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Quod Libet 마침" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "재생중인 노래에서 탐색" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "연주 순서 지정 또는 토글(Toggle)" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "반복 끄기, 켜기, 토글(Toggle)" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "음량 설정" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "오디오 라이브러리 검색" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "쿼리" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "파일 재생" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "파일이름" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "재생율" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "현재 브라우저 지정" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "새 브라우저 열기" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "대기열 보이기 및 숨기기" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "메인 노래 목록 보이기 및 숨기기" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "임의의 값으로 필터" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "태그" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "태그 값으로 필터" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "파일이름" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 #, fuzzy msgid "Unqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "에러: '%s' 에 유효하지 않은 인자." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "에러: %s --help 를 시도해 보십시오." #: ../quodlibet/devices/_base.py:63 #, fuzzy msgid "Unknown Device" msgstr "Unknown" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "에러: '%s' 는 유일한 prefix 가 아닙니다." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "유효하지 않은 값" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "앨범 표지 보이기" #: ../quodlibet/devices/ipod.py:139 #, fuzzy msgid "Combine tags with _multiple values" msgstr "Split into multiple _values" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "버전을 포함하는 제목" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "파트(part)를 포함하는 앨범" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "라이브러리를 저장할 수 없습니다" #: ../quodlibet/devices/ipod.py:313 #, fuzzy msgid "Unable to save iPod database" msgstr "라이브러리를 저장할 수 없습니다" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "파일이름" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[유효하지 않은 인코딩]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "제목" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "오디오 태그 편집기" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Title-case tags" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Paned Browser 설정" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "총 크기:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "무게" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "미리보기" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d 초" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Custom" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "플러그인 에러" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "음악 재생기" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "인터넷 라디오" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "주소" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "메인 창 숨기기" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "설정" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "제목" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 msgid "_Service:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "이름:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Others:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "아티스트" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "파일이름" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "임의의 앨범" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "앨범" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "무게" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "임의의 앨범" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "재생목록 가져오기" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Not playing" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d 곡" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "양식" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Edit Display" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Not playing" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "재생목록" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "재생기" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "미리보기" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "재생순서:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "반복" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "이 노래 후 정지" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "라이브러리 브라우저" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "태그 편집" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "정보" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "가사" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "가사" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "미리보기" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "아티스트 필터" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Custom" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "장르 필터" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "아티스트 필터" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "오디오 피드" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "오디오 피드의 주소를 입력하십시오:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "새 재생목록" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "대기열" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Never" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "track peak" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "이름 바꾸기" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "라이브러리" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "메인 창 숨기기" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "파일이름" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "노래를 저장할 수 없습니다" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "앨범 목록" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "크기" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "검색:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "검색" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "앨범 목록" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "북마크 편집" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "북마크 편집" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "북마크" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "파일이름" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "트랙" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "제목" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "아티스트" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "발견된 플러그인이 없습니다" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "and %d more..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "쿼리" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "검색" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Split Disc out of _Album" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "브라우저" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "폴더를 생성할 수 없습니다" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "트랙 목록" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "시간" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "모두 선택" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "이름 바꾸기" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "유효하지 않은 양식" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "유효하지 않은 값" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Custom" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "브라우저 비활성" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "재생율" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "재생율" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Edit Display" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "재생율" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "태그 값으로 필터" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer 는 선택한 노래를 불러올 수 없습니다." #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "장르 필터" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "대기열" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "에러 보이기" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "쓰기" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "디렉토리" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Album Headers" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "쓰기" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "재생목록 가져오기" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "이름 바꾸기" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "노래를 저장할 수 없습니다" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "발견된 플러그인이 없습니다" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "가사" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "가사" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "재생목록" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "재생목록을 가져올 수 없습니다" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b> 삭제 실패." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "라이브러리 새로고침" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d 곡" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "라이브러리 새로고침" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "태그 편집:" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "태그 편집:" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "모든 앨범" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "검색" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "양식" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "저장된 값 편집..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "라이브러리" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "마운트 지점 확인" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "라이브러리 스캐닝" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "스캐닝 %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "설명" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "값" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "오디오 태그 편집기" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "선택한 노래가 없습니다." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "태그 값으로 필터" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "태그 값으로 필터" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "정보에 시간이 없습니다" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "파일이름 변경을 할 수 없습니다" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "파일" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "발견된 방송국이 없습니다" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "폴더를 생성할 수 없습니다" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "플러그인" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "지원 포맷: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "오디오 장치: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "시작" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "시간" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "북마크 이름" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "북마크" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "필터" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Never Played" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "새방송국" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "장르 필터" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "아티스트 필터" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "앨범 필터" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "임의의 장르" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "임의의 아티스트" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "임의의 앨범" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "최대 40 곡이 재생되었습니다" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "정보에 시간이 없습니다" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "값:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "저장된 값" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "저장된 값 편집..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "노래" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "남은 시간 표시" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Track Headers" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Album Headers" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Unknown" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "태그 값으로 필터" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "파일" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:90 #, fuzzy msgid "_Delete Files" msgstr "파일 지우기" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "휴지통으로 이동" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%d/%d 이동" #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "라이브러리를 저장할 수 없습니다" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%d/%d 삭제" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "파일 삭제에 실패했습니다" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "missing from %d song" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "different across %d song" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "Split into _Multiple Values" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Split Disc out of _Album" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Split Arranger out of Ar_tist" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "태그 추가" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "태그:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "태그를 추가할 수 없습니다" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "유효하지 않은 태그" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "유효하지 않은 값" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "플러그인" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso 설정" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Split _on:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "태그 편집" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "폴더" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "새 폴더" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "하위폴더 모두 선택" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "새 폴더" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "새 폴더 이름을 입력하십시오:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "폴더를 생성할 수 없습니다" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "폴더를 지울 수 없습니다" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "아티스트: %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "%s 디스크" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "%s 트랙" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Edit Display" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "선택한 노래가 없습니다." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "No Songs" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "정보" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "가사" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "아티스트" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "아티스트" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "연주" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Never" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 회" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "추가" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "마지막 재생" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "재생" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "통과" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "재생율" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "길이" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "정보" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[유효하지 않은 인코딩]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "비트율" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "파일 크기" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "수정" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d 선택" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "기획: %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "연주" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "트랙을 이용할 수 없습니다" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "앨범이 없는 노래 %d 곡" #: ../quodlibet/qltk/information.py:490 msgid "Selected Discography" msgstr "Selected Discography" #: ../quodlibet/qltk/information.py:543 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "아티스트가 없는 노래 %d 곡" #: ../quodlibet/qltk/information.py:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "앨범" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "총 길이:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "총 크기:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "파일" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "내려받기" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "이 노래를 위한 가사가 없습니다" #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "가사 검색중..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "가사를 내려받을 수 없습니다" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "변경된 태그를 버릴까요?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "태그가 변경되었으나 저장되지 않았습니다. 이 파일을 저장할까요? 아니면 변경사" "항을 무시하고 이전으로 되돌릴까요?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Never" #: ../quodlibet/qltk/msg.py:85 #, fuzzy msgid "File exists" msgstr "파일 시스템" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "파일이름 바꾸기" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Unknown" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "순서대로" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "순서대로" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "섞어서" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "섞어서" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "무거운거로" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "무거운거로" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "선택한 노래" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "선택한 노래" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "플러그인 에러" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "브라우저 비활성" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "발견된 플러그인이 없습니다" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "플러그인" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "에러 보이기" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "디스크" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "트랙" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "그룹" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "앨범" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "파일이름" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "길이" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "노래 목록" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "자동으로 현재 재생중인 노래로 가기" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Others:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Edit Display..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "칼럼 표시" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "버전을 포함하는 제목" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "폴더를 포함하는 파일이름" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "설정" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "칼럼 표시" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "브라우저" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "전역 필터:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "검색" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "재생율" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "앨범 목록" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "연주 일시정지" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "재생율" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Save ratings and play counts" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "전자메일:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "변경된 태그를 버릴까요?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "태그 편집:" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "새 방송국" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "라이브러리 새로고침" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "라이브러리 새로고침" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "라이브러리 변경 체크" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "라이브러리 새로불러오기" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "라이브러리의 모든 노래를 새로불러오기" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "디렉토리 스캔" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "No Songs" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "등록정보" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "대기열" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "대기열의 모든 노래 지우기" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "임의로" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "완료후 재생목록 재시작" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "연주 일시정지" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "디렉토리 선택" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> 는 지원하지 않는 프로토콜을 사용하고 있습니다." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "음악" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "폴더 추가..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "파일 추가..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "주소 추가" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "새 브라우저 열기" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "조정" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "현재 재생중인 노래로 가기" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "보기" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "도움말" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "이 노래 후 정지" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "북마크" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "북마크 편집" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "검색" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "노래 목록" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "주소 추가" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "오디오 파일의 주소를 입력하십시오:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "주소를 추가할 수 없습니다" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "음악 추가" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "새 노래를 위해 이 폴더 감시" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "재생율" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "재생율" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "재생율" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Replace spaces with _underscores" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Strip _Windows-incompatible characters" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Strip _diacritical marks" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Strip non-_ASCII characters" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "파일이름 바꾸기" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "양식" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "저장된 값 편집..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "미리보기" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "새 이름" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "파일이름 변경을 할 수 없습니다" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "에러 보이기" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "계속" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "절대경로가 아닙니다" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "디렉토리 선택" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "저장된 값" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "저장된 값 편집..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "검색" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "이 노래 후 정지" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "제한:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "무게" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filter on %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Track Headers" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_People Headers" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Date Headers" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_File Headers" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Production Headers" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Customize Headers..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "재생목록" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "대기열 추가" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "재생목록으로부터 제거" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Replace _underscores with spaces" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Title-case tags" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Split into multiple _values" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tags From Path" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Tags replace existing ones" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tags are added to existing ones" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "유효하지 않은 태그" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Edit Display" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "트랙 번호" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "시작:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "총 트랙:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "재생기" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "미리보기" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "and %d more..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "변경한 노래 저장" #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "%d/%d 이동" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "%s 재생목록은 이미 존재합니다." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "파일 시스템" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "사용 정보 개요 표시" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "버전 및 저작권 표시" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[옵션]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "에러: '%s' 는 알 수 없는 옵션입니다." #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "에러: '%s' 는 인자를 요구하는 옵션입니다." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "에러: '%s' 는 유일한 prefix 가 아닙니다." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d 초" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d 분" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d 시간" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d 일" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "노래를 편집할 수 없습니다" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[유효하지 않은 인코딩]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "앨범" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "편곡" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "편곡" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "편곡" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "작가" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "작가" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "작곡" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "작곡" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "작곡" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "지휘" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "지휘" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "지휘" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "연락" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "저작권" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "날짜" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "설명" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "장르" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "장르" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "그룹" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "언어" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "라이센스" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "주소" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "작사" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "조직" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "제목" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "버전" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "웹사이트" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "앨범 아티스트" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "디스크" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "트랙" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "라벨 ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "오리지널 출시 날짜" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "오리지널 앨범" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "오리지널 아티스트" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "녹음 날짜" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz album type" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "track gain" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "track peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "설정" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "디스크" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "트랙" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "마지막 시작" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "성명(FullName)" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "마운트 지점" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "가수" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "년" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "오리지널 출시 날짜" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "북마크" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "포맷" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "재생목록" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "파일을 열 수 없습니다" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "유효하지 않은 값" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "Clear search" #~ msgstr "검색 초기화" #~ 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 "lyricists" #~ 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 "계속" #, fuzzy #~ 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 "" #~ "%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.5.3/po/fi.po����������������������������������������������������������������������������0000644�0001750�0001750�00000457725�12646427552�015355� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "äänitiedostojen tunniste-editori" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "hakemisto" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Nimi" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artisti" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Päivämäärä" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "tyylilaji" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "Ar_vosana" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Järjestys: päivämäärä" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Asetukset" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albumilista" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albumilista" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Kaikki albumit" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d albumi" msgstr[1] "%d albumia" #: ../quodlibet/browsers/albums/main.py:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Kappaleet, jotka eivät ole millään albumilla" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d raita" msgstr[1] "%d raitaa" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d levy" msgstr[1] "%d levyä" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Kaikki albumit" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Albumilistan asetukset" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Näytä albumien _kannet" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[valitsimet]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Albuminäkymä" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Virheellinen hakukaava" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Tuntematon" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Uusi syöte" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Syötä äänisyötteen sijainti:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Äänisyötteet" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "Äänis_yötteet" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Lataa" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Lataa tiedostoja" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Lataa tiedosto" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Syötettä ei voitu lisätä" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "_Virkistä kirjasto" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Poista tiedostot" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Kirjaston selain" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Tuntematon" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Jaa _useammaksi arvoksi" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Mukautettu" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Ar_vosana" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tunniste" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Albumilistan asetukset" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Sulje selain" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "S_ulje selain" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Tiedostojärjestelmä" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "Tie_dostojärjestelmä" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Kappaleiden kopiointi epäonnistui" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Lisää kirjastoon" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Tiedostomuotoa ei tueta" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Kanavaa ei voitu lisätä" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internetradio" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Lataa tiedostoja" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Uusi kanava" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "I_nternetradio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Uusi kanava" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Uusi kanava" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Uusi kanava" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Kanavia ei löytynyt." #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Internetradiokanavia ei löytynyt sijainnista %s." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Kaikki luetellut kanavat ovat jo kirjastossasi." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Lisää soittolistaan" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Poista Soittolistalta" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Laitteen ominaisuudet" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Laite:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Ei liitetty" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Liitoskohta:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Nimi:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Medialaitteet" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Medialaitteet" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Irrota laite" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Ominaisuudet" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Nimeä" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> ei ole yhdistetty." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopioidaan <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Kappaletta ei voi kopioida" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Kappaleelle ei ole riittävästi tilaa." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "Kohdetta <b>%s</b> ei voitu kopioida." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Kappaleita ei voi poistaa" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Poistetaan <b>%s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "Kohdetta <b>%s</b> ei voitu poistaa." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Kappaletta ei voi poistaa" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Laitteen <b>%s</b> irrottaminen epäonnistui." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Laitetta ei voi irrottaa" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Paneeliselain" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Paneeliselain" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Valitse _Kaikki" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Kaikki" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Paneeliselaimen asetukset" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Soittolistat" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Soittolistat" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Poista Soittolistalta" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Tuo" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Uusi soittolista" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Soittolistan tuonti ei onnistu" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Soittolistan nimeäminen ei onnistu" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Tuo soittolista" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Uusi soittolista" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Anna uuden kansion nimi:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet ei ole käynnissä." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "musiikkikirjasto ja soitin" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[valitsimet]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Tulosta soiva kappale ja poistu" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Aloita soitto välittömästi" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Hyppää seuraavaan kappaleeseen" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Hyppää edelliseen kappaleeseen" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Aloita soitto" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Keskeytä soitto" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Keskeytä soitto tai jatka sitä" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Aloita soitto" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Lisää äänenvoimakkuutta" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Vähennä äänenvoimakkuutta" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Tulosta soittimen tila" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Piilota pääikkuna" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Näytä pääikkuna" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Piilota tai näytä pääikkuna" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Kohdista käynnissä olevaan soittimeen" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Poista aktiiviset selainsuodattimet" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "_Virkistä kirjasto" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Sulje selain" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Tulosta nykyinen soittolista" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Tulosta jonon sisältö" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Tulosta jonon sisältö" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet ei ole käynnissä." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Poistu Quod Libetistä" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Siirry soitettavassa kappaleessa" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Aseta tai vaihda soittojärjestystä" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "" "Aseta soitontoisto päälle, pois, tai vaihda\n" " sen tilaa" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Aseta äänenvoimakkuus" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Hae äänikirjastostasi" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "kysely" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Soita tiedosto" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "tiedostonimi" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Arvostele soiva kappale" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Valitse nykyinen selain" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Avaa uusi selain" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Näytä tai piilota jono" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Näytä tai piilota soittolista" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Suodata satunnaisen arvon perusteella" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tunniste" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tunniste=arvo" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Lisää tiedosto tai kysely jonoon" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "tiedostonimi" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Poista tiedosto tai kysely jonosta" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "VIRHE: Virheellinen argumentti valitsimelle \"%s\"" #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "VIRHE: Kokeile kirjoittaa %s --help" #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Tuntematon laite" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "VIRHE: '%s' ei ole ainutkertainen etuliite." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Virheellinen arvo" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Alustamaton iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Haluatko luoda iPodiin tyhjän tietokannan?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Äänen vahvistus (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopioi _albumien kannet" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Yhdistä _moniarvoiset tunnisteet" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Nimi sisältää v_ersion" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Albumi sisältää _osan" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Malli:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Tallennustila:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Laiteohjelmisto:" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "VAROITUS: poistetaan orvoksi jäänyt iPod-kappale" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "iPod-tietokantaa ei voi tallentaa" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "iPod-tietokantaa ei voi tallentaa" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Tiedoston hakukuvio:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Poista käyttämättömät kannet ja hakemistot" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Virheellinen koodaus]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Nimi" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Äänitiedostojen tunniste-editori" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Isot alkukirjaimet tunnisteisiin" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Paneeliselaimen asetukset" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Koko yhteensä:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Painoarvo" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Esikatsele" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d sekunti" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Mukautettu" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Tyhje_nnä virheet" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Musiikkisoitin" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internetradio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "sijainti" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Piilota pääikkuna" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Asetukset" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Nimi" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Laite:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Nimi:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "M_uut:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artisti" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Tiedoston hakukuvio:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Satunnainen alb_umi" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albumit" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Painoarvo" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Satunnainen alb_umi" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Tuo soittolista" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Soitto katkaistu" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d kappale" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "hakukaava" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Soitto katkaistu" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Soittolistat" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Soitin" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Esikatsele" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Soittotapa:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "Soiton_toisto" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Pysäytä tämän kappaleen jälkeen" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Selaa kirjastoa" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Muokkaa t_unnisteita" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "T_iedot" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Sanat" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Sanat" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Esikatsele" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Suodata _artistin perusteella" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Mukautettu" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Suodata t_yylilajin perusteella" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Suodata _artistin perusteella" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Äänisyötteet" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Syötä äänisyötteen sijainti:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Uusi soittolista" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "J_ono" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Ei koskaan" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "raidan huippu" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Nimeä" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Kirjasto" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Piilota pääikkuna" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Tiedostonimi" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Kappaletta ei voi tallentaa" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Albumilista" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Koko" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Hae:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Hae" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Albumilista" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Muokkaa kirjanmerkkejä..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Muokkaa kirjanmerkkejä..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Kirjanmerkit" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Tiedostonimi" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Raita" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Nimi" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Artisti" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Liitännäisiä ei löytynyt." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "ja %d muuta..." msgstr[1] "ja %d muuta..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz albumin tyyppi" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "kysely" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Hae" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz albumin tyyppi" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Erota levyn numero _albumin nimestä" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Selaimet" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Kansiota ei voi luoda" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Kappaleet" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Aika" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Valitse _Kaikki" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "tunniste" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Nimeä" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "tunniste" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Virheellinen hakukaava" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Virheellinen arvo" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Mukautettu" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Sulje selain" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Ar_vosana" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "Ar_vosana" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Ar_vosana" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Suodata t_yylilajin perusteella" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "J_ono" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Virheet" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Kirjoita" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "hakemisto" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Albumiotsakkeet" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Kirjoita" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Tuo soittolista" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Nimeä" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Kappaletta ei voi tallentaa" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Liitännäisiä ei löytynyt." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Sanat" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Sanat" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Soittolistat" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Soittolistan tuonti ei onnistu" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "_Virkistä kirjasto" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d kappale" msgstr[1] "%d kappaletta" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "_Virkistä kirjasto" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Muokkaa tunnisteita" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Muokkaa tunnisteita" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Kaikki albumit" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Hae" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "hakukaava" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Muokkaa tallennettuja arvoja..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Kirjasto" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Tarkistetaan liitoskohdat" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Luetaan musiikkikirjastoa" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Luetaan kohdetta %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Näytä _ohjelmalliset tunnisteet" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "kuvaus" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Arvo" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Äänitiedostojen tunniste-editori" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Ei kappaleita valittuna" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Ei aikatietoa" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Tiedoston nimeäminen ei onnistu" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Tiedosto" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Kanavia ei löytynyt." #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Kansiota ei voi luoda" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "Liitä_nnäiset" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Tuetut tiedostomuodot: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Äänilaite: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Alku" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "-" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Aika" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Kirjanmerkin nimi" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Kirjanmerkit" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "S_uodattimet" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Ei soitettu koskaan" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Uusi kanava" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Suodata t_yylilajin perusteella" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Suodata _artistin perusteella" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Suodata al_bumin perusteella" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Satunnainen _tyylilaji" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Satunnainen a_rtisti" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Satunnainen alb_umi" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Ei aikatietoa" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Arvo:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Tallennetut arvot" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Muokkaa tallennettuja arvoja..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Kappaleet" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Näytä jäljellä oleva aika" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "_Raitaotsakkeet" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Albumiotsakkeet" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Replay Gain äänenvoimakkuuden säätö" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Tuntematon" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Tiedostot" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Poista tiedostot" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Siirrä roskakoriin" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Siirretään %d/%d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "iPod-tietokantaa ei voi tallentaa" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Laitteen <b>%s</b> irrottaminen epäonnistui." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Poistetaan %d/%d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Tiedoston poistaminen epäonnistui" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Jaa _useammaksi arvoksi" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Erota levyn numero _albumin nimestä" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Erota _versio kappaleen nimestä" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Erota sovittaja ar_tistin nimestä" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Erota _esittäjä artistin nimestä" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Erota _esittäjä artistin nimestä" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Erota _versio kappaleen nimestä" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Lisää tunniste" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tunniste:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Tunnistetta ei voi lisätä" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Kappaletta ei voitu lisätä" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Virheellinen tunniste" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Virheellinen arvo" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "Liitä_nnäiset" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falson Asetukset" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "_Erotin:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Tunnisteiden muokkaus" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Kansiot" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Uusi kansio" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Valitse alihakemistot" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Uusi kansio" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Anna uuden kansion nimi:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Kansiota ei voi luoda" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Kansiota ei voi poistaa" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "%s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Levy %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Raita %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Muokkaa näkymää" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Ei kappaleita valittuna" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Ei kappaleita" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Tiedot" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Sanat" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artisti" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artistit" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "esittäjää" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Ei koskaan" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d kerran" msgstr[1] "%d kertaa" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "lisätty" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "soitettu" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "soittokertoja" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "ohituksia" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "arvosana" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "kesto" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Tiedot" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Virheellinen koodaus]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bittinopeus" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "tiedostokoko" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "muokattu" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d valittu" msgstr[1] "%d valittu" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Tuottanut %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "esittäjä" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Raita ei ole käytettävissä" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Valittu diskografia" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albumit" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Kesto yhteensä:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Koko yhteensä:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Tiedostot" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Lataa" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Kappaleelle ei löydy sanoja." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Etsitään laulun sanoja..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Laulun sanojen lataaminen ei onnistu" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Hylkää muutokset tunnisteisiin?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Ei koskaan" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Tiedosto on olemassa" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Nimeä tiedostot" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Tuntematon" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Järjestyksessä" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_Järjestyksessä" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Sekoitettu" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Sekoita" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Painotettu" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Painotettu" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Yksi kappale" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Yksi kappale" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Liitännäisten virheet" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Sulje selain" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Liitännäisiä ei löytynyt." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "Liitä_nnäiset" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Näytä _Virheet" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Levy" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Raita" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "ryhmittely" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_bumi" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Tie_dostonimi" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Kesto" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Kappalelista" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Hyppää soivaan kappaleeseen automaattisesti" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "M_uut:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Muokkaa näkymää..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Näytettävät sarakkeet" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Nimi sisältää v_ersion" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Tiedostonimi sisältää hake_miston" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Asetukset" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Näytettävät sarakkeet" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Selaimet" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Yleissuodatin:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Hae" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "Ar_vosana" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Albumilista" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Keskeytä soitto" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Äänen vahvistus (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Äänen vahvistus (dB):" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Replay Gain äänenvoimakkuuden säätö" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Replay Gain äänenvoimakkuuden säätö" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Ar_vosana" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Tallenna arvosanat ja soittomäärät" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Sähköposti:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Hylkää muutokset tunnisteisiin?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Muokkaa tunnisteita" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Uusi kanava" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "_Virkistä kirjasto" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Virkistä kirjasto" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Etsi muutoksia kirjastostasi" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Lataa kirjasto _uudelleen" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Käy läpi _hakemistot" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Ei kappaleita" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Ominaisuudet" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "J_ono" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Poista kaikki kappaleet jonosta" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "Satunnainen al_bumi" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Aloita soittolista alusta, kun kaikki kappaleet on soitettu" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Keskeytä soitto" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Valitse hakemistot" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Kappaleita ei voi lisätä" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "Kohteen <b>%s</b> käyttämää protokollaa ei tueta." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Musiikki" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "Lisää _kansio..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "Lisää _tiedosto..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Lisää sijainti" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Avaa uusi selain" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "O_hjaus" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Hyppää soivaan kappaleeseen" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Näytä" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Ohje" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Pysäytä tämän kappaleen jälkeen" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Kirjanmerkit" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Muokkaa kirjanmerkkejä..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Hae" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Kappalelista" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Lisää sijainti" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Syötä äänitiedoston sijainti:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Sijaintia ei voi lisätä" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> ei ole kelvollinen sijainti." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Lisää musiikkia" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Tarkkaile tätä kansiota uusien kappaleitten varalta" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "Ar_vosana" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "Ar_vosana" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "Ar_vosana" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Korvaa _välilyönnit alaviivoilla" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Poista _Windows-yhteensopimattomat merkit" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Poista ta_rkkeet" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Poista _ASCII:hin kuulumattomat merkit" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Nimeä tiedostot" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "hakukaava" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Muokkaa tallennettuja arvoja..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Esikatsele" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Uusi nimi" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Tiedoston nimeäminen ei onnistu" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "Näytä _Virheet" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Jatka" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Polku ei ole absoluuttinen" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Valitse hakemistot" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Tallennetut arvot" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Muokkaa tallennettuja arvoja..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Hae" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Pysäytä tämän kappaleen jälkeen" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Rajoite:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Painoarvo" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Suodata sarakkeen \"%s\" perusteella" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Albumiotsakkeet" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "_Raitaotsakkeet" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Albumiotsakkeet" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Tekijäotsakkeet" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Ai_kaotsakkeet" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Tie_dosto-otsakkeet" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "T_uotanto-otsakkeet" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Mukauta otsakkeita..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Soittolistat" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Lisää _jonoon" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopioi laitteeseen" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Poista Soittolistalta" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Korvaa alaviivat _välilyönneillä" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Isot alkukirjaimet tunnisteisiin" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Jaa _useampaan arvoon" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tunnisteet polusta" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Tunnisteet korvaavat olemassaolevat" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Tunnisteet lisätään olemassaoleviin" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Tunnisteet eivät kelpaa" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Muokkaa näkymää" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Raitanumerot" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Aloitus_kohta:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "Raitoja _yhteensä:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Soitin" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Esikatsele" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "ja %d muuta..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Tallennetaan muuttamasi kappaleet." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Siirretään %d/%d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Soittolista on jo olemassa nimellä %s." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Tiedostojärjestelmä" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Näytä lyhyt käyttöohje" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Näytä versio ja tekijänoikeustiedot" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[valitsimet]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "VIRHE: Valitsin '%s' ei kelpaa." #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "VIRHE: Valitsin '%s' vaatii argumentin." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "VIRHE: '%s' ei ole ainutkertainen etuliite." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekunti" msgstr[1] "%d sekuntia" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuutti" msgstr[1] "%d minuuttia" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d tunti" msgstr[1] "%d tuntia" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d päivä" msgstr[1] "%d päivää" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "no" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz-julkaisun tilaksi kelpaa 'official', 'promotional' tai 'bootleg'." #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Kappaleen muokkaaminen epäonnistui" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Virheellinen koodaus]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "albumi" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "sovittaja" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "sovittajaa" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "sovittaja" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "kirjoittaja" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "kirjoittajaa" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "säveltäjä" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "säveltäjää" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "säveltäjä" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "kapellimestari" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "orkesterinjohtajaa" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "kapellimestari" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "yhteys" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "tekijänoikeus" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "päivämäärä" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "kuvaus" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "tyylilaji" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "tyylilaji" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "ryhmittely" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "kieli" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "lisenssi" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "sijainti" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "sanoittaja" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organisaatio" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "nimi" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versio" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "web-sivusto" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "albumin artisti" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "levy" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "raita" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "nimikkeen tunniste" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "alkuperäinen julkaisupvm" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "alkuperäinen albumi" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "alkuperäinen artisti" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "nauhoituspäivämäärä" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artistin tunniste" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM-tunniste" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz albumin tila" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz albumin tyyppi" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "raidan vahvistus" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "raidan huippu" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "albumin vahvistus" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "albumin huippu" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Asetukset" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "levyt" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "raidat" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "soitto aloitettu" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "täydellinen nimi" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "liitoskohta" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "henkilöt" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "vuosi" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "alkuperäinen julkaisupvm" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Kirjanmerkit" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "muoto" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Soittolistat" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, 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 "Clear search" #~ msgstr "Tyhjennä haku" #~ 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 "lyricists" #~ msgstr "sanoittajaa" #~ 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" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Tiedot" #~ 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.5.3/po/tr.po����������������������������������������������������������������������������0000644�0001750�0001750�00000460743�12646427552�015376� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "bir müzik etiketleyicisi" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "dizin" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Ad" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Sanatçı" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Tarih" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Tür" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Puan" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Tarihe göre sırala" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Ayarlar" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albüm Listesi" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albüm Listesi" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Tüm albümler" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d albüm" msgstr[1] "%d albüm" #: ../quodlibet/browsers/albums/main.py:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Bir albümde olmayan şarkılar" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d şarkı" msgstr[1] "%d şarkı" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disk" msgstr[1] "%d disk" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Tüm albümler" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Albüm listesi ayarları" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Albüm _kapaklarını göster" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "_Arama kişileri de içerir" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[ayarlar]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Albüm Görünümü" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Geçersiz süzgeç" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Bilinmeyen" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Yeni Bildirim" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Ses bildiriminin yerini girin:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Ses bildirimleri" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Ses Bildirimleri" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_İndir" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Dosyaları İndir" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Dosyayı İndir" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Bildirim eklenemiyor" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Arşivi _Yenile" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Dosyaları Sil" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Arşiv Gezici" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Bilinmeyen" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Birden fazla değelere _böl" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Özel" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Puan" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etiket" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Albüm listesi ayarları" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Geziciyi Gizle" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "Geziciyi _Gizle" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Dosya Sistemi" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Dosya Sistemi" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Şarkılar kopyalanamıyor" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Arşive Ekle" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Dosya türü desteklenmiyor" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Kanal eklenemedi" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "İnternet Radyosu" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Dosyaları İndir" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Yeni Kanal" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_İnternet Radyosu" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Yeni Kanal" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Yeni Kanal" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Yeni Kanal" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Kanal bulunamadı" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%s adresinde İnternet radyo kanalı bulunamadı." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Listelenen tüm radyolar zaten arşivinizde." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "Çalma Listesine _Ekle" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "Çalma Listesinden _Çıkar" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Aygıt Özellikleri" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Aygıt:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Bağlanmamış" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Bağlama Yeri:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_İsim:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Ortam Aygıtları" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Ortam Aygıtları" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Çıkart" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Özellikler" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Yeniden Adlandır" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> takılı değil." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%(song)s</b> Kopyalanıyor" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Şarkı kopyalanamadı" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Bu şarkı için yeterli boş yer yok." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> kopyalanamadı." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Şarkılar silinemiyor" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%(song)s</b> siliniyor" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> silinemedi." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Şarkı silinemedi" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> çıkartılamadı." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Aygıt çıkartılamadı" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Panelli Gezici" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Panelli Gezici" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Hepsini _Seç" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Hepsi" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Panelli Gezici Ayarları" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Çalma Listeleri" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Çalma Listeleri" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Çalma Listesinden _Çıkar" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "İçe _Aktar" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Yeni Çalma Listesi" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Çalma listesi içe aktarılamadı" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Çalma Listesinin adı değiştirilemedi" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Yeni Çalma Listesi" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Yeni dizin için isim girin:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet çalışmıyor." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "bir müzik arşivleyici ve çalıcı" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[ayarlar]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Çalan şarkıyı göster ve çık" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Hemen çalmaya başla" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Sonraki şarkıya atla" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Önceki şarkıya atla" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Çalmaya başla" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Çalmayı duraklat" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "çalma/duraklama durumunu değiştir" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Çalmaya başla" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Sesi aç" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Sesi kıs" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Durum bilgisini göster" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Ana pencereyi gizle" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Ana pencereyi göster" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Ana pencere görünürlüğünü değiştir" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Çalışan müzikçalara odaklan" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Geçerli gezici süzgeçlerini kaldır" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Arşivi yenile ve tekrar tara" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Geziciyi Gizle" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Şu anki çalma listesini göster" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Çalma kuyruğunu göster" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Çalma kuyruğunu göster" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet çalışmıyor." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Quod Libet'ten çık" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Şarkı içinde ileri/geri git" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][SS:]DD:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Çalma sıralamasını değiştir" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Başa dönmeyi aç, kapat veya değiştir" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Ses yüksekliğini değiştir" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Müzik arşivinde arama yap" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "sorgu" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Bir ses dosyası çal" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "dosya adı" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Çalan şarkıya puan ver" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Geziciyi değiştir" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Yeni bir gezici aç" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Çalma kuyruğunu göster veya sakla" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Şarkı listesini göster veya sakla" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Rastgele bir değerle süz" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Etiket" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "etiket=değer" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "bir dosya veya sorguyu çalma kuyruğuna koy" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "dosya adı" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "bir dosya veya sorguyu çalma kuyruğundan çıkar" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "'%s' için geçersiz parametre." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Yardım için %s --help komutunu deneyin." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Bilinmeyen Aygıt" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, python-format msgid "%r is not a supported device." msgstr "%r desteklenen bir aygıt değil." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Ses altsistemi yükleniyor (%s)" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 #, fuzzy msgid "Device backend initialized." msgstr "%r ses altsistemi kurulu değil." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod'la bağlantı kurulmamış" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Bu iPod'da boş bir veritabanı yaratmak istiyor musunuz?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Ses Düzeyi (dB)" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Albüm kapaklarını kopyala" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Birden _çok değeri olan etiketleri birleştir" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "İsim _versiyonları içersin" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Albüm _disk altyazısını içersin" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Kapasite:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Boşta kalan iPod parçası silindi" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "iPod veritabanı kaydedilemedi" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "iPod veritabanı kaydedilemedi" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Dosya Adı Süzgeci:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Kullanılmayan albüm kapakları ve dizinleri _sil" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz şarkı ID'si" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[kodlama Hatası]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Ad" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Müzik etiketleri düzenleyici" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Etiketlerde _büyük/küçük harfleri düzelt" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Panelli Gezici Ayarları" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Toplam boyut:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Ağırlık" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Önizleme" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d saniye" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Özel" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Hataları _Sil" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Müzik Çalar" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "İnternet Radyosu" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "konum" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Ana pencereyi gizle" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Ayarlar" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Ad" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Aygıt:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_İsim:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Diğerleri:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Sanatçı" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Dosya Adı Süzgeci:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "_Rastgele Albüm" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albümler" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Ağırlık" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "_Rastgele Albüm" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Çalmıyor" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d şarkı" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "süzgeç" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Çalmıyor" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Çalma Listeleri" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Çalıcı" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Önizleme" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Sıralama:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Başa dön" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Bu şarkıdan sonra dur" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "Arşivi _Gez" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "_Etiketleri Değiştir" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Bilgi" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Sözler" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Sözler" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Önizleme" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "_Sanatçıya göre süz" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Özel" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "_Türe göre süz" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "_Sanatçıya göre süz" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Ses bildirimleri" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Ses bildiriminin yerini girin:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Yeni Çalma Listesi" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Çalma _Kuyruğu" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Hiçbir Zaman" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "şarkı tepe ses seviyesi" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Yeniden Adlandır" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Arşiv" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Ana pencereyi gizle" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Dosya Adı" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Şarkı kaydedilemedi" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Albüm Listesi" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Boyut" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Ara:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Ara" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Albüm Listesi" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "Yer imlerini _değiştir" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "Yer imlerini _değiştir" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Yer imleri" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Dosya Adı" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Şarkı" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Ad" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Sanatçı" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Eklenti bulunamadı." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "ve %d tane daha..." msgstr[1] "ve %d tane daha..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz albüm türü" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "sorgu" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Ara" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz albüm türü" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Diski _Albümden ayır" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Geziciler" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Dizin yaratılamadı" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Şarkı Listesi" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Süre" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Hepsini _Seç" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "etiket" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Yeniden Adlandır" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "etiket" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Geçersiz süzgeç" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Geçersiz değer" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Özel" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Geziciyi Gizle" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "_Puan" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Puan" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "_Puan" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "_Türe göre süz" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "Çalma _Kuyruğu" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Hatalar" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Yaz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz şarkı ID'si" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "dizin" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Albüm Etiketleri" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Yaz" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "%r yüklenemedi." #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Yeniden Adlandır" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Şarkı kaydedilemedi" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Eklenti bulunamadı." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Sözler" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Sözler" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Çalma Listeleri" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Çalma listesi içe aktarılamadı" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b> çıkartılamadı." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Arşivi _Yenile" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d şarkı" msgstr[1] "%d şarkı" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Arşivi _Yenile" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Etiketleri değiştir" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Etiketleri değiştir" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Tüm albümler" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Ara" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "süzgeç" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Kayıtlı değerleri değiştir..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Arşiv" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Bağlama yerleri denetleniyor" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Arşiv taranıyor" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "%s taranıyor" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "_Programatik etiketleri göster" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Çok Fazla Hata" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "açıklama" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Değer" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Müzik etiketleri düzenleyici" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Seçili şarkı yok." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Süre bilgisi yok" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Dosya yeniden adlandırılamadı" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Dosya" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Kanal bulunamadı" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Ses çıkışı yaratılamadı." #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Eklentiler" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Desteklenen biçimler: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Ses aygıtı: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Baş" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "Yok" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Süre" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Yer İmi Adı" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "DD:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Yer imleri" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Süzgeçler" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Hiç çalınmadı" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Tepe 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Yeni Kanal" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "_Türe göre süz" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "_Sanatçıya göre süz" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "_Albüme göre süz" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Rastgele Müzik _Türü" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Rastgele _Sanatçı" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "_Rastgele Albüm" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Süre bilgisi yok" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Değer:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Kayıtlı Değerler" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Kayıtlı değerleri değiştir..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Şarkılar" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Kalan süreyi göster" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Şarkı _Numarası Etiketleri" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Albüm Etiketleri" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ses Düzeyi Düzeltmesi" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Bilinmeyen" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Hata Oldu" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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." #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Dosyalar" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Dosyaları Sil" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Çöpe Taşı" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "%(current)d/%(total)d Taşınıyor." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "iPod veritabanı kaydedilemedi" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> çıkartılamadı." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%(current)d/%(total)d Siliniyor." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Dosya silinemedi" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Birden fazla değelere _böl" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Diski _Albümden ayır" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "_Versiyonu İsimden ayır" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Aranjörü _Sanatçıdan ayır" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Seslendireni Sanatçıdan ayır" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Seslendireni Sanatçıdan ayır" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "_Versiyonu İsimden ayır" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Etiket ekle" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Etiket:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Etiket eklenemedi" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Şarkı eklenemedi" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Geçersiz etiket" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Geçersiz değer" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Eklentiler" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso Ayarları" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Buna göre _ayır:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Etiket değiştirme" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Dizinler" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Yeni Dizin" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Tüm Alt Dizinleri Seç" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Yeni Dizin" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Yeni dizin için isim girin:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Dizin yaratılamadı" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Dizin silinemedi" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "%s eseri" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Şarkı %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Görünümü Değiştir" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Seçili şarkı yok." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Şarkı yok" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Bilgi" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Sözler" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "sanatçı" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "sanatçılar" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "seslendirenler" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Hiçbir Zaman" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d defa" msgstr[1] "%d defa" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "eklendi" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "en son çalındı" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "defa çalındı" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "defa geçildi" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "puan" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "uzunluk" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Bilgi" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[kodlama Hatası]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bit oranı" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "dosya boyutu" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "değiştirildi" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Yapımcı %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "seslendiren" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Şarkı yok" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Seçili Diskografi" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albümler" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Toplam uzunluk:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Toplam boyut:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Dosyalar" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_İndir" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Bu şarkının sözleri bulunamadı." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Şarkı sözleri aranıyor..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Şarkı sözleri indirilemedi." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Etiket değişikliklerini gözardı et?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Hiçbir Zaman" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Dosya zaten var" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Yeniden Adlandır" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Bilinmeyen" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Sırayla" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_Sırayla" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Rastgele" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Rastgele" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Ağırlıklı" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Ağırlıklı" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Bir Şarkı" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Bir Şarkı" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Eklenti Hataları" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Geziciyi Gizle" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Eklenti bulunamadı." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Eklentiler" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "_Hataları Göster" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "Şarkı _No" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "grup" #: ../quodlibet/qltk/prefs.py:48 #, fuzzy msgid "Al_bum" msgstr "_Albüm" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Dosya Adı" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Uzunluk" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Şarkı Listesi" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "Çalan şarkıya otomatik olarak _atla" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Diğerleri:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Görünümü düzenle..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Görünen Sütunlar" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "_Arama kişileri de içerir" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Dosya adı _dizinleri içersin" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Ayarlar" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Görünen Sütunlar" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Geziciler" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Evrensel süzgeç:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Ara" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "_Puan" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "Önizlemelerde _yuvarlatılmış köşeler kullan" #: ../quodlibet/qltk/prefs.py:274 #, fuzzy msgid "Round the corners of album artwork thumbnail images." msgstr "" "albüm kapat resimlerinin kenarlarını yuvarlat. Tekrar başlatmayı " "gerektirebilir." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Albüm Listesi" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Çalmayı duraklat" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Çıktı Kaydı" #: ../quodlibet/qltk/prefs.py:344 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:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Öntanımlı ses (dB):" #: ../quodlibet/qltk/prefs.py:358 #, 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:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Pre-amp düzeyi (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "Ses Düzeyi Düzeltmesini etkinleştir (Replay Gain)" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Ses Düzeyi Düzeltmesi" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "_Puan" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "_Puan ve çalma seferlerini kaydet" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_E-posta:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Etiket değişikliklerini gözardı et?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Etiketleri değiştir" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Yeni Kanal" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "Başlangıçta arşivi _yenile" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Arşivi _Yenile" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Arşivinizdeki değişiklikleri denetle" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Arşivi _Baştan Yükle" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "_Dizinleri tara" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Şarkı yok" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Özellikler" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "Çalma _Kuyruğu" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Kuyruğu temizle" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Rastgele" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Çalma listesi bitince başa dön" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Çalmayı duraklat" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Dizin Seç" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Şarkılar eklenemedi" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> desteklenmeyen bir protokol kullanıyor." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Müzik" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "Dizin _Ekle..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "Dosya _Ekle..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Adres Ekle" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Yeni bir gezici aç" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Kontrol" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "Çalan Şarkıya _Atla" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Görünüm" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Yardım" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Bu şarkıdan sonra dur" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Yer imleri" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "Yer imlerini _değiştir" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Ara" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Şarkı _Listesi" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Adres Ekle" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Ses dosyasının yerini gir:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Adres eklenemedi" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> geçerli bir adres değil." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Şarkı Ekle" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Bu dizini yeni şarkılar için denetle" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Puan" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Puan" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Puan" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Boşlukları _altçizgi ile değiştir" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "_Windows'la uyumsuz karakterleri çıkart" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "_Düzeltme işaretlerini çıkart" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "_ASCII olmayan karakterleri çıkart" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Yeniden Adlandır" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "süzgeç" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Kayıtlı değerleri değiştir..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Önizleme" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Yeni İsim" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Dosya yeniden adlandırılamadı" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "_Hataları Göster" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Devam" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Yol mutlak değil" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Dizin Seç" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Kayıtlı Değerler" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Kayıtlı değerleri değiştir..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Ara" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Bu şarkıdan sonra dur" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Sınır:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Ağırlık" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "%s etiketine göre süz" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Albüm Etiketleri" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Şarkı _Numarası Etiketleri" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Albüm Etiketleri" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Kişi Etiketleri" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Tarih Etiketleri" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_Dosya Etiketleri" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "_Yapımcı Etiketleri" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Etiketleri Özelleştir..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Çalma Listeleri" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Çalma _Kuyruğuna Ekle" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "Aygıta _Kopyala" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "Çalma Listesinden _Çıkar" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "_Altçizgileri boşlukla değiştir" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Etiketlerde _büyük/küçük harfleri düzelt" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Birden fazla değere _ayır" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Dosya Yolundan Etiket" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Yeni etiketler eskilerin yerine geçsin" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Yeni etiketler eskilerine eklensin" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Geçersiz etiketler" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Görünümü Değiştir" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Şarkı Numaraları" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Başlangıç:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Toplam Şarkı:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Çalıcı" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Önizleme" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "ve %d tane daha..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Değişiklik yapılan dosyalar kaydediliyor." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "%(current)d/%(total)d Taşınıyor." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "%s adında bir çalma listesi zaten var." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Dosya Sistemi" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "U:" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "U:" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "H:" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Özet kullanım bilgisi göster" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Versiyon ve telif haklarını göster" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[ayarlar]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "%r parametresi anlaşılmadı." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "%r için bir parametre vermelisiniz." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r eşsiz bir önek değil." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d saniye" msgstr[1] "%d saniye" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d dakika" msgstr[1] "%d dakika" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d saat" msgstr[1] "%d saat" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d gün" msgstr[1] "%d gün" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Ad" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Şarkı değiştirilemedi" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[kodlama Hatası]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "albüm" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "aranjör" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "aranjörler" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "aranjör" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "yazar" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "yazarlar" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "besteci" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "besteciler" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "besteci" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "orkestra şefi" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "orkestra şefleri" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "orkestra şefi" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "iletişim" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "telif hakkı" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "tarih" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "açıklama" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "tür" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "tür" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "grup" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "dil" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "lisans" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "konum" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "söz yazarı" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organizasyon" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "isim" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "versiyon" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "web" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "albüm sanatçısı" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "disk altyazısı" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "şarkı no" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "yapımcı ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "asıl yayım tarihi" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "asıl albüm" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "asıl sanatçı" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "kayıt tarihi" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz şarkı ID'si" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz yayın ID'si" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "MusicBrainz yayın ID'si" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz sanatçı ID'si" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz yayın ID'si" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID'si" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz albüm durumu" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz albüm türü" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "şarkı ses seviyesi" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "şarkı tepe ses seviyesi" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "albüm ses seviyesi" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "albüm tepe ses seviyesi" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Ayarlar" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "diskler" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "şarkılar" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "son başlatılan" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "tam isim" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "bağlama yeri" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "kişiler" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "yıl" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "asıl yayım tarihi" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "yer imi" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "Süre bilgisi yok" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Çalma Listeleri" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Aramayı temizle" #~ 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 "lyricists" #~ msgstr "söz yazarları" #~ 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.5.3/po/POTFILES.in����������������������������������������������������������������������0000644�0001750�0001750�00000013430�12646426641�016147� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������data/exfalso.appdata.xml.in data/exfalso.desktop.in data/quodlibet.appdata.xml.in data/quodlibet.desktop.in exfalso.py operon.py 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/empty.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/util.py quodlibet/browsers/search.py quodlibet/cli.py quodlibet/devices/_base.py quodlibet/devices/__init__.py quodlibet/devices/ipod.py quodlibet/devices/storage.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/inhibit.py quodlibet/ext/events/iradiolog.py quodlibet/ext/events/jep118.py quodlibet/ext/events/mediaserver.py quodlibet/ext/events/mpdserver/__init__.py quodlibet/ext/events/mpris.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/squeezebox_sync.py quodlibet/ext/events/telepathy_status.py quodlibet/ext/events/themeswitcher.py quodlibet/ext/events/trayicon.py quodlibet/ext/events/viewlyrics.py quodlibet/ext/events/write_cover.py quodlibet/ext/events/zeitgeist_client.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_squeezebox.py quodlibet/ext/playlist/remove_duplicates.py quodlibet/ext/playlist/shuffle.py quodlibet/ext/playorder/follow.py quodlibet/ext/playorder/queue.py quodlibet/ext/playorder/reverse.py quodlibet/ext/playorder/track_repeat.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.py quodlibet/ext/songsmenu/browsefolders.py quodlibet/ext/songsmenu/cddb.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/lyricwiki.py quodlibet/ext/songsmenu/makesorttags.py quodlibet/ext/songsmenu/openwith.py quodlibet/ext/songsmenu/playlist.py quodlibet/ext/songsmenu/refresh.py quodlibet/ext/songsmenu/replaygain.py quodlibet/ext/songsmenu/splitting.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/operon/base.py quodlibet/operon/commands.py quodlibet/operon/main.py quodlibet/operon/util.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/debugwindow.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/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/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.5.3/po/zh_TW.po�������������������������������������������������������������������������0000644�0001750�0001750�00000453521�12646427552�016000� 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: 2016-01-16 12:54+0100\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 "音樂播放器" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "一個音訊標籤編輯器" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "目錄" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "標題" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "演出者 (_A)" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "日期 (_D)" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "風格" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "評等 (_R)" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "依日期排序" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "偏好設定" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "專輯清單" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "專輯清單 (_A)" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "所有專輯" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d 專輯" #: ../quodlibet/browsers/albums/main.py:640 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "顯示專輯封面 (_C)" #: ../quodlibet/browsers/albums/prefs.py:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "專輯中沒有曲目" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d 音軌" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d 唱片" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "所有專輯" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "專輯清單偏好設定" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "顯示專輯封面 (_C)" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[選項]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "專輯顯示" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "無效的格式" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "未知" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "新的饋流" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "輸入音訊檔案饋流位置:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "音訊饋流" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "音訊饋流 (_A)" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "下載 (_D)" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "下載檔案" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "下載檔案" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "無法加入饋流" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "刪除檔案" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "資料庫瀏覽器" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d 曲目 (%(time)s)" #: ../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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "未知" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "多重設定值分割 (_M)" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "自訂 (_C)" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "評等 (_R)" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "標籤" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "專輯清單偏好設定" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "停用瀏覽器" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "停用瀏覽器 (_D)" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "檔案系統" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "檔案系統 (_F)" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "無法複製曲目" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "選取的檔案不能被複製到其他曲目清單或佇列。" #: ../quodlibet/browsers/filesystem.py:187 msgid "_Add to Library" msgstr "加入資料庫 (_A)" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "未支援的檔案格式" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "無法加入站台" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "網路電台" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "下載檔案" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "新站台" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "網路電台 (_I)" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "新站台" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "新的站台 (_N)" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "新站台" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "未發現站台" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%s 沒有網路電台被發現。" #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "所有列出的站台已經在您的資料庫當中了。" #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "加入播放清單 (_A)" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "從播放清單中移除 (_R)" #: ../quodlibet/browsers/iradio.py:941 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d 站台" #: ../quodlibet/browsers/media.py:34 msgid "Device Properties" msgstr "裝置屬性" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "裝置:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "未掛載" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "掛載點:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "名稱:(_N)" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "媒體裝置" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "媒體裝置 (_M)" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "退出 (_E)" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "屬性" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "重新命名 (_R)" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> 已使用,<b>%s</b> 可用" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> 未連線。" #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "正在複製 <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "無法複製曲目" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "沒有足夠的空間給這首曲目。" #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "無法複製 <b>%s</b>。" #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "無法刪除曲目" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "正在刪除 <b>%s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "無法刪除 <b>%s</b>。" #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "無法刪除曲目" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "退出 <b>%s</b> 失敗。" #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "無法退出裝置" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "窗格瀏覽器" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "窗格瀏覽器 (_P)" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "全選 (_A)" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "全部" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "窗格瀏覽器偏好設定" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "播放清單" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "播放清單 (_P)" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "從播放清單中移除 (_R)" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "匯入 (_I)" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "新的播放清單" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "無法匯入播放清單" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet 僅不能匯入 M3U 或 PLS 格式的播放清單。" #: ../quodlibet/browsers/playlists/main.py:494 msgid "Unable to rename playlist" msgstr "無法重新命名播放清單" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "匯入播放清單" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "新的播放清單 (_N)" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "輸入新資料夾的名稱:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet 並未執行。" #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "一個音樂資料庫與播放器" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[選項]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "顯示播放中的曲目並離開" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "立即開始播放" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "跳到下一個曲目" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "跳到上一個曲目" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "開始播放" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "暫停播放" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "切換 播放/暫停 模式" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "開始播放" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "調高音量" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "調低音量" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "顯示播放器狀態" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "隱藏主視窗" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "顯示主視窗" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "切換主視窗可見性" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "焦點移到執行中的播放器" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "停用瀏覽器" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "顯示當前的播放清單" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "顯示佇列的內容" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "顯示佇列的內容" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet 並未執行。" #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "離開 Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "在其中找尋播放中的曲目" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "設定或切換播放順序" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "關掉、打開或切換重新播放" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "設定音量" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "搜尋您的音訊資料庫" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "查詢" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "播放檔案" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "檔名" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "評等播放中的曲目" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "設定當前的瀏覽器" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "開啟新的瀏覽器" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "顯示或隱藏佇列" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "顯示或隱藏主要曲目清單" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "以亂數篩選" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "標籤" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "以標籤值篩選" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "佇列檔案或查詢" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "檔名" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 #, fuzzy msgid "Unqueue a file or query" msgstr "佇列檔案或查詢" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "錯誤:無效的參數:「%s」。" #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "錯誤:試試 %s --help。" #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "未知的裝置" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "錯誤:「%s」不是一個獨特的前綴 (prefix)。" #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "無效的設定值" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "iPod 尚未初始化" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "您是否要在這 iPod 上建立一個空的資料庫?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "音量增益 (dB):(_V)" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "複製專輯封面 (_A)" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "以多個設定值合併標籤" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "標題包含版本 (_V)" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "專輯包含部份 (_P)" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "模式;" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "容量:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "韌體" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "警告:正在移除孤立的 iPod 音軌" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "無法儲存 iPod 資料庫" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "無法儲存 iPod 資料庫" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "檔名型態 (_F)" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "移除不在使用的專輯封面與目錄 (_R)" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[無效的編碼]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "標題" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "音效標籤編輯器" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "標籤英文首字大寫 (_T)" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "窗格瀏覽器偏好設定" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "合計大小:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "編輯顯示" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "加權 (_W)" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "編輯顯示" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "預覽 (_P)" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d 秒" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "自訂 (_C)" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "外掛程式錯誤" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "音樂播放器" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "網路電台" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "位置" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "隱藏主視窗" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "偏好設定" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "標題" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "裝置:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "名稱:(_N)" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "其他:(_O)" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "演出者 (_A)" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "檔名型態 (_F)" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "隨機專輯 (_B)" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "專輯" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "加權 (_W)" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "隨機專輯 (_B)" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "匯入播放清單" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "尚未播放" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d 曲目" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "模式" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "編輯顯示" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "尚未播放" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "播放清單 (_P)" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "播放器" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "預覽 (_P)" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "排序:(_O)" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "重覆播放 (_R)" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "在這首歌之後停止" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "瀏覽資料庫 (_B)" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "編輯標籤 (_T)" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "資訊 (_I)" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "預覽 (_P)" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "依演出者篩選 (_A)" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "自訂 (_C)" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "依風格篩選 (_G)" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "依演出者篩選 (_A)" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "音訊饋流" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "輸入音訊檔案饋流位置:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "新的播放清單" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "佇列 (_Q)" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "從未" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "音軌高峰值" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "重新命名 (_R)" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "資料庫" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "隱藏主視窗" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "檔案名稱" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "無法儲存曲目" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "專輯清單" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "大小" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "搜尋:(_S)" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "搜尋" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "專輯清單" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "編輯書籤... (_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "編輯書籤... (_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "書籤" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "檔案名稱" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "音軌" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "標題" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "演出者 (_A)" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "找不到外掛。" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "與其他 %d 首..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz 專輯類型" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "查詢" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "搜尋" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz 專輯類型" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "從專輯分離唱片 (_A)" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "瀏覽器" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "無法建立資料夾" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "音軌清單" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "時間" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "全選 (_A)" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "重新命名 (_R)" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "無效的格式" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "無效的設定值" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "自訂 (_C)" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "停用瀏覽器" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "評等 (_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "評等 (_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "編輯顯示" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "評等 (_R)" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "以標籤值篩選" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer 無法載入被選取的曲目。" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "依風格篩選 (_G)" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "佇列 (_Q)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "顯示錯誤 (_E)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "寫入" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "目錄" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "專輯檔頭 (_A)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "寫入" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "匯入播放清單" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "重新命名 (_R)" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "無法儲存曲目" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "找不到外掛。" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "歌詞" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "歌詞" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "播放清單" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "無法匯入播放清單" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "退出 <b>%s</b> 失敗。" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d 曲目" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "編輯標籤" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "編輯標籤" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "所有專輯" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "搜尋" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "模式" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "編輯儲存設定值..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "資料庫" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "正在檢查掛載點" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "正在掃瞄資料庫" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "正在掃瞄 %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "顯示標題音樂 (programmatic) 標籤 (_p)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "描述" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "設定值" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "音效標籤編輯器" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "無曲目被選取。" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "以標籤值篩選" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "以標籤值篩選" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "無時間資訊" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "無法重新命名檔案" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "檔案" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "未發現站台" #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "無法建立資料夾" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "外掛 (_P)" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "支援格式:%s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "音訊裝置:%s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "開頭" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "時間" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "書籤名稱" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "書籤" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "篩選 (_F)" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "從未播放過 (_N)" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "前 40 名 (_T)" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "新站台" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "依風格篩選 (_G)" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "依演出者篩選 (_A)" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "依專輯篩選 (_B)" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "隨機風格 (_G)" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "隨機演出者 (_A)" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "隨機專輯 (_B)" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "這是您播放最多次的 40 首曲目 (排名平手的話或許會超出 40 首)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "無時間資訊" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "設定值:(_V)" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "已儲存設定值" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "編輯儲存設定值..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "曲目" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "顯示剩餘時間" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "音軌檔頭 (_T)" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "專輯檔頭 (_A)" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "回放增益音量修正 (_R)" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "未知" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "以標籤值篩選" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "檔案" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:90 #, fuzzy msgid "_Delete Files" msgstr "刪除檔案" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "移到回收筒 (_M)" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "正在移動 %d/%d。" #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "無法儲存 iPod 資料庫" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "退出 <b>%s</b> 失敗。" #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "正在刪除 %d/%d。" #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "無法刪除檔案" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "%d 曲目遺失" #: ../quodlibet/qltk/edittags.py:62 ../quodlibet/qltk/edittags.py:66 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "%d 首曲目有差異" #: ../quodlibet/qltk/edittags.py:188 msgid "Split into _Multiple Values" msgstr "多重設定值分割 (_M)" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "從專輯分離唱片 (_A)" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "從標題分離版本 (_V)" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "從演出者分離組織者 (_T)" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "從演出者分離演奏者 (_P)" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "從演出者分離演奏者 (_P)" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "從標題分離版本 (_V)" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "加入標籤" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "標籤:(_T)" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "無法加入標籤" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "無法加入曲目" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "無效的標籤" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "無效的設定值" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "外掛 (_P)" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso 偏好設定" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "分隔標記 (_O)" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "標籤編輯" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "資料夾" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "新資料夾" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "選取所有子資料夾 (_S)" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "新資料夾" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "輸入新資料夾的名稱:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "無法建立資料夾" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "無法刪除資料夾" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "演出者:%s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "唱片 %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "音軌 %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "編輯顯示" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "無曲目被選取。" #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "無曲目" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "資訊" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "歌詞" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "演出者" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "演出者" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "表演者" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "從未" #: ../quodlibet/qltk/information.py:213 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 次" #: ../quodlibet/qltk/information.py:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "加入時間" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "上次播放" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "播放次數" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "跳過次數" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "曲目評等" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "長度" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "資訊" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[無效的編碼]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "位元率" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "檔案大小" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "修改時間" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d 已選取" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "由 %s 創作" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "表演者" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "無效的音軌" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d 曲目沒有專輯資訊" #: ../quodlibet/qltk/information.py:490 msgid "Selected Discography" msgstr "已選擇音樂唱片分類" #: ../quodlibet/qltk/information.py:543 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d 曲目沒有演出者資訊" #: ../quodlibet/qltk/information.py:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "專輯" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "總計長度:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "合計大小:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "檔案" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "下載 (_D)" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "找不到這首曲目的歌詞。" #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "正在搜尋歌詞..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "無法下載歌詞。" #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "要放棄標籤的變更?" #: ../quodlibet/qltk/msg.py:41 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "標籤已被改變但尚未儲存。要儲存這些檔案或者是放棄變更?" #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "從未" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "檔案已存在" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "重新命名檔案" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "未知" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "順序" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "順序 (_I)" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "洗牌" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "洗牌 (_S)" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "加權" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "加權 (_W)" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "單曲" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "單曲 (_O)" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "外掛程式錯誤" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "停用瀏覽器" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "找不到外掛。" #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "外掛 (_P)" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "顯示錯誤 (_E)" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "唱片 (_D)" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "音軌 (_T)" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "組合" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "專輯 (_B)" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "檔名 (_F)" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "長度 (_L)" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "曲目清單" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "自動跳到播放中的曲目 (_J)" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "當變更播放中的曲目時,捲動清單到該曲目位置" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "其他:(_O)" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "編輯顯示... (_E)" #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "可視欄位" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "標題包含版本 (_V)" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "檔名包含資料夾 (_F)" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "偏好設定" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "可視欄位" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "瀏覽器" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "通用篩選:(_G)" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "搜尋" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "當變更播放中的曲目時,捲動清單到該曲目位置" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "評等 (_R)" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "專輯清單" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "暫停播放" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "音量增益 (dB):(_V)" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "音量增益 (dB):(_V)" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "回放增益音量修正 (_R)" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "回放增益音量修正 (_R)" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "評等 (_R)" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "儲存評等與播放次數" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "電子郵件:(_E)" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "評等和播放次數將會被設定到這個電子郵件地址" #: ../quodlibet/qltk/prefs.py:547 #, fuzzy msgid "Auto-save tag changes" msgstr "要放棄標籤的變更?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "編輯標籤" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "新的站台 (_N)" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "檢查您的資料庫變動" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "重新載入資料庫 (_L)" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "重新載入您的資料庫中所有曲目 (這可能會花一些時間)" #: ../quodlibet/qltk/prefs.py:640 #, fuzzy msgid "Scan Directories" msgstr "掃瞄目錄 (_D)" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "無曲目" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "屬性" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "佇列 (_Q)" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "移除佇列中所有曲目" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "隨機 (_R)" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "當結束時重新開始這個播放清單" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "暫停播放" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "選取目錄" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "無法加入曲目" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> 使用了未支援的通訊協定。" #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "音樂 (_M)" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "加入資料夾... (_A)" #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "加入檔案... (_A)" #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "開啟新的瀏覽器" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "控制 (_C)" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "跳到播放中的曲目 (_J)" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "檢視 (_V)" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "說明 (_H)" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "在這首歌之後停止" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "書籤" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "編輯書籤... (_E)" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "搜尋" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "曲目排序 (_L)" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "輸入音訊檔案位置:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "無法加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> 不是有效的位置。" #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "加入音樂" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "監視這個資料夾中的新曲目" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "評等 (_R)" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "評等 (_R)" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "評等 (_R)" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "以底線替換空白 (_U)" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "刪除不相容 Windows 的字元 (_W)" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "刪除發音標記 (_D)" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "刪除非 ASCII 字元 (_A)" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "重新命名檔案" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "模式" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "編輯儲存設定值..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "預覽 (_P)" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "新的名稱" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "無法重新命名檔案" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "顯示錯誤 (_E)" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "繼續 (_C)" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "不是絕對路徑" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "這些資料夾 (以「:」隔開) 中所放置的曲目將會被加入到您的資料庫中" #: ../quodlibet/qltk/scanbox.py:108 msgid "Select Directories" msgstr "選取目錄" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "已儲存設定值" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "編輯儲存設定值..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "搜尋" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "在這首歌之後停止" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "限制 (_L):" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "加權 (_W)" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "以 %s 篩選 (_F)" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "專輯檔頭 (_A)" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "音軌檔頭 (_T)" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "專輯檔頭 (_A)" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "個人或團體檔頭 (_P)" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "日期檔頭 (_D)" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "檔案檔頭 (_F)" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "出版檔頭 (_P)" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "設置檔頭... (_C)" #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "播放清單" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "加入佇列 (_A)" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "複製到裝置 (_C)" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "從播放清單中移除 (_R)" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "以空白替換底線 (_U)" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "標籤英文首字大寫 (_T)" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "分割多重設定值" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "從路徑名設定標籤" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "替換現存的標籤" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "加入現存的標籤" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "無效的標籤" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "編輯顯示" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "音軌編號" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "起始編號:(_m)" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "總計音軌數:(_T)" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "播放器" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "預覽 (_P)" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "與其他 %d 首..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "正在儲存曲目變更。" #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "正在移動 %d/%d。" #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "叫作 %s 的播放清單已經存在了。" #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "檔案系統" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "顯示基本的使用方法" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "顯示版本與著作權" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[選項]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "錯誤:選項「%s」未被辨識。" #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "錯誤:選項「%s」需要一個參數。" #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "錯誤:「%s」不是一個獨特的前綴 (prefix)。" #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d 秒" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d 分" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d 時" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d 日" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:31 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:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "回放增益增益必須以「x.yy dB」格式輸入。" #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "回放增益高峰值必須以「x.yy」格式輸入。" #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz 釋出狀態應當是「official」、「promotional」或者是「bootleg」。" #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "無法編輯曲目" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[無效的編碼]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "專輯" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "組織者" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "組織者" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "組織者" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "作者" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "作者" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "作曲" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "作曲" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "作曲" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "指揮" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "指揮" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "指揮" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "聯絡" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "著作權" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "日期" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "描述" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "風格" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "風格" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "組合" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "語言" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "許可" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "位置" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "作詞" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "團體" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "標題" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "版本" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "網站" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "專輯演出者" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "唱片" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "音軌" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "標籤 ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "最初發行日期" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "原作專輯" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "原作" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "錄製日期" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz 演出者 ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz 專輯狀態" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz 專輯類型" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "音軌增益" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "音軌高峰值" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "專輯增益" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "專輯高峰值" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "偏好設定" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "唱片" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "音軌" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "上次開始" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "全名" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "掛載點" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "個人或團體" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "年份" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "最初發行日期" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "書籤" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "格式" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "播放清單" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "無法開啟檔案" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "無效的設定值" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "Clear search" #~ msgstr "清除搜尋紀錄" #~ 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 "lyricists" #~ 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)" #, fuzzy #~ 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 "" #~ "%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.5.3/po/sk.po����������������������������������������������������������������������������0000644�0001750�0001750�00000456023�12646427552�015362� 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: 2016-01-16 12:54+0100\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č" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "editor audio tagov" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "adresár" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Názov" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Interpret" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Dátum" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "žáner" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Hodnotenie" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Podľa dátumu" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Nastavenie" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Zoznam albumov" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "Zoznam _albumov" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Všetky albumy" #: ../quodlibet/browsers/albums/main.py:473 #, 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:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Skladby bez albumu" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, 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:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, 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:66 #, fuzzy msgid "An Example Album" msgstr "Všetky albumy" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Nastavenie zoznamu albumov" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Zobraziť _obaly albumov" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[možnosti]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Zobrazenie albumov" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Neplatná vzorka" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Neznáme" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Pridať kanál" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Vložte umiestnenie audio kanálu:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio kanály" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio kanály" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Sťahovanie" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Sťiahnuť súbory" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Sťiahnuť súbor" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Nepodarilo sa pridať kanál" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "O_bnoviť knižnicu" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Odstrániť súbory" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" #: ../quodlibet/browsers/audiofeeds.py:508 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Prehliadať knižnice" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Neznáme" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Rozdeliť na _viacero hodnôt" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Vlastné" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Hodnotenie" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Nastavenie zoznamu albumov" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Vypnúť prehliadač" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Vypnúť prehliadač" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Súborový systém" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Súborový systém" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Nepodarilo sa skopírovať skladby" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Pridať do knižnice" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Nepodporovaný typ súboru" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Nepodarilo sa pridať stanicu" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internetové rádio" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Sťiahnuť súbory" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Nová stanica" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internetové rádio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Nová stanica" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Nová stanica" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Nová stanica" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Nenájdené žiadne stanice." #: ../quodlibet/browsers/iradio.py:812 #, 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:820 msgid "All stations listed are already in your library." msgstr "Všetky stanice už sú v knižnici." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Pridať do playlistu" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Odstrániť z playlistu" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Vlastnosti zariadenia" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Zariadenie:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Nepripojené" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Prípojný bod:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Názov:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Média zariadenia" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Média zariadenia" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Vysunúť" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Vlastnosti" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Premenovať" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nie je pripojené." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopírovanie <b>%s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Neporadilo sa kopírovať skladbu" #: ../quodlibet/browsers/media.py:512 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:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nemôže byť skopírované." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Nepodarilo sa vymazať skladby" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Odstraňovanie <b>%s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nemôže byť odstránené." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Nedá sa odstrániť skladba" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Vysúvanie <b>%s</b> zlyhalo." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Neporadilo sa vysunúť zariadenie" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Prehliadač" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Prehliadač" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Označiť _všetko:" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Všetko" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Nastavenie prehliadača" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Playlisty" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Playlisty" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Odstrániť z playlistu" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Nový playlist" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Nepodarilo sa importovať playlist" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Neporadilo sa premenovať playlist" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Importovať playlist" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Nový playlist" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:49 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Vložte názov novej zložky:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nie je spustený." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "hudobný prehrávač" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[možnosti]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Vypíše hrajúcu skladbu a skončí" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Začať prehrávanie okamžite" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Preskočiť na nasledujúcu skladbu" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Preskočiť na predchádzajúcu skladbu" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Spustiť prehrávanie" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pozastaviť prehrávanie" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Prepnúť mód prehrávania/pauzy" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Spustiť prehrávanie" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Zvýšiť hlasitosť" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Znižiť hlasitosť" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Vypísať stav prehrávača" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Schovať hlavné okno" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Zobraziť hlavné okno" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Prepnúť viditelnosť hlavného okna" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:105 #, fuzzy msgid "Refresh and rescan library" msgstr "O_bnoviť knižnicu" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Vypnúť prehliadač" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Vypísať aktuálny playlist" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Vypísať obsah fronty" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Vypísať obsah fronty" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nie je spustený." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Ukončiť Quod Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Presunúť pozíciu hrajúcej skladby" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Nastaviť alebo prepnúť poradie prehrávania" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Zapnúť alebo vypnúť opakovanie" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Nastaviť hlasitosť" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Vyhľadávať v hudobnej knižnici" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "dotaz" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Prehrať súbor" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "názov súboru" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Ohodnotiť hrajúcu skladbu" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Nastaviť aktuálny prehliadač" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Otvoriť nový prehrávač" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Zobraziť alebo skryť frontu" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Zobraziť alebo skryť hlavný zoznam skladieb" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Filter na náhodnej hodnote" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Filter na hodnote tagu" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=hodnota" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Pridať do fronty" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "názov súboru" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:137 #, fuzzy msgid "Unqueue a file or query" msgstr "Pridať do fronty" #: ../quodlibet/cli.py:198 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Neplatný argument pre '%s'." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Skúste %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Neznáme zariadenie" #: ../quodlibet/devices/__init__.py:26 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:148 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' nie je unikátny prefix." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:599 #, fuzzy msgid "Initializing device backend." msgstr "Neplatná hodnota" #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Neinicializovaný iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Chcete vytvoriť prázdnu databázu na tomto iPod-e?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Hlasitosť (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopírovať obaly _albumov" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Kombinovať tagy z _viacerých hodnôt" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Názov obsahuje _verziu" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Album obsahuje ča_sť" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Model:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Kapacita:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 #, fuzzy msgid "Removing orphaned iPod track" msgstr "W: odstraňovanie ositorené iPod skladby" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Neporadilo sa uložiť iPod databázu" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Neporadilo sa uložiť iPod databázu" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Formát názvu súboru:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Odstrániť nepoužívané obaly a adresáre" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz ID skladby" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Neplatné kódovanie]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Názov" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor audio tagov" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Každé slovo začína veľkým písmenom" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:64 #, fuzzy msgid "Advanced Preferences" msgstr "Nastavenie prehliadača" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Celková veľkosť:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Váha" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Náhľad" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d sekunda" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Vlastné" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "Chyby zásuvných modulov" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Hudobný prehrávač" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internetové rádio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "miesto" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Schovať hlavné okno" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Nastavenie" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Názov" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Zariadenie:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Názov:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Ostatné:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Interpret" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Formát názvu súboru:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Náhodný al_bum" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "albumy" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Váha" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Náhodný al_bum" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Importovať playlist" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Nehrá" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d skladba" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "vzorka" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Nehrá" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Playlisty" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Prehrávač" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Náhľad" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Poradie:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "_Opakovať" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Skončiť po tejto skladbe" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Prehliadať knižnicu" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Upraviť _tagy" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informácie" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Text" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Text" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Náhľad" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Filter na _interpreta" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Vlastné" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Filter na žá_ner" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Filter na _interpreta" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio kanály" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Vložte umiestnenie audio kanálu:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Nový playlist" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "_Fronta" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nikdy" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "Hlavičky _skladby" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Premenovať" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Knižnica" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Schovať hlavné okno" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Názov súboru" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Nepodarilo sa uložiť skladbu" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Zoznam albumov" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Veľkosť" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Vyhľadať:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Vyhľadávať" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Zoznam albumov" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Upraviť záložky..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Upraviť záložky..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Záložky" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Názov súboru" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Skladba" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Názov" #: ../quodlibet/ext/songsmenu/brainz.py:120 #, fuzzy msgid "Artist" msgstr "_Interpret" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Nenájdené žiadne zásuvné moduly." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "a %d viac..." msgstr[1] "a %d viac..." msgstr[2] "a %d viac..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz typ albumu" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "dotaz" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Vyhľadávať" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz typ albumu" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Oddeliť disk z _albumu" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Prehliadače" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Nepodarilo sa vytvoriť zložku" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Zoznam skladieb" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Čas" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Označiť _všetko:" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Premenovať" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Neplatná vzorka" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Neplatná hodnota" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Vlastné" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Vypnúť prehliadač" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:416 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "_Hodnotenie" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Hodnotenie" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:21 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "_Hodnotenie" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Filter na hodnote tagu" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, 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:17 #, fuzzy msgid "Filter on Directory" msgstr "Filter na žá_ner" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Fronta" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Zobraziť _chyby" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Zapísať" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz ID skladby" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "adresár" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "Hlavičky _albumu" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Zapísať" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Importovať playlist" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Premenovať" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Nepodarilo sa uložiť skladbu" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Nenájdené žiadne zásuvné moduly." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Text" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Text" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Playlisty" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Nepodarilo sa importovať playlist" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "O_bnoviť knižnicu" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d skladba" msgstr[1] "%d skladby" msgstr[2] "%d skladieb" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "O_bnoviť knižnicu" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Upraviť tagy" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Upraviť tagy" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Všetky albumy" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Vyhľadávať" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "vzorka" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Upraviť uložené hodnoty..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Knižnica" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Kontrola prípojných bodov" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Skenovanie knižnice" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "Skenovanie %s" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Zobraziť _programové tagy" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "popis" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Hodnota" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor audio tagov" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Nie sú vybrané žiadne skladby." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Filter na hodnote tagu" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Filter na hodnote tagu" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Žiadna informácia o čase" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Nepodarilo sa premenovať súbory" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Súbor" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:313 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nenájdené žiadne stanice." #: ../quodlibet/player/gstbe/util.py:92 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:69 #, fuzzy msgid "Unable to create audio output" msgstr "Nepodarilo sa vytvoriť zložku" #: ../quodlibet/player/xinebe/player.py:70 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Zásuvné moduly" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Podporované formáty: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Audio zariadenie: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Začiatok" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Čas" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Názov záložky" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Záložky" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filtre" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Nehrané nikdy" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Nová stanica" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Filter na žá_ner" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Filter na _interpreta" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Filter na _album" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Náhodný žá_ner" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Náhodný int_erpret" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Náhodný al_bum" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Žiadna informácia o čase" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Hodnota:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Upraviť uložené hodnoty..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Skladby" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Zobraziť zostávajúci čas" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Hlavičky _skladby" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "Hlavičky _albumu" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Prispôsobiť hlasitosť podľa Replay Gain" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Neznáme" #: ../quodlibet/qltk/data_editors.py:349 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Filter na hodnote tagu" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "" #: ../quodlibet/qltk/debugwindow.py:125 #, python-format 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 "" #: ../quodlibet/qltk/debugwindow.py:141 msgid "" "Quod Libet may now be unstable. Closing it and restarting is recommended. " "Your library will be saved." msgstr "" #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Súbory" #: ../quodlibet/qltk/delete.py:59 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:68 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Odstrániť súbory" #: ../quodlibet/qltk/delete.py:105 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:114 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Presunúť do koša" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Presúvanie %d/%d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Neporadilo sa uložiť iPod databázu" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Vysúvanie <b>%s</b> zlyhalo." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Odstraňovanie %d/%d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Nepodarilo sa odstrániť súbor" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Rozdeliť na _viacero hodnôt" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Oddeliť disk z _albumu" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Oddeliť _verziu z názvu" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Oddeliť aranžéra z in_terpreta" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Oddeliť _hudobníka z interpreta" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Oddeliť _hudobníka z interpreta" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Oddeliť _verziu z názvu" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Pridať tag" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Nepodarilo sa pridať tag" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Neporadilo sa pridať skladby" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Neplatný tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Neplatná hodnota" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Zásuvné moduly" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Možnosti Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "R_ozdeliť na:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Editácia tagov" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Zložky" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Nová zložka" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "_Vybrať všetky podzložky..." #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Nová zložka" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Vložte názov novej zložky:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Nepodarilo sa vytvoriť zložku" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Nepodarilo sa odstrániť zložku" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "od %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Skladba %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Upraviť zobrazenie" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Nie sú vybrané žiadne skladby." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Žiadne skladby" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informácie" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Text" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "interpret" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "interpreti" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "hudobníci" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nikdy" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "pridané" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "naposledy prehrané" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "prehraní" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "preskočení" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "hodnotenie" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "dĺžka" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informácie" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "[Neplatné kódovanie]" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "veľkosť súboru" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "upravené" #: ../quodlibet/qltk/information.py:346 #, 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:359 #, python-format msgid "Produced by %s" msgstr "Vytvorené v %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "hudobník" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Skladba nedostupná" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Vybraná diskografia" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "albumy" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Celková dľžka:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Celková veľkosť:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Súbory" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Sťahovanie" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../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:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Vyhľadávanie textov..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Neporadilo sa stiahnuť text." #: ../quodlibet/qltk/maskedbox.py:19 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Zahodiť zmeny v tagoch?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nikdy" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Súbor existuje" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Premenovať súbory" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:21 #, fuzzy msgid "_Unknown" msgstr "Neznáme" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "V poradí" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_V poradí" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Náhodne" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Náhodne" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Podľa váhy" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Podľa váhy" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Jedna skladba" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Jedna skladba" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Chyby zásuvných modulov" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:111 #, fuzzy msgid "Disabled" msgstr "Vypnúť prehliadač" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Nenájdené žiadne zásuvné moduly." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Zásuvné moduly" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Zobraziť _chyby" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Skladba" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "zoskupenie" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "_Album" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Názob _súboru" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Dľžka" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Zoznam skladieb" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "Automaticky _preskočiť na hrajúcu skladbu" #: ../quodlibet/qltk/prefs.py:68 msgid "When the playing song changes, scroll to it in the song list" msgstr "" #: ../quodlibet/qltk/prefs.py:71 msgid "Behavior" msgstr "" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Ostatné:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Upraviť zobrazenie..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Viditeľné stĺpce" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Názov obsahuje _verziu" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Názov súboru obsahuje _zložku" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Nastavenie" #: ../quodlibet/qltk/prefs.py:138 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:221 #, fuzzy msgid "Edit Columns" msgstr "Viditeľné stĺpce" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Prehliadače" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globálny filter:" #: ../quodlibet/qltk/prefs.py:242 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Vyhľadávať" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:256 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:259 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:261 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" #: ../quodlibet/qltk/prefs.py:267 ../quodlibet/qltk/prefs.py:585 #, fuzzy msgid "Ratings" msgstr "_Hodnotenie" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "" #: ../quodlibet/qltk/prefs.py:274 msgid "Round the corners of album artwork thumbnail images." msgstr "" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:282 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:287 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Zoznam albumov" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Pozastaviť prehrávanie" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:344 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Hlasitosť (dB):" #: ../quodlibet/qltk/prefs.py:358 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Hlasitosť (dB):" #: ../quodlibet/qltk/prefs.py:366 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Prispôsobiť hlasitosť podľa Replay Gain" #: ../quodlibet/qltk/prefs.py:391 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Prispôsobiť hlasitosť podľa Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "_Hodnotenie" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:526 #, fuzzy msgid "Save ratings and play _counts" msgstr "Ukladať hodnotenia a počty hraní" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Zahodiť zmeny v tagoch?" #: ../quodlibet/qltk/prefs.py:549 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Upraviť tagy" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Nová stanica" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "_Refresh library on start" msgstr "O_bnoviť knižnicu" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "O_bnoviť knižnicu" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Skontrolovať zmeny v knižnici" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Z_novunačítať knižnicu" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Prehľadávať _adresáre" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Žiadne skladby" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Vlastnosti" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Fronta" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Odstrániť všetky skladby z fronty" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Náhodne" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Reštartovať playlist po skončení" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Pozastaviť prehrávanie" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Vyberte adresáre" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Neporadilo sa pridať skladby" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> používa nepodporovaný protokol." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Hudba" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "Pridať _zložku..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "Pridať _súbor..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Pridať umiestnenie" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Otvoriť nový prehrávač" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Ovládanie" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Preskočiť na hrajúcu skladbu" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Zobraziť" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Pomocník" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Skončiť po tejto skladbe" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Záložky" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Upraviť záložky..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Vyhľadávať" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Zoznam skladieb" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Pridať umiestnenie" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Vložte umiestnenie audio súboru:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Nepodarilo sa pridať umiestnenie" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nie je platné umiestnenie." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Pridať hudbu" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Sledovať túto zložku pre nové skladby" #: ../quodlibet/qltk/ratingsmenu.py:23 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:25 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:45 #, fuzzy msgid "Change _Rating" msgstr "_Hodnotenie" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Hodnotenie" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "_Hodnotenie" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Nahradiť medzery _podtržítkami" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Odstrániť znaky nekompatibilné s _Windows" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Odstrániť _diakritiku" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Odstrániť ne-_ASCII znaky" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Premenovať súbory" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 #, fuzzy msgid "Path Patterns" msgstr "vzorka" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Upraviť uložené hodnoty..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Náhľad" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Nový názov" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Nepodarilo sa premenovať súbory" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 #, fuzzy msgid "Ignore _All Errors" msgstr "Zobraziť _chyby" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Pokračovať" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Cesta nie je absolútna" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Vyberte adresáre" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Upraviť uložené hodnoty..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Vyhľadávať" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:119 #, fuzzy msgid "Search after _typing" msgstr "Skončiť po tejto skladbe" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Váha" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Filter na %s" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "Hlavičky _albumu" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Hlavičky _skladby" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Hlavičky _albumu" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Hlavičky ľ_udí" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Hlavičky _dátumu" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Hlavičky _súboru" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Hlavičky _produkcie" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Vlastné hlavičky..." #: ../quodlibet/qltk/songlist.py:1097 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Playlisty" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Pridať do _fronty" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopírovať na zariadenie" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Odstrániť z playlistu" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Nahradiť _podržítko medzerami" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Každé slovo začína veľkým písmenom" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Rozdeliť na viacero hodnôt" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tagy z cesty" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Nahradiť pôvodné tagy" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Pridať k pôvodným tagom" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Neplatné tagy" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Upraviť zobrazenie" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Čísla skladieb" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Začať _od:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Celkový počet:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Prehrávač" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Náhľad" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "a %d viac..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Ukladanie skladieb, ktoré ste zmenili." #: ../quodlibet/qltk/wlw.py:187 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Presúvanie %d/%d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Playlist s názvom %s už existuje." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Súborový systém" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 msgid "D:" msgstr "" #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 msgid "W:" msgstr "" #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 msgid "E:" msgstr "" #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Zobraziť krátku informáciu o použití" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Zobraziť verziu a copyright" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[možnosti]" #: ../quodlibet/util/__init__.py:162 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Možnosť '%s' nerospoznaná." #: ../quodlibet/util/__init__.py:165 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Možnosť '%s' vyžaduje parameter." #: ../quodlibet/util/__init__.py:168 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' nie je unikátny prefix." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, 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:380 #, 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:381 #, 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:382 #, 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:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "nope" #: ../quodlibet/util/massagers.py:31 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:43 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:63 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:82 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:103 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz status albumu musí byť 'official', 'promotional', or 'bootleg'" #: ../quodlibet/util/massagers.py:113 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:102 msgid "Unable to edit song" msgstr "Neporadilo sa editovať skladbu" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Neplatné kódovanie]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "aranžér" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "aranžéri" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "aranžér" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "skladateľ" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "skladatelia" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "skladateľ" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "dirigenti" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "dirigent" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "dátum" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "popis" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "žáner" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "žáner" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "zoskupenie" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "jazyk" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "licencia" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "miesto" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "autor textu" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "organizácia" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "názov" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "verzia" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "webstránka" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "interpret albumu" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "skladba" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "katalógové číslo" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "originálny dátum vydania" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "pôvodný album" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "pôvodný interpret" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "dátum nahrania" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:118 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz status albumu" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz typ albumu" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "" #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "reference loudness" msgstr "Nastavenie" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "disky" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "skladby" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "naposledy spustené" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "celý názov" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "prípojný bod" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "ľudia" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "rok" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "originálny dátum vydania" #: ../quodlibet/util/tags.py:154 #, fuzzy msgid "bookmark" msgstr "Záložky" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "formát" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Playlisty" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #, 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" #~ msgid "Clear search" #~ msgstr "Vyčistiť vyhľadávanie" #, 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 "lyricists" #~ msgstr "autori textu" #~ 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ť" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Informácie" #~ 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.5.3/po/de.po����������������������������������������������������������������������������0000644�0001750�0001750�00000514657�12646427553�015346� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# German translation of Quod Libet 2.3 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # Avoid Injury or Death # Rüdiger Arp <ruediger@gmx.net>, 2011. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 3.0.-1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-16 12:54+0100\n" "PO-Revision-Date: 2014-01-05 18:16+0100\n" "Last-Translator: Rüdiger Arp <ruediger@gmx.net>\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.5.4\n" "X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: /home/rarp/Downloads/0_src/quodlibet/quodlibet\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "Editor für Audio-Tags" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "Ordner" #: ../quodlibet/browsers/albums/main.py:150 msgid "_Title" msgstr "_Titel" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Künstler" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "Dat_um" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Bewertung" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Sortieren _nach..." #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 msgid "_Preferences" msgstr "_Einstellungen" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Albenliste" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Albenliste" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Alle Alben" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d Album" msgstr[1] "%d Alben" #: ../quodlibet/browsers/albums/main.py:640 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Titel ohne Album" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d Titel" msgstr[1] "%d Titel" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d CD" msgstr[1] "%d CDs" #: ../quodlibet/browsers/albums/prefs.py:66 msgid "An Example Album" msgstr "Ein Beispielalbum" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Einstellungen der Albenliste" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Album-_Cover anzeigen" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Die integrierte _Suchfunktion erfasst auch Mitwirkende" #: ../quodlibet/browsers/albums/prefs.py:93 msgid "Options" msgstr "Optionen" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Alben-Anzeige" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Ungültige Vorlage" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Unbekannt" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Neuer Feed" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Geben Sie die URL des Audio-Feed an:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio-Feeds" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio-Feeds" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Download" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Dateien herunterladen" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Datei herunterladen" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Feed konnte nicht hinzugefügt werden" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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> 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "Bibliothek aktualisieren" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "_Dateien löschen" #: ../quodlibet/browsers/audiofeeds.py:501 #, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "»%s« konnte nicht importiert werden, der Browser für Audio-Feeds wurde " "deaktiviert." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Bibliothek-Browser" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, python-format msgid "Unknown %s" msgstr "%s ist unbekannt" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Multiple %s Values" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Benutzerdefiniert" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "_Bewertung entfernen" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Zusammenführen" #: ../quodlibet/browsers/collection/prefs.py:187 msgid "Album Collection Preferences" msgstr "Einstellungen der Albensammlung" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Browser deaktivieren" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "Browser _deaktivieren" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Dateisystem" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "Dateis_ystem" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Titel konnten nicht kopiert werden" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Zur Bibliothek hinzufügen" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Dateityp wird nicht unterstützt" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Sender konnte nicht hinzugefügt werden" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internet-Radio" #: ../quodlibet/browsers/iradio.py:239 msgid "Downloading station list" msgstr "Senderliste wird heruntergeladen" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Neuer Sender" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Klassik" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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 "Sender akt_ualisieren" #: ../quodlibet/browsers/iradio.py:483 msgid "_Internet Radio" msgstr "Internet-_Radio" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Neuer Sender" #: ../quodlibet/browsers/iradio.py:552 msgid "_Update Stations" msgstr "Sender akt_ualisieren" #: ../quodlibet/browsers/iradio.py:579 msgid "All Stations" msgstr "Alle Sender" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Favoriten" #: ../quodlibet/browsers/iradio.py:591 msgid "No Category" msgstr "Keine Kategorie" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Keine Sender gefunden" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Unter %s wurden keine Internet-Radiosender gefunden." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Alle aufgelisteten Sender befinden sich bereits in Ihrer Bibliothek." #: ../quodlibet/browsers/iradio.py:837 msgid "Add to Favorites" msgstr "Zu Favoriten hinzufügen" #: ../quodlibet/browsers/iradio.py:841 msgid "Remove from Favorites" msgstr "Aus Favoriten löschen" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Geräte-Eigenschaften" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Gerät:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Nicht eingebunden" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Mountpunkt:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "_Name:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Mediaplayer" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Mediaplayer" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Auswerfen" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Eigenschaften" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "_Umbenennen" #: ../quodlibet/browsers/media.py:459 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> verwendet, <b>%s</b> verfügbar" #: ../quodlibet/browsers/media.py:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> ist nicht verbunden." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopiere <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Titel konnte nicht kopiert werden" #: ../quodlibet/browsers/media.py:512 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:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> konnte nicht kopiert werden." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Titel konnten nicht gelöscht werden" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Lösche <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> konnte nicht gelöscht werden." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Der Titel konnte nicht gelöscht werden" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Auswerfen von <b>%s</b> fehlgeschlagen." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Datenträger konnte nicht ausgeworfen werden" #: ../quodlibet/browsers/media.py:601 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:38 msgid "Paned Browser" msgstr "Browser" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "Br_owser" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "A_lle auswählen" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Alle" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "_Breitbildmodus" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Einstellungen des Browsers" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Wiedergabelisten" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "Wieder_gabelisten" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "Aus Wiede_rgabeliste löschen" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Importieren" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Neue Wiedergabeliste" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Die Wiedergabeliste konnte nicht importiert werden." #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Die Wiedergabeliste konnte nicht umbenannt werden." #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Wiedergabeliste importieren" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "Wiedergabeliste a_nlegen" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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] "" "Sind Sie sicher, dass Sie die Bewertung von %d Titeln ändern möchten?" msgstr[1] "" "Sind Sie sicher, dass Sie die Bewertung von %d Titeln ändern möchten?" #: ../quodlibet/browsers/playlists/menu.py:87 #, fuzzy, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Entfernen der Wiedergabeliste bestätigen" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 msgid "Enter a name for the new playlist:" msgstr "Geben Sie einen Namen für die neue Wiedergabeliste ein:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet läuft momentan nicht." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "Musik-Bibliothek und -Player" #: ../quodlibet/cli.py:83 msgid "[option]" msgstr "[Option]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Momentan gespielten Titel anzeigen" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Wiedergabe sofort starten" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Nächsten Titel abspielen" #: ../quodlibet/cli.py:91 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:92 msgid "Jump to previous song" msgstr "Vorherigen Titel abspielen" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Wiedergabe" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Pause" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Zwischen Wiedergabe/Pause umschalten" #: ../quodlibet/cli.py:96 msgid "Stop playback" msgstr "Wiedergabe stoppen" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Lautstärke erhöhen" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Lautstärke senken" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Wiedergabestatus anzeigen" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Hauptfenster verbergen" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Hauptfenster anzeigen" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Hauptfenster anzeigen/verbergen" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Fokus auf laufenden Player setzen" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Aktive Browserfilter entfernen" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Bibliothek aktualisieren und neu einlesen" #: ../quodlibet/cli.py:106 msgid "List available browsers" msgstr "Verfügbare Browser auflisten" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Aktuelle Wiedergabeliste anzeigen" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Aktuelle Warteschlange anzeigen" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Aktuelle Warteschlange anzeigen" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Ohne Plugins starten" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet läuft momentan nicht." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Quod Libet beenden" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Zu einer bestimmten Position im momentan abgespielten Titel gehen" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Wiedergabereihenfolge einstellen oder wechseln" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Endlosschleife ein-, aus-, oder zwischen beiden Modi umschalten" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Lautstärke einstellen" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Audio-Bibliothek durchsuchen" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "Abfrage" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Datei abspielen" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "Dateiname" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Abgespielten Titel bewerten" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Aktuellen Browser einstellen" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Neuen Browser öffnen" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Warteschlange anzeigen oder verbergen" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Titelliste anzeigen oder verbergen" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Nach zufälligem Wert filtern" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Nach Tag-Wert filtern" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "tag=Wert" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Eine Datei oder eine Abfrage zur Warteschlange hinzufügen" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "" "Mehrere Dateien – durch Kommata getrennt – zur Warteschlange hinzufügen" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "Dateiname" # Klingt genauso wackelig wie das Englische. Was meinst? #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Dateinamen von Abfrageergebnissen auf Standardausgabe ausgeben" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Eine Datei oder eine Abfrage aus Warteschlange entfernen" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argument für »%s« ungültig." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Geben Sie »%s --help« ein." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Unbekanntes Gerät" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r ist kein unterstütztes Gerät." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: %s wurde nicht gefunden." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Initialisiere Geräte-Backend." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "Versuche »%s«" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Konnte nicht mit einem Geräte-Backend verbinden." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Geräte-Backend initialisiert." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Nicht initialisierter iPod" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Möchten Sie eine leere Datenbank auf diesem iPod anlegen?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Lautstärkenverstärkung (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Alben-_Cover kopieren" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Tags _mit unterschiedlichen Werten zusammenführen" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Titel mit _Version" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Albu_m mit CD-Untertitel" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modell:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Speicherkapazität:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmware:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "Verwaister iPod-Titel wird entfernt" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Die iPod-Datenbank konnte nicht gespeichert werden" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Die iPod-Datenbank konnte nicht gespeichert werden" #: ../quodlibet/devices/ipod.py:455 msgid "Could not find libgpod, iPod support disabled." msgstr "»libgpod« nicht gefunden, iPod-Unterstützung deaktiviert." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Vorlage für _Dateinamen:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Ungenutzte Cover und Ordner entfernen" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz Titel-ID" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Ungültige Kodierung]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Titel" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio-Tags in einem Editor bearbeiten" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "Titel_anfang in Großbuchstaben" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 #, fuzzy msgid "_Human title case" msgstr "Übliche Groß-/Kleinschreibung in Titeln verwenden" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 #, fuzzy msgid "Advanced Preferences" msgstr "Einstellungen des Browsers" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Gesamtgröße:" #: ../quodlibet/ext/events/animosd/prefs.py:176 msgid "Display" msgstr "Anzeige" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Bewertung" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Audio-Pipeline:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Anzeige bearbeiten" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Voransicht" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matisch" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matisch" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "Das aktuelle Audio-Backend unterstützt keine URLs, der Browser für Audio-" "Feeds wurde deaktiviert." #: ../quodlibet/ext/events/equalizer.py:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "%.1f Sekunden" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Benutzerdefiniert" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Fehler anzeigen" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Audioplayer" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internet-Radio" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "URL" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Hauptfenster verbergen" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 msgid "Preferences" msgstr "Einstellungen" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "_Titel" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Konnte nicht mit einem Geräte-Backend verbinden." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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 "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Konnte nicht mit einem Geräte-Backend verbinden." #: ../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:461 #, fuzzy msgid "_Service:" msgstr "Gerät:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "_Name:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Weitere:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Künstler" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "Vorlage für _Dateinamen:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Alb_um zufällig auswählen" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "Alben" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Bewertung" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Alb_um zufällig auswählen" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Wiedergabeliste importieren" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importieren" #: ../quodlibet/ext/events/screensaver.py:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Keine Wiedergabe" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "%d Titel" # 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:'. #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Vorlagen für Dateipfade" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Anzeige bearbeiten" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Keine Wiedergabe" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "Wieder_gabelisten" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Abspielen/Stoppen" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "Vorheriger" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Nächster" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "Reihenf_olge:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "En_dlosschleife" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Nach diesem Titel stoppen" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "Bibli_othek durchsuchen" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "_Tags bearbeiten" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 msgid "_Information" msgstr "_Informationen" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Texte" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Texte" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Dateien:" #: ../quodlibet/ext/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Voransicht" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Nach _Künstler filtern" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "_Standardbewertung:" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "Benutzerdefinierte Sortierung" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Nach _Genre filtern" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Nach _Künstler filtern" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio-Feeds" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Geben Sie die URL des Audio-Feed an:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Duplikate entfernen" #: ../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] "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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Neue Wiedergabeliste" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Warteschlange" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Nie" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "Titel-Spitzenpegel" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Konnte nicht mit einem Geräte-Backend verbinden." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "_Umbenennen" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Bibliothek" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Hauptfenster verbergen" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Dateiname" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Der Titel konnte nicht gespeichert werden" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Alben-Cover" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, fuzzy, python-format msgid "from %(source)s" msgstr "Quellen für Cover-Bilder" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Größe" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "S_uche:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Suchen" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Alben-Cover" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 #, fuzzy msgid "Sources" msgstr "Quellen für Cover-Bilder" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "Lesezeichen bearbeiten..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "Lesezeichen bearbeiten..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Lesezeichen" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Dateiname" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Titel" #: ../quodlibet/ext/songsmenu/brainz.py:119 msgid "Title" msgstr "Titel" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Künstler" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Keine Plugins gefunden" #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "und %d weitere..." msgstr[1] "und %d weitere..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz Album-Typ" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "Abfrage" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Suchen" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz Album-Typ" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "CD von _Album trennen" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Browser" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Ordner konnte nicht angelegt werden" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Titel-Liste" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Zeit" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "A_lle auswählen" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "Tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "_Umbenennen" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "Tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Ungültige Vorlage" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Ungültiger Wert" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "Benutzerdefinierte Sortierung" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Titel konnten nicht kopiert werden" #: ../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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Browser deaktivieren" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Duplikate entfernen" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Duplikate entfernen" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Duplikate entfernen" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "_Bewertung entfernen" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Anzeige bearbeiten" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Alle eingebetteten Bilder entfernen" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Alle eingebetteten Bilder entfernen" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Alle Tags entfernen" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Nach Tag-Wert filtern" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Nach _Genre filtern" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Warteschlange" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Fehler" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Schreiben" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz Titel-ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "Ordner" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Album-Modus" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Schreiben" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Wiedergabeliste importieren" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Fehler beim Laden von %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "_Umbenennen" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Der Titel konnte nicht gespeichert werden" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Keine Plugins gefunden" #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Texte" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Texte" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Wiedergabelisten" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Die Wiedergabeliste konnte nicht importiert werden." #: ../quodlibet/ext/songsmenu/playlist.py:151 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Auswerfen von <b>%s</b> fehlgeschlagen." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:19 #, fuzzy msgid "Refresh Songs" msgstr "Bibliothek aktualisieren" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d Titel" msgstr[1] "%d Titel" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "Bibliothek aktualisieren" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Tags bearbeiten" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Tags bearbeiten" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Alle Alben" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Suchen" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" # 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/ext/songsmenu/website_search.py:79 #, fuzzy msgid "Search URL patterns" msgstr "Vorlagen für Dateipfade" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Gespeicherte Suchläufe bearbeiten..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, fuzzy msgid "Configure searches…" msgstr "_Suchbegriffe einfärben" #: ../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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Bibliothek" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Prüfe Mount-Punkte" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Audio-Bibliothek wird eingelesen" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "%s wird eingelesen" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "Datei konnte nicht geladen werden: %r" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Tags auflisten" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:43 msgid "Also list programmatic tags" msgstr "Auch programmatische Tags anzeigen" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Nicht genügend Argumente" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 msgid "Too many arguments" msgstr "Zu viele Argumente" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 msgid "Description" msgstr "Beschreibung" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Wert" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Alle allgemeinen Tags auflisten" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Tags von einer Datei in eine andere Datei kopieren" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Änderungen anzeigen, aber nicht anwenden" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Nicht schreibbare Tags überspringen" #: ../quodlibet/operon/commands.py:135 #, 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:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio-Tags in einem Editor bearbeiten" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Keine Titel ausgewählt" #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "%r kann nicht gesetzt werden" #: ../quodlibet/operon/commands.py:309 msgid "Remove tags" msgstr "Tags entfernen" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "Wert ist ein regulärer Ausdruck" #: ../quodlibet/operon/commands.py:318 msgid "Remove all tags" msgstr "Alle Tags entfernen" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "»--all« kann nicht mit »--regexp« kombiniert werden" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "»%r« kann nicht aus »%r« entfernt werden" #: ../quodlibet/operon/commands.py:369 msgid "Remove a tag value" msgstr "Einen Tag-Wert entfernen" #: ../quodlibet/operon/commands.py:418 msgid "Add a tag value" msgstr "Einen Tag-Wert hinzufügen" #: ../quodlibet/operon/commands.py:446 msgid "List file information" msgstr "Dateiinformationen anzeigen" # Was genau bedeutet hier 'provided'? #: ../quodlibet/operon/commands.py:492 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:505 #, python-format msgid "Failed to load image file: %r" msgstr "Die Bilddatei konnte nicht geladen werden: %r" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, 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:525 msgid "Remove all embedded images" msgstr "Alle eingebetteten Bilder entfernen" #: ../quodlibet/operon/commands.py:552 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:564 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:623 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Datei" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Titelnummern in allen Dateien einfügen" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:752 msgid "Display help information" msgstr "Hilfeinformationen anzeigen" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "»%s« ist kein gültiger Name für eine Spalte (%s)." #: ../quodlibet/player/gstbe/player.py:92 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Puffer wird gefüllt" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "GStreamer-Standard-Pipeline konnte nicht angelegt werden" #: ../quodlibet/player/gstbe/player.py:553 #, fuzzy msgid "No GStreamer element found to handle media format" msgstr "" "Es wurde kein GStreamer-Element für das folgende Medienformat gefunden: " "%(format_details)r" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Das GStreamer-Plugin »%(name)s« konnte nicht initialisiert werden" #: ../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 "" "Die Pipeline für die GStreamer-Audioausgabe, z. B. »alsasink " "device=default«. Leer lassen, um die Standardpipeline zu verwenden." #: ../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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Keine Sender gefunden" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Ungültige GStreamer Ausgabe-Pipeline, versuche die Standard-Pipeline." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Der Audioausgang konnte nicht angelegt werden" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, 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:69 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Das GStreamer-Element »{element}« wurde nicht gefunden." #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Plugins" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Unterstützte Formate: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Audiogerät: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Titelanfang" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "k. A." #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Zeit" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Lesezeichenname" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Lesezeichen" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Filter" #: ../quodlibet/qltk/browser.py:51 msgid "Recently _Played" msgstr "Zuletzt _abgespielt" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Zuletzt _hinzugefügt" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:57 msgid "All _Songs" msgstr "Alle _Titel" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Nach _Genre filtern" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Nach _Künstler filtern" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Nach _Album filtern" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "G_enre zufällig auswählen" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Kü_nstler zufällig auswählen" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Alb_um zufällig auswählen" #: ../quodlibet/qltk/browser.py:89 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Die 40 meist gespielten Titel (mehr als 40 werden ausgewählt bei Gleichstand)" #: ../quodlibet/qltk/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Keine Informationen zur Abspieldauer" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Wert:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Gespeicherte Werte" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Gespeicherte Werte bearbeiten..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Titel" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Verbleibende Abspieldauer anzeigen" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Auto_matisch" #: ../quodlibet/qltk/controls.py:322 msgid "_Track Mode" msgstr "_Titel-Modus" #: ../quodlibet/qltk/controls.py:323 msgid "_Album Mode" msgstr "_Album-Modus" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "ReplayGain-Lautstärkeanpassung" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Unbekannt" #: ../quodlibet/qltk/data_editors.py:349 #, fuzzy msgid "Tag expression" msgstr "Wert ist ein regulärer Ausdruck" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Neuen Wert eingeben" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Ein Fehler ist aufgetreten" # Error in source string URL: # Blank space before "/list". #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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>%s</b> gespeichert. Sie kann uns bei der Fehlerbehebung helfen. " "Bitte legen Sie unter http://code.google.com/p/quodlibet/issues/list 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>%s</b> mit einer Beschreibung dessen, was zum Auftreten " "des Fehlers führte." #: ../quodlibet/qltk/debugwindow.py:141 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." #: ../quodlibet/qltk/delete.py:33 msgid "Files:" msgstr "Dateien:" #: ../quodlibet/qltk/delete.py:59 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:68 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Die ausgewählten Titel werden aus der Bibliothek entfernt." #: ../quodlibet/qltk/delete.py:73 #, 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:90 msgid "_Delete Files" msgstr "_Dateien löschen" #: ../quodlibet/qltk/delete.py:105 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:114 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "Die ausgewählten Titel werden aus der Bibliothek entfernt." #: ../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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_In den Papierkorb verschieben" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Verschiebe %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 msgid "Unable to move to trash" msgstr "Konnte nicht in den Müll verschieben" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 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:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Lösche %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 msgid "Unable to delete files" msgstr "Dateien konnten nicht gelöscht werden" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "In _mehrere Werte aufteilen" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "CD von _Album trennen" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "_Version von Titel trennen" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Arrangeur von Küns_tler trennen" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "_Interpret von Künstler trennen" #: ../quodlibet/qltk/edittags.py:271 msgid "Split _Performer out of Title" msgstr "_Interpret von Titel trennen" #: ../quodlibet/qltk/edittags.py:277 msgid "Split _Originalartist out of Title" msgstr "_Originalkünstler von Titel trennen" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Tag hinzufügen" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:409 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 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Nie" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:657 msgid "Unable to add tag" msgstr "Tag konnte nicht hinzugefügt werden" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Titel konnte nicht hinzugefügt werden" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "<b>%s</b> konnte nicht hinzugefügt werden.\n" "\n" "Die momentan ausgewählten Dateien unterstützen keine mehrfachen Werte." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Ungültiges Tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Ungültiges Tag <b>%s</b>\n" "\n" "Die ausgewählten Dateien unterstützen das Bearbeiten dieses Tags nicht." #: ../quodlibet/qltk/edittags.py:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Ungültiger Wert" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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 #, 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> 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.\n" "\n" "Wollen Sie diesen Titel trotzdem speichern?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Der Titel konnte nicht gespeichert werden" #: ../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 "" "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/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Weitere Optionen..." #: ../quodlibet/qltk/entry.py:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso Einstellungen" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Trenne _nach:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Tags bearbeiten" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Ordner" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Neuer Ordner" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "All_e Unterordner auswählen" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Neuer Ordner" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Geben Sie einen Namen für den neuen Ordner ein:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Ordner konnte nicht angelegt werden" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Ordner konnte nicht gelöscht werden" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "von %s" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "CD %s" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "Titel %s" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Anzeige bearbeiten" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Keine Titel ausgewählt." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Keine Titel" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informationen" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Texte" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "Künstler" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "Künstler" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "Interpreten" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Nie" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "Hinzugefügt" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "Letzte Wiedergabe" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "Wiedergegeben" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "Übersprungen" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "Bewertung" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "Dauer" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informationen" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Aufsteigend" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "Bitrate" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "Dateigröße" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "Geändert" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d ausgewählt" msgstr[1] "%d ausgewählt" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "Produziert von %s" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "Interpret" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Titel nicht verfügbar" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Ausgewählte Diskographie" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "Alben" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Gesamtdauer:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Gesamtgröße:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Dateien" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:37 #, fuzzy 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Für diesen Titel wurden keine Texte gefunden." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Liedtext wird gesucht..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Liedtext konnte nicht heruntergeladen werden." #: ../quodlibet/qltk/maskedbox.py:19 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:20 msgid "The selected songs will be removed from the library." msgstr "Die ausgewählten Titel werden aus der Bibliothek entfernt." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "Einblenden" #: ../quodlibet/qltk/maskedbox.py:85 #, fuzzy msgid "_Unhide" msgstr "Einblenden" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Änderungen an den Tags verwerfen?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Nie" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Datei existiert" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Dateien umbenennen" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Aktive Prozesse" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "%d aktive Prozesse" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Unbekannt" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Normal" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_Normal" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Zufall" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Zufall" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Bewertung" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Bewertung" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Einzelner Titel" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Einzelner Titel" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Plugin-Fehler" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Aktiviert" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Deaktiviert" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Keine Kategorie" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Keine Plugins gefunden." #: ../quodlibet/qltk/pluginwin.py:277 msgid "Plugins" msgstr "Plugins" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "_Fehler anzeigen" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_CD" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Titel-Nr." #: ../quodlibet/qltk/prefs.py:45 msgid "Grou_ping" msgstr "Gru_ppieren" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "_Album" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "Datei_name" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "Dau_er" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Titelliste" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "Automatisch zu aktuellem Titel _springen" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Verhalten" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Weitere:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "B_earbeiten..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Weitere Listenspalten hinzufügen oder entfernen" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Anzuzeigende Listenspalten" #: ../quodlibet/qltk/prefs.py:112 msgid "Artist includes all _people" msgstr "Künstler mit allen _Mitwirkenden" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Dateiname mit _Pfad" #: ../quodlibet/qltk/prefs.py:132 msgid "Column Preferences" msgstr "Einstellungen für Listenspalten" #: ../quodlibet/qltk/prefs.py:138 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:221 #, fuzzy msgid "Edit Columns" msgstr "Zusätzliche Listenspalten" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Browser" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "_Globaler Filter:" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Suchen" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Gleichzeitiges Bewerten _mehrerer Titel bestätigen" #: ../quodlibet/qltk/prefs.py:256 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:259 msgid "Enable _one-click ratings" msgstr "Bewertungen mit _einfachem Klick zulassen" #: ../quodlibet/qltk/prefs.py:261 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Bewertungen" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "Alben-Cover mit abger_undeten Ecken darstellen" #: ../quodlibet/qltk/prefs.py:274 #, fuzzy msgid "Round the corners of album artwork thumbnail images." msgstr "" "Die Ecken der Alben-Cover werden abgerundet dargestellt. Möglicherweise ist " "ein Programmneustart erforderlich." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "_Eingebettete Cover-Bilder bevorzugen" #: ../quodlibet/qltk/prefs.py:282 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:287 msgid "_Fixed image filename:" msgstr "_Festgelegter Dateiname für Bilddatei:" #: ../quodlibet/qltk/prefs.py:289 msgid "The single image filename to use if selected" msgstr "Der für die Bilddatei zu verwendende Dateiname" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Die zwingend zu verwendende Bilddatei" #: ../quodlibet/qltk/prefs.py:304 msgid "Album Art" msgstr "Alben-Cover" #: ../quodlibet/qltk/prefs.py:328 msgid "Playback" msgstr "Wiedergabe" #: ../quodlibet/qltk/prefs.py:333 msgid "Output Configuration" msgstr "Konfiguration der Tonausgabe" #: ../quodlibet/qltk/prefs.py:344 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:347 msgid "_Fall-back gain (dB):" msgstr "_Standardverstärkung (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 msgid "_Pre-amp gain (dB):" msgstr "_Vorverstärkung (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "ReplayGain-Lautstärkeanpassung _aktivieren" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "ReplayGain-Lautstärkeanpassung" #: ../quodlibet/qltk/prefs.py:420 msgid "_Default rating:" msgstr "_Standardbewertung:" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Bewertungs_skala:" #: ../quodlibet/qltk/prefs.py:512 #, fuzzy 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:517 #, fuzzy msgid "_Bayesian averaging amount:" msgstr "_Bayesscher Mittelwert:" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Bewertungen und Wiedergabe_anzahl speichern" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_E-Mail:" #: ../quodlibet/qltk/prefs.py:532 msgid "Ratings and play counts will be set for this email address" msgstr "" "Bewertungen und Angaben zur Wiedergabeanzahl werden dieser E-Mailadresse " "zugeordnet" #: ../quodlibet/qltk/prefs.py:547 msgid "Auto-save tag changes" msgstr "Änderungen an Tags automatisch speichern" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Liste von Trennzeichen, die zum Aufteilen von Tag-Feldern verwendet werden. " "Einträge dieser Liste werden durch Leerzeichen voneinander getrennt." #: ../quodlibet/qltk/prefs.py:579 msgid "Tags" msgstr "Tags" #: ../quodlibet/qltk/prefs.py:600 msgid "Updating for new ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "Bibliothek beim Programmstart _aktualisieren" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "Bibliothek _aktualisieren" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Bibliothek auf Änderungen überprüfen" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Bibliothek _neu laden" #: ../quodlibet/qltk/prefs.py:630 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Alle Titel in der Bibliothek neu laden (dauert möglicherweise lange)" #: ../quodlibet/qltk/prefs.py:640 msgid "Scan Directories" msgstr "Ordner einlesen" #: ../quodlibet/qltk/prefs.py:646 msgid "Hidden Songs" msgstr "Ausgeblendete Titel" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Eigenschaften" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Warteschlange" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Alle Titel aus Warteschlange entfernen" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Zufall" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Wiedergabeliste nach Abspielen aller Titel von vorn beginnen" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Wiedergabe" #: ../quodlibet/qltk/quodlibetwindow.py:382 msgid "Set up library directories?" msgstr "Ordner für Bibliothek einrichten?" #: ../quodlibet/qltk/quodlibetwindow.py:383 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:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Titel konnten nicht hinzugefügt werden" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> verwendet ein nicht unterstütztes Protokoll." #: ../quodlibet/qltk/quodlibetwindow.py:800 msgid "_Music" msgstr "_Musik" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Ordner hinzufügen..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Datei hinzufügen..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "URL hinzufügen" #: ../quodlibet/qltk/quodlibetwindow.py:818 msgid "Open _Browser" msgstr "_Browser öffnen" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Steuerung" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Zum abgespielten Titel springen" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Ansicht" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Hilfe" #: ../quodlibet/qltk/quodlibetwindow.py:876 msgid "Stop After This Song" msgstr "Nach diesem Titel stoppen" #: ../quodlibet/qltk/quodlibetwindow.py:882 msgid "Add Bookmark" msgstr "Lesezeichen hinzufügen" #: ../quodlibet/qltk/quodlibetwindow.py:888 msgid "Edit Bookmarks…" msgstr "Lesezeichen bearbeiten…" #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Online-Hilfe" #: ../quodlibet/qltk/quodlibetwindow.py:907 msgid "Search Help" msgstr "Hilfe zu Sucheingaben" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "_Titelliste" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "URL hinzufügen" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Geben Sie die URL einer Audio-Datei an:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Die URL konnte nicht hinzugefügt werden." #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> ist keine gültige URL." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Musik hinzufügen" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Diesen Ordner auf neue Titel prüfen" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 msgid "The saved ratings will be removed" msgstr "Die gespeicherten Bewertungen werden entfernt" #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 #, fuzzy msgid "Change _Rating" msgstr "_Bewertung" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "_Bewertung entfernen" #: ../quodlibet/qltk/ratingsmenu.py:76 msgid "_Remove rating" msgstr "_Bewertung entfernen" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Leerzeichen durch _Unterstriche ersetzen" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Von MS _Windows nicht unterstützte Zeichen entfernen" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "_Diakritische Zeichen entfernen" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Nicht-_ASCII-Zeichen entfernen" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Nur _Kleinschreibung verwenden" #: ../quodlibet/qltk/renamefiles.py:122 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:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Vorlagen für Dateipfade" # Für mich sieht das eher nach 'Profile' aus. # –> Jo, wesentlich besser. Global geändert. #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Gespeicherte Vorlagen bearbeiten..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Voransicht" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Neuer Name" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Die Datei konnte nicht umbenannt werden" #: ../quodlibet/qltk/renamefiles.py:253 #, 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 "" "Umbenennen von <b>%s</b> nach <b>%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:261 msgid "Ignore _All Errors" msgstr "_Alle Fehler ignorieren" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Fortfahren" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Der Pfad ist nicht absolut" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 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:108 msgid "Select Directories" msgstr "Ordner auswählen" #: ../quodlibet/qltk/searchbar.py:49 msgid "Saved Searches" msgstr "Gespeicherte Suchläufe" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Gespeicherte Suchläufe bearbeiten..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Suchen" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "Bibliothek mit Freitexteingaben oder QL-Abfragen durchsuchen" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Suche bei Eingabe _starten" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "Suchergebnisse umgehend nach Beenden der Eingabe anzeigen." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Bewertung" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "Nach %s _filtern" #: ../quodlibet/qltk/songlist.py:1071 msgid "All _Headers" msgstr "_Alle Listenspalten" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Listenspalten zu _Titeln" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "Listenspalten zu _Alben" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "Listenspalten zu _Mitwirkenden" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "Listenspalten zum _Datum" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "Listenspalten zu _Dateien" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "Listenspalten zur _Produktion" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "Listenspalten _anpassen ..." #: ../quodlibet/qltk/songlist.py:1097 #, fuzzy msgid "_Expand Column" msgstr "Zusätzliche Listenspalten" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Wiedergabelisten" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Zur _Warteschlange hinzufügen" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "Auf _Gerät übertragen" #: ../quodlibet/qltk/songsmenu.py:364 msgid "_Remove from library" msgstr "Aus Bibliothek entfe_rnen" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "_Unterstriche durch Leerzeichen ersetzen" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "Titel_anfang in Großbuchstaben" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "In _mehrere Werte aufteilen" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Tags aus Dateipfad erzeugen" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Neue Tags überschreiben bestehende Tags" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Neue Tags werden zu den vorhandenen Tags hinzugefügt" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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 "" "Die Vorlage\n" "\t<b>%s</b>\n" "ist ungültig. Möglicherweise enthält sie den gleichen Tag zweimal, oder sie " "enthält nicht zueinander passende Klammern (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:213 msgid "Invalid tags" msgstr "Ungültige Tags" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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 "" "Die von Ihnen eingegebene Vorlage 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:154 msgid "Edit Display" msgstr "Anzeige bearbeiten" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Titelnummern" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Starten bei:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "_Titel insgesamt:" #: ../quodlibet/qltk/unity.py:51 msgid "Play/Pause" msgstr "Abspielen/Stoppen" #: ../quodlibet/qltk/unity.py:74 msgid "Previous" msgstr "Vorheriger" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "und %d weitere..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Geänderte Titel werden gespeichert." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Verschiebe %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Die Wiedergabeliste %s existiert bereits." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "Cover einbetten" #: ../quodlibet/util/cover/built_in.py:19 #, fuzzy msgid "Uses covers embedded into audio files." msgstr "In Audiodateien eingebettete Coverbilder verwenden" #: ../quodlibet/util/cover/built_in.py:41 msgid "Filesystem cover" msgstr "Dateisystem-Cover" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" # "Debug" untranslated in German strings hence "D:" remains unchanged. #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "D: " #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "W: " #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "F: " #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Kurzinfo zur Benutzung anzeigen" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Info zu Version und Copyright anzeigen" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[Optionen]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Die Option %r ist ungültig." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "Die Option %r erfordert ein Argument." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r ist kein eindeutiger Präfix." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbit/s" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d Sekunde" msgstr[1] "%d Sekunden" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d Minute" msgstr[1] "%d Minuten" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d Stunde" msgstr[1] "%d Stunden" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d Tag" msgstr[1] "%d Tage" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "no title-casing" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 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:102 msgid "Unable to edit song" msgstr "Der Titel kann nicht bearbeitet werden" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Ungültige Kodierung]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "Album" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "Arrangeur" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "Arrangeure" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "Arrangeur" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "Autor" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "Autoren" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "Komponist" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "Komponisten" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "Komponist" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "Dirigent" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "Dirigenten" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "Dirigent" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "Kontakt" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "Copyright" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "Datum" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "Beschreibung" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "Genre" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "Genre" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "Gruppieren" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "Sprache" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "Lizenz" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "URL" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "Texter" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "Plattenfirma" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "Titel" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "Version" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "Website" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "Album-Künstler" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "CD-Untertitel" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "CD" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "Titel-Nr." #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "Label-ID" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "Erste Veröffentlichung" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "Originalalbum" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "Originalkünstler" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "Aufnahmedatum" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz Titel-ID" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz Release-ID" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "MusicBrainz Release-ID" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz Künstler-ID" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz Release-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM-ID" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz Albumstatus" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz Album-Typ" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "Lautstärkeverstärkung per Titel" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "Titel-Spitzenpegel" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "Lautstärkeverstärkung per Album" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "Album-Spitzenpegel" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "Referenzlautstärke" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "CDs" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "Titel" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "Zuletzt angespielt" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "Vollst. Dateiname" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "Mount-Punkt" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "Mitwirkende" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "Jahr" #: ../quodlibet/util/tags.py:153 msgid "original release year" msgstr "Jahr der Erstveröffentlichung" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "Lesezeichen" #: ../quodlibet/util/tags.py:157 msgid "file format" msgstr "Dateiformat" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Wiedergabelisten" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ msgid "Unable to open input files" #~ msgstr "Die Eingabedateien konnten nicht geöffnet werden" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer hat kein Element zum Lesen von Dateien. Überprüfen Sie die " #~ "GStreamer-Installation." #~ msgid "Invalid audio backend" #~ msgstr "Ungültiges Audio-Backend" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "Das Audio-Backend %r ist nicht installiert." #~ msgid "Clear search" #~ msgstr "Suchbegriffe löschen" #~ 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 "%d of %d" #~ msgstr "%d von %d" #~ msgid "Usage: %s %s\n" #~ msgstr "Aufruf: %s %s\n" #~ msgid "_Download..." #~ msgstr "_Download..." #~ msgid "_New Station..." #~ msgstr "_Neuer Sender..." #~ 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 "_Edit Bookmarks..." #~ msgstr "Lesezeichen _bearbeiten..." #~ msgid "_New Folder..." #~ msgstr "_Neuer Ordner..." #~ msgid "_Add to Playlist" #~ msgstr "Zur Wiederg_abeliste hinzufügen" #~ msgid "_Edit Display..." #~ msgstr "Anz_eige bearbeiten..." #~ msgid "Output Log" #~ msgstr "Protokoll" #~ msgid "%(song_count)d songs" #~ msgstr "%(song_count)d Titel" #~ msgid "Are you sure?" #~ msgstr "Sind Sie sicher?" #~ msgid "_Add a Location..." #~ msgstr "_URL hinzufügen..." #~ 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 "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] "" #~ "Sind Sie sicher, dass Sie das Plugin »%s« auf %d Titel anwenden möchten?" #~ msgstr[1] "" #~ "Sind Sie sicher, dass Sie das Plugin »%s« auf %d Titel anwenden möchten?" #~ 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] "" #~ "Sind Sie sicher, dass Sie das Plugin »%s« auf %d Album anwenden möchten?" #~ msgstr[1] "" #~ "Sind Sie sicher, dass Sie das Plugin »%s« auf %d Alben anwenden möchten?" #~ msgid "Track Headers" #~ msgstr "Listenspalten zu Titeln" #~ msgid "People Headers" #~ msgstr "Listenspalten zu Mitwirkenden" #~ msgid "Album Headers" #~ msgstr "Listenspalten zu Alben" #~ msgid "Date Headers" #~ msgstr "Listenspalten zum Datum" #~ msgid "File Headers" #~ msgstr "Listenspalten zu Dateien" #~ msgid "Production Headers" #~ msgstr "Listenspalten zur Produktion" #~ 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 "album artist (sort)" #~ msgstr "Album-Künstler (sortieren)" #~ msgid "artist (sort)" #~ msgstr "Künstler (sortieren)" #~ msgid "album (sort)" #~ msgstr "Album (sortieren)" #~ msgid "performer (sort)" #~ msgstr "Interpret (sortieren)" #~ msgid "performers (sort)" #~ msgstr "Interpreten (sortieren)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz Albumkünstler-ID" #~ msgid "errors" #~ msgstr "Fehler" #~ msgid "lyricists" #~ msgstr "Texter" #~ msgid "Refresh Library" #~ msgstr "Bibliothek aktualisieren" # <destination>/<filename>-<index>: # Sind die zu übersetzen? #, fuzzy #~ msgid "" #~ "Extract embedded images to <destination>/<filename>-<index>.(jpeg|png|..)" #~ msgstr "" #~ "Eingebettete Bilder extrahieren nach <destination>/<filename>-<index>." #~ "(jpeg|png|..)" #~ 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 "%(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..." #~ 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 "Other columns to display, separated by spaces" #~ msgstr "" #~ "Weitere anzuzeigende Spalten (durch Leerzeichen voneinander getrennt " #~ "eingeben)" #~ msgid "_Edit and Continue" #~ msgstr "_Bearbeiten und Fortfahren" #, 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] "" #~ "Sie sind im Begriff, die Bewertung von %d Titel zu ändern.\n" #~ "Möchten Sie fortfahren?" #~ msgstr[1] "" #~ "Sie sind im Begriff, die Bewertung von %d Titeln zu ändern.\n" #~ "Möchten Sie fortfahren?" #~ msgid "Confirm rating" #~ msgstr "Bewertung bestätigen" #~ msgid "Search your library" #~ msgstr "Bibliothek durchsuchen" #, 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 und weitere\n" #~ "\n" #~ "Dieses Programm ist freie Software; Konditionen zum Kopieren siehe " #~ "Quellcode.\n" #~ "Dieses Programm beinhaltet KEINERLEI Garantie, keine implizite Garantie " #~ "der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.\n" #~ 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 "gtk-media-next" #~ msgstr "_Nächster" #~ msgid "gtk-media-previous" #~ msgstr "_Vorheriger" #~ msgid "gtk-media-play" #~ msgstr "_Wiedergabe" #~ msgid "gtk-media-pause" #~ msgstr "_Pause" #~ msgid "Not setting process title." #~ msgstr "Prozessname wird nicht gesetzt." #~ msgid "Couldn't find module %s." #~ msgstr "Modul %s wurde nicht gefunden." #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet Plugins" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet Einstellungen" #~ 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 "Quod Libet" #~ msgstr "Quod Libet" #~ 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 "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #~ 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.5.3/po/eu.po����������������������������������������������������������������������������0000644�0001750�0001750�00000503065�12646427553�015356� 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: 2016-01-16 12:54+0100\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" #: ../exfalso.py:29 msgid "an audio tag editor" msgstr "audio etiketa editorea" #: ../exfalso.py:29 ../quodlibet/util/tags.py:143 msgid "directory" msgstr "direktorioa" #: ../quodlibet/browsers/albums/main.py:150 #, fuzzy msgid "_Title" msgstr "Titulua" #: ../quodlibet/browsers/albums/main.py:151 ../quodlibet/qltk/prefs.py:47 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:152 ../quodlibet/qltk/prefs.py:52 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:153 ../quodlibet/qltk/prefs.py:51 #, fuzzy msgid "_Genre" msgstr "Genero" #: ../quodlibet/browsers/albums/main.py:154 #: ../quodlibet/ext/events/trayicon.py:541 ../quodlibet/qltk/prefs.py:56 #: ../quodlibet/qltk/ratingsmenu.py:68 msgid "_Rating" msgstr "_Balorazioa" #: ../quodlibet/browsers/albums/main.py:160 #, fuzzy msgid "Sort _by…" msgstr "Ordena_tu:" #: ../quodlibet/browsers/albums/main.py:181 #: ../quodlibet/browsers/paned/prefs.py:158 #: ../quodlibet/qltk/exfalsowindow.py:85 ../quodlibet/qltk/pluginwin.py:260 #: ../quodlibet/qltk/quodlibetwindow.py:822 #, fuzzy msgid "_Preferences" msgstr "Hobespenak" #: ../quodlibet/browsers/albums/main.py:339 msgid "Album List" msgstr "Album zerrenda" #: ../quodlibet/browsers/albums/main.py:340 msgid "_Album List" msgstr "_Album zerrenda" #: ../quodlibet/browsers/albums/main.py:472 msgid "All Albums" msgstr "Album guztiak" #: ../quodlibet/browsers/albums/main.py:473 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "album %d" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:640 #, 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:25 #: ../quodlibet/browsers/collection/models.py:16 msgid "Songs not in an album" msgstr "Album gabeko kantak" #: ../quodlibet/browsers/albums/prefs.py:63 #: ../quodlibet/ext/songsmenu/cddb.py:260 ../quodlibet/qltk/information.py:344 #: ../quodlibet/util/collection.py:238 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "kanta %d" msgstr[1] "%d kantak" #: ../quodlibet/browsers/albums/prefs.py:64 #: ../quodlibet/qltk/information.py:342 ../quodlibet/util/collection.py:242 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "disko %d" msgstr[1] "%d disko" #: ../quodlibet/browsers/albums/prefs.py:66 #, fuzzy msgid "An Example Album" msgstr "Album guztiak" #: ../quodlibet/browsers/albums/prefs.py:74 msgid "Album List Preferences" msgstr "Album zerrenda hobespenak" #: ../quodlibet/browsers/albums/prefs.py:83 msgid "Show album _covers" msgstr "Ikusi album _karatulak" #: ../quodlibet/browsers/albums/prefs.py:89 msgid "Inline _search includes people" msgstr "Sarezko _bilaketa jendea barneratuz" #: ../quodlibet/browsers/albums/prefs.py:93 #, fuzzy msgid "Options" msgstr "[aukerak]" #: ../quodlibet/browsers/albums/prefs.py:113 msgid "Album Display" msgstr "Album bistaratzea" #: ../quodlibet/browsers/albums/prefs.py:117 ../quodlibet/browsers/media.py:37 #: ../quodlibet/ext/songsmenu/albumart.py:224 #: ../quodlibet/ext/songsmenu/duplicates.py:351 #: ../quodlibet/ext/songsmenu/filterall.py:47 ../quodlibet/qltk/bookmarks.py:97 #: ../quodlibet/qltk/cbes.py:92 ../quodlibet/qltk/data_editors.py:97 #: ../quodlibet/qltk/data_editors.py:318 ../quodlibet/qltk/exfalsowindow.py:268 #: ../quodlibet/qltk/pluginwin.py:66 ../quodlibet/qltk/pluginwin.py:334 #: ../quodlibet/qltk/prefs.py:676 ../quodlibet/qltk/textedit.py:160 msgid "_Close" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:140 #: ../quodlibet/browsers/albums/prefs.py:145 #: ../quodlibet/qltk/tagsfrompath.py:191 ../quodlibet/qltk/textedit.py:137 #: ../quodlibet/util/__init__.py:538 msgid "Invalid pattern" msgstr "Patroi baliogabea" #: ../quodlibet/browsers/audiofeeds.py:49 #: ../quodlibet/browsers/audiofeeds.py:61 #: ../quodlibet/browsers/audiofeeds.py:63 #: ../quodlibet/browsers/audiofeeds.py:148 #: ../quodlibet/browsers/paned/models.py:81 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #: ../quodlibet/formats/_audio.py:406 ../quodlibet/qltk/information.py:217 #: ../quodlibet/qltk/information.py:226 ../quodlibet/qltk/information.py:255 #: ../quodlibet/qltk/playorder.py:20 ../quodlibet/qltk/wlw.py:66 msgid "Unknown" msgstr "Ezezaguna" #: ../quodlibet/browsers/audiofeeds.py:205 msgid "New Feed" msgstr "Jario berria" #: ../quodlibet/browsers/audiofeeds.py:206 msgid "Enter the location of an audio feed:" msgstr "Idatzi audio jarioaren kokapena:" #: ../quodlibet/browsers/audiofeeds.py:207 #: ../quodlibet/browsers/collection/prefs.py:89 #: ../quodlibet/browsers/iradio.py:337 ../quodlibet/browsers/paned/prefs.py:70 #: ../quodlibet/browsers/playlists/menu.py:93 #: ../quodlibet/browsers/playlists/util.py:50 ../quodlibet/qltk/bookmarks.py:58 #: ../quodlibet/qltk/cbes.py:54 ../quodlibet/qltk/data_editors.py:305 #: ../quodlibet/qltk/edittags.py:289 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1185 ../quodlibet/qltk/scanbox.py:68 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:223 msgid "Audio Feeds" msgstr "Audio jarioak" #: ../quodlibet/browsers/audiofeeds.py:224 msgid "_Audio Feeds" msgstr "_Audio jarioak" #: ../quodlibet/browsers/audiofeeds.py:296 #: ../quodlibet/browsers/audiofeeds.py:302 #, fuzzy msgid "_Download…" msgstr "_Deskargatu" #: ../quodlibet/browsers/audiofeeds.py:312 msgid "Download Files" msgstr "Deskargatu fitxategiak" #: ../quodlibet/browsers/audiofeeds.py:314 #: ../quodlibet/browsers/audiofeeds.py:335 #: ../quodlibet/browsers/collection/prefs.py:197 #: ../quodlibet/browsers/paned/prefs.py:199 #: ../quodlibet/browsers/playlists/menu.py:92 #: ../quodlibet/browsers/playlists/util.py:40 ../quodlibet/devices/ipod.py:39 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:17 #: ../quodlibet/ext/songsmenu/brainz.py:413 #: ../quodlibet/ext/songsmenu/cddb.py:175 #: ../quodlibet/ext/songsmenu/editplaycount.py:39 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:279 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 #: ../quodlibet/ext/songsmenu/html.py:73 #: ../quodlibet/ext/songsmenu/importexport.py:30 #: ../quodlibet/ext/songsmenu/lastfmsync.py:199 #: ../quodlibet/ext/songsmenu/playlist.py:68 #: ../quodlibet/ext/songsmenu/replaygain.py:354 #: ../quodlibet/plugins/playlist.py:36 ../quodlibet/qltk/chooser.py:22 #: ../quodlibet/qltk/debugwindow.py:159 ../quodlibet/qltk/delete.py:89 #: ../quodlibet/qltk/delete.py:136 ../quodlibet/qltk/edittags.py:288 #: ../quodlibet/qltk/_editutils.py:38 ../quodlibet/qltk/getstring.py:29 #: ../quodlibet/qltk/maskedbox.py:26 ../quodlibet/qltk/msg.py:53 #: ../quodlibet/qltk/msg.py:92 ../quodlibet/qltk/ratingsmenu.py:32 #: ../quodlibet/qltk/songsmenu.py:41 ../quodlibet/qltk/songsmenu.py:69 msgid "_Cancel" msgstr "" #. Save button #: ../quodlibet/browsers/audiofeeds.py:315 #: ../quodlibet/browsers/audiofeeds.py:336 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:72 #: ../quodlibet/ext/songsmenu/albumart.py:220 #: ../quodlibet/ext/songsmenu/brainz.py:414 #: ../quodlibet/ext/songsmenu/cddb.py:176 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:276 #: ../quodlibet/ext/songsmenu/lastfmsync.py:200 #: ../quodlibet/ext/songsmenu/playlist.py:69 #: ../quodlibet/ext/songsmenu/replaygain.py:355 #: ../quodlibet/qltk/_editutils.py:39 ../quodlibet/qltk/lyrics.py:35 #: ../quodlibet/qltk/msg.py:51 ../quodlibet/qltk/renamefiles.py:167 #: ../quodlibet/qltk/tracknumbers.py:105 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:333 msgid "Download File" msgstr "Deskargatu fitxategia" #: ../quodlibet/browsers/audiofeeds.py:368 #: ../quodlibet/browsers/playlists/main.py:190 #: ../quodlibet/qltk/data_editors.py:94 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:428 #: ../quodlibet/browsers/audiofeeds.py:484 msgid "Unable to add feed" msgstr "Ezin da jarioa gehitu" #: ../quodlibet/browsers/audiofeeds.py:429 #: ../quodlibet/browsers/audiofeeds.py:485 #, 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:436 ../quodlibet/browsers/media.py:215 #: ../quodlibet/browsers/media.py:384 ../quodlibet/qltk/filesel.py:227 #: ../quodlibet/qltk/pluginwin.py:323 #, fuzzy msgid "_Refresh" msgstr "_Freskatu liburutegia" #: ../quodlibet/browsers/audiofeeds.py:437 #: ../quodlibet/browsers/playlists/main.py:404 #: ../quodlibet/browsers/playlists/util.py:41 ../quodlibet/qltk/delete.py:146 #: ../quodlibet/qltk/filesel.py:224 ../quodlibet/qltk/lyrics.py:36 #: ../quodlibet/qltk/maskedbox.py:27 ../quodlibet/qltk/songsmenu.py:377 #, fuzzy msgid "_Delete" msgstr "Ezabatu fitxategiak" #: ../quodlibet/browsers/audiofeeds.py:501 #, fuzzy, python-format msgid "Could not import %s. Audio Feeds browser disabled." msgstr "" "Ezin da python-feedparser inportatu, audio jario nabigatzaile desgaiturik." #: ../quodlibet/browsers/audiofeeds.py:508 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:141 ../quodlibet/browsers/_base.py:144 msgid "Library Browser" msgstr "Liburutegi nabigatzailea" #: ../quodlibet/browsers/_base.py:272 ../quodlibet/qltk/queue.py:185 #, 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/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:23 #, fuzzy, python-format msgid "Unknown %s" msgstr "Ezezaguna" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Zatitu _hainbat baliotan" #: ../quodlibet/browsers/collection/prefs.py:65 #: ../quodlibet/browsers/paned/prefs.py:46 msgid "_Custom" msgstr "_Personalizatu" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:93 #: ../quodlibet/browsers/paned/prefs.py:74 #: ../quodlibet/browsers/playlists/menu.py:94 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:93 ../quodlibet/qltk/bookmarks.py:123 #: ../quodlibet/qltk/cbes.py:81 ../quodlibet/qltk/cbes.py:88 #: ../quodlibet/qltk/data_editors.py:79 ../quodlibet/qltk/data_editors.py:92 #: ../quodlibet/qltk/data_editors.py:295 ../quodlibet/qltk/data_editors.py:308 #: ../quodlibet/qltk/data_editors.py:316 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:632 ../quodlibet/qltk/maskedbox.py:47 #: ../quodlibet/qltk/maskedbox.py:87 ../quodlibet/qltk/queue.py:287 #: ../quodlibet/qltk/scanbox.py:44 ../quodlibet/qltk/scanbox.py:70 #, fuzzy msgid "_Remove" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/browsers/collection/prefs.py:121 #: ../quodlibet/ext/songsmenu/filterall.py:33 #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/qltk/edittags.py:433 msgid "Tag" msgstr "Etiketa" #: ../quodlibet/browsers/collection/prefs.py:127 msgid "Merge" msgstr "Batu" #: ../quodlibet/browsers/collection/prefs.py:187 #, fuzzy msgid "Album Collection Preferences" msgstr "Album zerrenda hobespenak" #: ../quodlibet/browsers/collection/prefs.py:194 #: ../quodlibet/browsers/paned/prefs.py:196 #: ../quodlibet/ext/songsmenu/editplaycount.py:40 #: ../quodlibet/ext/songsmenu/exact_rating.py:31 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:137 #: ../quodlibet/qltk/textedit.py:61 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/empty.py:22 msgid "Disable Browser" msgstr "Desgaitu nabigatzailea" #: ../quodlibet/browsers/empty.py:23 msgid "_Disable Browser" msgstr "_Desgaitu nabigatzailea" #: ../quodlibet/browsers/filesystem.py:39 msgid "File System" msgstr "Fitxategi sistema" #: ../quodlibet/browsers/filesystem.py:40 msgid "_File System" msgstr "_Fixtategi sistema" #: ../quodlibet/browsers/filesystem.py:112 ../quodlibet/browsers/media.py:489 #: ../quodlibet/qltk/songlist.py:245 msgid "Unable to copy songs" msgstr "Ezin dira kantak kopiatu" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/qltk/songlist.py:246 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:187 msgid "_Add to Library" msgstr "_Gehitu liburutegira" #: ../quodlibet/browsers/iradio.py:170 msgid "Unsupported file type" msgstr "Onartzen ez den fitxategi mota" #: ../quodlibet/browsers/iradio.py:171 #, 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:215 ../quodlibet/browsers/iradio.py:228 #: ../quodlibet/browsers/iradio.py:819 msgid "Unable to add station" msgstr "Ezin da katea gehitu" #: ../quodlibet/browsers/iradio.py:239 ../quodlibet/browsers/iradio.py:482 msgid "Internet Radio" msgstr "Internet irratia" #: ../quodlibet/browsers/iradio.py:239 #, fuzzy msgid "Downloading station list" msgstr "Deskargatu fitxategiak" #: ../quodlibet/browsers/iradio.py:335 msgid "New Station" msgstr "Kate berria" #: ../quodlibet/browsers/iradio.py:336 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:41 msgid "Classical" msgstr "Klasikoa" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:56 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:34 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:483 msgid "_Internet Radio" msgstr "_Internet irratia" #: ../quodlibet/browsers/iradio.py:549 #, fuzzy msgid "_New Station…" msgstr "Kate berria" #: ../quodlibet/browsers/iradio.py:552 #, fuzzy msgid "_Update Stations" msgstr "_Kate berria" #: ../quodlibet/browsers/iradio.py:579 #, fuzzy msgid "All Stations" msgstr "Kate berria" #: ../quodlibet/browsers/iradio.py:583 msgid "Favorites" msgstr "Kuttunak" #: ../quodlibet/browsers/iradio.py:591 #, fuzzy msgid "No Category" msgstr "Kategoria gabe" #: ../quodlibet/browsers/iradio.py:811 msgid "No stations found" msgstr "Ez da katerik aurkitu" #: ../quodlibet/browsers/iradio.py:812 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Ez da Intenet irrati katerik topatu %s-en." #: ../quodlibet/browsers/iradio.py:820 msgid "All stations listed are already in your library." msgstr "Zerrendatutako kate guztiak dagoeneko badaude liburutegian." #: ../quodlibet/browsers/iradio.py:837 #, fuzzy msgid "Add to Favorites" msgstr "_Gehitu erreprodukzio-zerrendara" #: ../quodlibet/browsers/iradio.py:841 #, fuzzy msgid "Remove from Favorites" msgstr "_Kendu erreprodukzio-zerrendatik" #: ../quodlibet/browsers/iradio.py:941 #, 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:34 msgid "Device Properties" msgstr "Gailu propietateak" #: ../quodlibet/browsers/media.py:50 msgid "Device:" msgstr "Gailua:" #: ../quodlibet/browsers/media.py:52 msgid "Not mounted" msgstr "Ez dago muntaturik" #: ../quodlibet/browsers/media.py:53 #, fuzzy msgid "Mount point:" msgstr "Muntatze puntua:" #: ../quodlibet/browsers/media.py:59 ../quodlibet/qltk/cbes.py:39 msgid "_Name:" msgstr "Ize_na:" #: ../quodlibet/browsers/media.py:133 msgid "Media Devices" msgstr "Medio gailuak" #: ../quodlibet/browsers/media.py:134 msgid "_Media Devices" msgstr "_Medio gailuak" #. eject button #: ../quodlibet/browsers/media.py:222 ../quodlibet/browsers/media.py:376 msgid "_Eject" msgstr "_Ebatzi" #: ../quodlibet/browsers/media.py:358 #, fuzzy msgid "_Properties" msgstr "Propietateak" #: ../quodlibet/browsers/media.py:363 #: ../quodlibet/browsers/playlists/main.py:412 msgid "_Rename" msgstr "Be_rrizendatu" #: ../quodlibet/browsers/media.py:459 #, 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:477 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> ez dago konektaturik." #: ../quodlibet/browsers/media.py:497 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%(song)s</b> kopiatzen" #: ../quodlibet/browsers/media.py:511 ../quodlibet/browsers/media.py:527 msgid "Unable to copy song" msgstr "Ezin da kanta kopiatu" #: ../quodlibet/browsers/media.py:512 msgid "There is not enough free space for this song." msgstr "Ez kanta honentzako behar aina leku." #: ../quodlibet/browsers/media.py:524 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> ezin izan da kopiatu." #: ../quodlibet/browsers/media.py:543 msgid "Unable to delete songs" msgstr "Ezin dira kantak ezabatu" #: ../quodlibet/browsers/media.py:555 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%(song)s</b> ezabatzen" #: ../quodlibet/browsers/media.py:573 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> ezin izan da ezabatu." #: ../quodlibet/browsers/media.py:577 msgid "Unable to delete song" msgstr "Ezin da abestiak ezabatu" #: ../quodlibet/browsers/media.py:592 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> ebazteak huts egin du." #: ../quodlibet/browsers/media.py:595 msgid "Unable to eject device" msgstr "Ezin da gailua ebatzi" #: ../quodlibet/browsers/media.py:601 msgid "No device backend, Media Devices browser disabled." msgstr "Ez dago gailu azpiegiturarik, media gailu nabigatzailea desgaiturik." #: ../quodlibet/browsers/paned/main.py:38 msgid "Paned Browser" msgstr "Paneldun nabigatzailea" #: ../quodlibet/browsers/paned/main.py:39 msgid "_Paned Browser" msgstr "_Paneldun nabigatzailea" #: ../quodlibet/browsers/paned/main.py:88 msgid "Select _All" msgstr "Hautatu _denak" #: ../quodlibet/browsers/paned/models.py:99 ../quodlibet/qltk/pluginwin.py:108 msgid "All" msgstr "Dena" #: ../quodlibet/browsers/paned/prefs.py:154 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:189 msgid "Paned Browser Preferences" msgstr "Paneldun nabigatzaile hobespenak" #: ../quodlibet/browsers/playlists/main.py:37 msgid "Playlists" msgstr "Erreprodukzio-zerrendak" #: ../quodlibet/browsers/playlists/main.py:38 msgid "_Playlists" msgstr "_Erreprodukzio-zerrendak" #: ../quodlibet/browsers/playlists/main.py:131 msgid "_Remove from Playlist" msgstr "_Kendu erreprodukzio-zerrendatik" #: ../quodlibet/browsers/playlists/main.py:192 msgid "_Import" msgstr "_Inporatu" #: ../quodlibet/browsers/playlists/main.py:342 #: ../quodlibet/browsers/playlists/util.py:48 #: ../quodlibet/util/collection.py:347 msgid "New Playlist" msgstr "Sortu erreprodukzio-zerrenda" #: ../quodlibet/browsers/playlists/main.py:364 #: ../quodlibet/browsers/playlists/main.py:513 msgid "Unable to import playlist" msgstr "Ezin da erreprodukzio-zerrenda inportatu" #: ../quodlibet/browsers/playlists/main.py:365 #: ../quodlibet/browsers/playlists/main.py:514 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:494 msgid "Unable to rename playlist" msgstr "Ezin da erreprodukzio-zerrenda berrizendatu" #: ../quodlibet/browsers/playlists/main.py:502 msgid "Import Playlist" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/browsers/playlists/menu.py:20 #, fuzzy msgid "_New Playlist…" msgstr "_Sortu erreprodukzio-zerrenda" #: ../quodlibet/browsers/playlists/menu.py:44 #: ../quodlibet/qltk/exfalsowindow.py:237 ../quodlibet/qltk/properties.py:155 #: ../quodlibet/util/collection.py:374 #, 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/browsers/playlists/menu.py:83 #, 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:87 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/util.py:31 #, 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:33 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:49 msgid "Enter a name for the new playlist:" msgstr "Idatzi erreprodukzio-zerrenda berriaren izena:" #: ../quodlibet/browsers/playlists/util.py:95 #, 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/cli.py:47 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet ez dago martxan." #: ../quodlibet/cli.py:82 msgid "a music library and player" msgstr "musika liburutegi eta erreproduzigailua" #: ../quodlibet/cli.py:83 #, fuzzy msgid "[option]" msgstr "[aukerak]" #: ../quodlibet/cli.py:85 msgid "Print the playing song and exit" msgstr "Erreproduzitzen den abestia inprimatu eta irten" #: ../quodlibet/cli.py:86 msgid "Begin playing immediately" msgstr "Segituan erreproduzitzen hasiko da" #: ../quodlibet/cli.py:89 msgid "Jump to next song" msgstr "Salto hurrengo abestira" #: ../quodlibet/cli.py:91 msgid "Jump to previous song or restart if near the beginning" msgstr "Salto aurreko abestira, edota, hasieratik gertu balego, berrabiatu" #: ../quodlibet/cli.py:92 msgid "Jump to previous song" msgstr "Salto aurreko abestira" #: ../quodlibet/cli.py:93 msgid "Start playback" msgstr "Hasi erreproduzitzen" #: ../quodlibet/cli.py:94 msgid "Pause playback" msgstr "Gelditu erreproduzitzeaz" #: ../quodlibet/cli.py:95 msgid "Toggle play/pause mode" msgstr "Txandakatu erreproduzitu/gelditu modua" #: ../quodlibet/cli.py:96 #, fuzzy msgid "Stop playback" msgstr "Hasi erreproduzitzen" #: ../quodlibet/cli.py:97 msgid "Turn up volume" msgstr "Igo bolumena" #: ../quodlibet/cli.py:98 msgid "Turn down volume" msgstr "Beheratu bolumena" #: ../quodlibet/cli.py:99 msgid "Print player status" msgstr "Inprimatu erreproduzigailu egoera" #: ../quodlibet/cli.py:100 msgid "Hide main window" msgstr "Ezkutatu leiho nagusia" #: ../quodlibet/cli.py:101 msgid "Show main window" msgstr "Ikusi leiho nagusia" #: ../quodlibet/cli.py:102 msgid "Toggle main window visibility" msgstr "Txandakatu leiho nagusi ikusgarritasuna" #: ../quodlibet/cli.py:103 msgid "Focus the running player" msgstr "Fokoa ipini erreproduzigailua martxan" #: ../quodlibet/cli.py:104 msgid "Remove active browser filters" msgstr "Kendu nabigatzaile filtroak" #: ../quodlibet/cli.py:105 msgid "Refresh and rescan library" msgstr "Freskatu eta liburutegia berrarakatu" #: ../quodlibet/cli.py:106 #, fuzzy msgid "List available browsers" msgstr "Desgaitu nabigatzailea" #: ../quodlibet/cli.py:107 msgid "Print the current playlist" msgstr "Inprimatu uneko erreprodukzio-zerrenda" #: ../quodlibet/cli.py:108 msgid "Print the contents of the queue" msgstr "Inprimatu ilararen edukiak" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Print the active text query" msgstr "Inprimatu ilararen edukiak" #: ../quodlibet/cli.py:110 msgid "Start without plugins" msgstr "Hasi pluginik gabe" #: ../quodlibet/cli.py:111 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet ez dago martxan." #: ../quodlibet/cli.py:112 msgid "Exit Quod Libet" msgstr "Itxi Qoud Libet" #: ../quodlibet/cli.py:117 msgid "Seek within the playing song" msgstr "Bilatu jotzen ari den anestian" #: ../quodlibet/cli.py:117 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:118 msgid "Set or toggle the playback order" msgstr "Ezarri edo txandakatu erreprodukzio ordena" #: ../quodlibet/cli.py:120 msgid "Turn repeat off, on, or toggle it" msgstr "Errepikapenak gaitu, desgaitu edo txanda" #: ../quodlibet/cli.py:121 msgid "Set the volume" msgstr "Ezarri bolumena" #: ../quodlibet/cli.py:122 msgid "Search your audio library" msgstr "Bilatu audio liburutegian" #: ../quodlibet/cli.py:122 ../quodlibet/cli.py:132 ../quodlibet/cli.py:136 #: ../quodlibet/cli.py:138 msgid "query" msgstr "bilaketa" #: ../quodlibet/cli.py:123 msgid "Play a file" msgstr "Erreproduzitu fitxategi bat" #: ../quodlibet/cli.py:123 ../quodlibet/cli.py:132 ../quodlibet/cli.py:138 #, fuzzy msgctxt "command" msgid "filename" msgstr "fitxategi-izena" #: ../quodlibet/cli.py:124 msgid "Rate the playing song" msgstr "Baloratu erreproduzitutako abestia" #: ../quodlibet/cli.py:125 msgid "Set the current browser" msgstr "Ezarri nabigatzailea" #: ../quodlibet/cli.py:126 msgid "Open a new browser" msgstr "Ireki nabigatzaile berri bat" #: ../quodlibet/cli.py:127 msgid "Show or hide the queue" msgstr "Erakutsi edo ezkutatu ilara" #: ../quodlibet/cli.py:128 msgid "Show or hide the main song list" msgstr "Erakutsi edo ezkutatu kanten zerrenda nagusia" #: ../quodlibet/cli.py:129 msgid "Filter on a random value" msgstr "Iragazi ausazko balio batez" #: ../quodlibet/cli.py:129 #, fuzzy msgctxt "command" msgid "tag" msgstr "Etiketa" #: ../quodlibet/cli.py:130 msgid "Filter on a tag value" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/cli.py:130 msgid "tag=value" msgstr "etiketa=balioa" #: ../quodlibet/cli.py:131 msgid "Enqueue a file or query" msgstr "Ilaran ipini fitxategi bat edo bilatu" #: ../quodlibet/cli.py:133 msgid "Enqueue comma-separated files" msgstr "Ilaran ipini komaz bereiztutako fitxategiak" #: ../quodlibet/cli.py:134 ../quodlibet/util/tags.py:142 msgid "filename" msgstr "fitxategi-izena" #: ../quodlibet/cli.py:135 msgid "Print filenames of results of query to stdout" msgstr "Erakutsi bilaketaren emaitzen izenak" #: ../quodlibet/cli.py:137 msgid "Unqueue a file or query" msgstr "Ilaratik kendu fitxategi bat edo bilatu" #: ../quodlibet/cli.py:198 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumentu baliogabea '%s'-rentzat." #: ../quodlibet/cli.py:199 ../quodlibet/util/__init__.py:170 #, python-format msgid "Try %s --help." msgstr "Saiatu %s --help." #: ../quodlibet/devices/_base.py:63 msgid "Unknown Device" msgstr "Gailu ezezaguna" #: ../quodlibet/devices/__init__.py:26 #, 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:148 #, python-format msgid "%r is not a supported device." msgstr "%r ez da onartzen den gailu bat." #: ../quodlibet/devices/__init__.py:233 ../quodlibet/devices/__init__.py:239 #: ../quodlibet/devices/__init__.py:446 ../quodlibet/devices/__init__.py:452 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Ezin da media-player-info aurkitu." #: ../quodlibet/devices/__init__.py:599 msgid "Initializing device backend." msgstr "Gailu azpiegitura abiarazten." #: ../quodlibet/devices/__init__.py:600 #, python-format msgid "Trying '%s'" msgstr "'%s' saiatzen" #: ../quodlibet/devices/__init__.py:617 msgid "Couldn't connect to a device backend." msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/devices/__init__.py:619 msgid "Device backend initialized." msgstr "Gailu azpiegitura abiarazia." #: ../quodlibet/devices/ipod.py:32 msgid "Uninitialized iPod" msgstr "Hasieratu-gabeko iPoda" #: ../quodlibet/devices/ipod.py:34 msgid "Do you want to create an empty database on this iPod?" msgstr "Data-base huts bat sortu nahi al duzu iPod honentzat?" #: ../quodlibet/devices/ipod.py:40 msgid "_Create Database" msgstr "" #: ../quodlibet/devices/ipod.py:135 msgid "_Volume Gain (dB):" msgstr "_Bolumen irabazia (dB):" #: ../quodlibet/devices/ipod.py:138 ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopiatu _album karatulak" #: ../quodlibet/devices/ipod.py:139 msgid "Combine tags with _multiple values" msgstr "Nahasi etiketak balio a_nitzekin" #. Column preferences #: ../quodlibet/devices/ipod.py:140 ../quodlibet/qltk/prefs.py:110 msgid "Title includes _version" msgstr "Izenburuak bertsioa barneratzen du" #: ../quodlibet/devices/ipod.py:141 ../quodlibet/qltk/prefs.py:114 msgid "Album includes _disc subtitle" msgstr "Albumak _disko azpititulua barneratzen du" #: ../quodlibet/devices/ipod.py:152 msgid "Model:" msgstr "Modeloa:" #: ../quodlibet/devices/ipod.py:154 msgid "Capacity:" msgstr "Kapazitatea:" #: ../quodlibet/devices/ipod.py:156 msgid "Firmware:" msgstr "Firmwarea:" #: ../quodlibet/devices/ipod.py:205 msgid "Removing orphaned iPod track" msgstr "iPod pista umezurtzak kentzen" #: ../quodlibet/devices/ipod.py:310 #, fuzzy msgid "Saving iPod database…" msgstr "Ezin da iPod datu-basea gorde" #: ../quodlibet/devices/ipod.py:313 msgid "Unable to save iPod database" msgstr "Ezin da iPod datu-basea gorde" #: ../quodlibet/devices/ipod.py:455 #, fuzzy msgid "Could not find libgpod, iPod support disabled." msgstr "Ezin da python-gpod inporatu, iPod euskarria desgaitua." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Fixategi-izen patroia:" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Kendu erabili gabeko karatula eta direktorioak" #: ../quodlibet/ext/covers/lastfm.py:24 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:25 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:18 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz pista IDa" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 #, fuzzy msgid "Convert Encodings" msgstr "[Kodeketa baliogabea]" #: ../quodlibet/ext/editing/iconv.py:34 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:39 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:18 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:19 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:27 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:55 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:13 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:14 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:19 #, fuzzy msgid "Title Case" msgstr "Titulua" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio etiketa editorea" #: ../quodlibet/ext/editing/titlecase.py:39 #, fuzzy msgid "Title-_case Value" msgstr "_Titulu-gisako etiketak" #: ../quodlibet/ext/editing/titlecase.py:50 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 #, fuzzy msgid "_Human title case" msgstr "Gaitu _gizakizko izenburu larritasuna" #: ../quodlibet/ext/editing/titlecase.py:52 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:64 #, fuzzy msgid "Advanced Preferences" msgstr "Paneldun nabigatzaile hobespenak" #: ../quodlibet/ext/events/advanced_preferences.py:65 msgid "Allow to tweak advanced config settings." msgstr "" #: ../quodlibet/ext/events/animosd/main.py:24 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:25 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:152 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:157 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:170 #, fuzzy msgid "_Cover size:" msgstr "Tamaina guztira:" #: ../quodlibet/ext/events/animosd/prefs.py:176 #, fuzzy msgid "Display" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/events/animosd/prefs.py:188 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:193 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:194 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 #, fuzzy msgid "Right" msgstr "_Tamaina" #: ../quodlibet/ext/events/animosd/prefs.py:198 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:204 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:214 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:224 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:229 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:237 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:238 #, fuzzy msgid "_Outline" msgstr "_Irteera kanalizazioa:" #: ../quodlibet/ext/events/animosd/prefs.py:239 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:255 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:261 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:267 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/events/animosd/prefs.py:271 #, fuzzy msgid "Preview" msgstr "_Aurreikusi" #: ../quodlibet/ext/events/auto_library_update.py:123 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:124 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:23 #, fuzzy msgid "Automatic Masking" msgstr "Automati_koa" #: ../quodlibet/ext/events/automask.py:24 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:13 #, fuzzy msgid "Automatic Rating" msgstr "Automati_koa" #: ../quodlibet/ext/events/autorating.py:14 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:22 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:23 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:117 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:118 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:22 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:23 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:25 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:28 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:30 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:38 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:44 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:46 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:49 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:51 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:54 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:60 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:92 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:93 msgid "Controls the tone of your music with an equalizer." msgstr "" #: ../quodlibet/ext/events/equalizer.py:125 #, 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:131 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #: ../quodlibet/ext/gstreamer/crossfeed.py:97 #: ../quodlibet/ext/gstreamer/karaoke.py:94 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:163 #: ../quodlibet/ext/gstreamer/crossfeed.py:116 #, fuzzy, python-format msgid "%.1f dB" msgstr "segundo %d" #: ../quodlibet/ext/events/equalizer.py:182 #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom" msgstr "_Personalizatu" #: ../quodlibet/ext/events/equalizer.py:189 #, fuzzy msgid "_Clear" msgstr "_Garbitu errorea" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:144 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:153 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:177 msgid "" "Statuses for which status message\n" "will be changed" msgstr "" #: ../quodlibet/ext/events/inhibit.py:40 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:50 #, fuzzy msgid "Music is playing" msgstr "Musika erreproduzigailua" #: ../quodlibet/ext/events/iradiolog.py:15 #, fuzzy msgid "Internet Radio Log" msgstr "Internet irratia" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:28 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:36 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:37 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:63 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:64 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:145 #, fuzzy msgid "Connection" msgstr "kokapena" #: ../quodlibet/ext/events/mpdserver/__init__.py:147 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris.py:44 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris.py:45 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris.py:51 ../quodlibet/ext/events/trayicon.py:42 #, fuzzy msgid "Hide main window on close" msgstr "Ezkutatu leiho nagusia" #: ../quodlibet/ext/events/mpris.py:54 #: ../quodlibet/ext/events/themeswitcher.py:114 #: ../quodlibet/ext/gstreamer/compressor.py:98 #: ../quodlibet/ext/gstreamer/crossfeed.py:140 #: ../quodlibet/ext/gstreamer/karaoke.py:98 #: ../quodlibet/ext/gstreamer/pitch.py:89 ../quodlibet/qltk/prefs.py:657 #, fuzzy msgid "Preferences" msgstr "Hobespenak" #: ../quodlibet/ext/events/notify.py:78 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:86 #, fuzzy msgid "_Title:" msgstr "Titulua" #: ../quodlibet/ext/events/notify.py:97 ../quodlibet/ext/events/notify.py:126 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:116 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:136 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:154 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:160 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:168 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:176 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:194 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:226 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:227 ../quodlibet/ext/events/notify.py:382 #: ../quodlibet/ext/events/notify.py:424 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/ext/events/notify.py:241 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:242 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:406 ../quodlibet/qltk/unity.py:64 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:461 #, fuzzy msgid "_Service:" msgstr "Gailua:" #: ../quodlibet/ext/events/qlscrobbler.py:461 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:461 #, fuzzy msgid "User_name:" msgstr "Ize_na:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:478 #, fuzzy msgid "Other…" msgstr "_Besteak:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:516 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:521 #: ../quodlibet/ext/songsmenu/lastfmsync.py:288 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:528 #, fuzzy msgid "_Title pattern:" msgstr "_Fixategi-izen patroia:" #: ../quodlibet/ext/events/qlscrobbler.py:529 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:547 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:557 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:566 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:574 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:578 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:17 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:18 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:25 #, fuzzy msgid "Random Album Playback" msgstr "Ausazko Al_buma" #: ../quodlibet/ext/events/randomalbum.py:26 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:35 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:36 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:37 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 #, fuzzy msgid "Longer albums" msgstr "album" #: ../quodlibet/ext/events/randomalbum.py:80 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:84 #, fuzzy msgid "Weights" msgstr "_Tamaina" #: ../quodlibet/ext/events/randomalbum.py:86 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:100 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:111 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:198 #, fuzzy msgid "Random Album" msgstr "Ausazko Al_buma" #: ../quodlibet/ext/events/randomalbum.py:199 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:115 #, fuzzy msgid "Import Failed" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/ext/events/rbimport.py:120 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:129 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:24 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:71 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:77 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:78 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:27 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:56 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:82 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:61 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 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:68 msgid "paused" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:121 #, fuzzy msgid "Playing:" msgstr "Ez da erreproduzitzen" #: ../quodlibet/ext/events/telepathy_status.py:122 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:138 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:155 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "No song:" msgstr "kanta %d" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:163 #, fuzzy msgid "Status Patterns" msgstr "Bide patroiak" #: ../quodlibet/ext/events/themeswitcher.py:43 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:44 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:68 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:73 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:85 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:95 msgid "Use header bars" msgstr "" #: ../quodlibet/ext/events/trayicon.py:48 msgid "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon.py:50 msgid "" "Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon.py:56 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon.py:83 #, fuzzy msgid "Tooltip Display" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/events/trayicon.py:129 #: ../quodlibet/ext/events/trayicon.py:439 ../quodlibet/qltk/info.py:45 msgid "Not playing" msgstr "Ez da erreproduzitzen" #: ../quodlibet/ext/events/trayicon.py:224 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon.py:225 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon.py:459 #: ../quodlibet/qltk/quodlibetwindow.py:866 #: ../quodlibet/qltk/quodlibetwindow.py:1045 #, fuzzy msgid "_Play" msgstr "_Erreprodukzio-zerrendak" #: ../quodlibet/ext/events/trayicon.py:461 #: ../quodlibet/qltk/quodlibetwindow.py:1047 ../quodlibet/qltk/wlw.py:48 #, fuzzy msgid "P_ause" msgstr "Erreproduzigailua" #: ../quodlibet/ext/events/trayicon.py:464 #: ../quodlibet/qltk/quodlibetwindow.py:861 #, fuzzy msgid "Pre_vious" msgstr "_Aurreikusi" #: ../quodlibet/ext/events/trayicon.py:467 #: ../quodlibet/qltk/quodlibetwindow.py:871 #, fuzzy msgid "_Next" msgstr "Hurrengoa" #: ../quodlibet/ext/events/trayicon.py:470 #, fuzzy msgid "Play _Order" msgstr "_Ordena:" #: ../quodlibet/ext/events/trayicon.py:472 msgid "_Repeat" msgstr "E_rrepikatu" #: ../quodlibet/ext/events/trayicon.py:481 #, fuzzy msgid "Stop _after this song" msgstr "Gelditu kanta honen ondoren" #: ../quodlibet/ext/events/trayicon.py:514 msgid "_Browse Library" msgstr "_Arakatu liburutegia" #: ../quodlibet/ext/events/trayicon.py:527 #: ../quodlibet/qltk/quodlibetwindow.py:840 ../quodlibet/qltk/songsmenu.py:392 msgid "Edit _Tags" msgstr "Editatu etiketak" #: ../quodlibet/ext/events/trayicon.py:530 #: ../quodlibet/qltk/quodlibetwindow.py:845 ../quodlibet/qltk/songsmenu.py:405 #, fuzzy msgid "_Information" msgstr "Informazioa" #: ../quodlibet/ext/events/trayicon.py:549 ../quodlibet/qltk/debugwindow.py:160 #: ../quodlibet/qltk/quodlibetwindow.py:832 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:34 #, fuzzy msgid "View Lyrics" msgstr "Hitzak" #: ../quodlibet/ext/events/viewlyrics.py:35 msgid "Displays lyrics beneath the song list." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:38 #, fuzzy msgid "_Lyrics" msgstr "Hitzak" #: ../quodlibet/ext/events/write_cover.py:31 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 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/events/zeitgeist_client.py:36 msgid "Event Logging" msgstr "" #: ../quodlibet/ext/events/zeitgeist_client.py:37 msgid "Sends song events to the Zeitgeist event logging service." msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:19 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:73 #: ../quodlibet/ext/gstreamer/karaoke.py:90 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:104 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "_Preset:" msgstr "_Aurreikusi" #: ../quodlibet/ext/gstreamer/crossfeed.py:24 #, fuzzy msgid "Filter preset" msgstr "Iragazi _artistaz" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 #, fuzzy msgid "Default" msgstr "Berezkoa" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:32 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:33 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:34 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:35 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:36 #, fuzzy msgid "Custom settings" msgstr "_Personalizatu" #: ../quodlibet/ext/gstreamer/crossfeed.py:156 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:157 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:19 #, fuzzy msgid "Filter _band:" msgstr "Iragazi _generoz" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 #, fuzzy msgid "Filter _width:" msgstr "Iragazi _artistaz" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:104 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:15 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:26 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:27 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:28 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:95 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio jarioak" #: ../quodlibet/ext/gstreamer/pitch.py:96 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Idatzi audio jarioaren kokapena:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:22 msgid "Export to Squeezebox…" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with Squeezebox Sync " "plugin." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:70 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:71 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:88 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:14 #, fuzzy msgid "Shuffle Playlist" msgstr "Sortu erreprodukzio-zerrenda" #: ../quodlibet/ext/playlist/shuffle.py:15 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." msgstr "" #: ../quodlibet/ext/playorder/queue.py:16 #, fuzzy msgid "Queue Only" msgstr "Ilaran" #: ../quodlibet/ext/playorder/queue.py:18 msgid "" "Limits playing of songs to the queue. Double-click on any song to enqueue it." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:8 #, fuzzy msgid "Reverse" msgstr "Inoiz" #: ../quodlibet/ext/playorder/reverse.py:10 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:26 #, fuzzy msgid "Track Repeat" msgstr "Pistaren erpina" #: ../quodlibet/ext/playorder/track_repeat.py:28 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:43 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:76 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:85 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/ext/_shared/squeezebox/base.py:109 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:115 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:120 #, fuzzy msgid "Username:" msgstr "Be_rrizendatu" #: ../quodlibet/ext/_shared/squeezebox/base.py:125 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:129 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:131 #, fuzzy msgid "Library path:" msgstr "Liburutegia" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:140 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:146 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:149 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:24 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:35 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:13 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:18 #: ../quodlibet/ext/songsmenu/html.py:74 #: ../quodlibet/ext/songsmenu/importexport.py:29 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:24 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:227 #, fuzzy msgid "Fit image to _window" msgstr "Ezkutatu leiho nagusia" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:236 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:241 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:243 #, fuzzy msgid "File_name:" msgstr "Fitxategi-izena" #: ../quodlibet/ext/songsmenu/albumart.py:355 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:356 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Ezin da abestia gorde" #: ../quodlibet/ext/songsmenu/albumart.py:454 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:511 #, fuzzy msgid "Album Art Downloader" msgstr "Album zerrenda" #: ../quodlibet/ext/songsmenu/albumart.py:564 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:567 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:570 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamaina" #: ../quodlibet/ext/songsmenu/albumart.py:588 #, fuzzy msgid "_Search" msgstr "_Bilaketa:" #: ../quodlibet/ext/songsmenu/albumart.py:644 #: ../quodlibet/ext/songsmenu/brainz.py:351 #, fuzzy msgid "Searching…" msgstr "Bilatu" #: ../quodlibet/ext/songsmenu/albumart.py:706 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:820 #, fuzzy msgid "Download Album Art" msgstr "Album zerrenda" #: ../quodlibet/ext/songsmenu/albumart.py:821 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:830 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:16 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:17 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:20 #, fuzzy msgid "Go to Bookmark…" msgstr "_Editatu laster-markak..." #: ../quodlibet/ext/songsmenu/bookmarks.py:21 msgid "Lists all bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:57 ../quodlibet/qltk/controls.py:105 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editatu laster-markak..." #: ../quodlibet/ext/songsmenu/bookmarks.py:67 #, fuzzy msgid "No Bookmarks" msgstr "Laster-markak" #: ../quodlibet/ext/songsmenu/brainz.py:117 ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Fitxategi-izena" #: ../quodlibet/ext/songsmenu/brainz.py:118 #: ../quodlibet/ext/songsmenu/replaygain.py:394 #: ../quodlibet/qltk/tracknumbers.py:85 msgid "Track" msgstr "Pista" #: ../quodlibet/ext/songsmenu/brainz.py:119 #, fuzzy msgid "Title" msgstr "Titulua" #: ../quodlibet/ext/songsmenu/brainz.py:120 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz.py:190 msgid "_Release:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:213 #, python-format msgid "%d _release:" msgid_plural "%d _releases:" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/brainz.py:348 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:361 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:367 #: ../quodlibet/ext/songsmenu/brainz.py:381 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:370 #, fuzzy msgid "No results found." msgstr "Ez da pluginik aurkitu." #: ../quodlibet/ext/songsmenu/brainz.py:390 #, fuzzy, python-format msgid "Found %d result." msgid_plural "Found %d results." msgstr[0] "eta %d gehiago..." msgstr[1] "eta %d gehiago..." #: ../quodlibet/ext/songsmenu/brainz.py:411 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album mota" #: ../quodlibet/ext/songsmenu/brainz.py:439 #, fuzzy msgid "_Query:" msgstr "bilaketa" #: ../quodlibet/ext/songsmenu/brainz.py:442 #, fuzzy msgid "S_earch" msgstr "Bilatu" #: ../quodlibet/ext/songsmenu/brainz.py:455 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:483 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album mota" #: ../quodlibet/ext/songsmenu/brainz.py:485 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:510 #, fuzzy msgid "Split _disc from album" msgstr "Atera diskoa _albumetik" #: ../quodlibet/ext/songsmenu/brainz.py:511 msgid "Split _featured performers from track" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:512 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:513 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:514 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:515 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz.py:517 msgid "Write _labelid tag (fixes multi-disc albums)" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:171 #, fuzzy msgid "Browse Folders" msgstr "Nabigatzaileak" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:184 #, fuzzy msgid "Unable to open folders" msgstr "Ezinda karpeta sortu" #: ../quodlibet/ext/songsmenu/browsefolders.py:185 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:144 ../quodlibet/qltk/information.py:441 msgid "Track List" msgstr "Pista zerrenda" #: ../quodlibet/ext/songsmenu/cddb.py:156 msgid "CDDB Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:157 msgid "Looks up album information in FreeDB. Requires CDDB.py." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:166 #, fuzzy msgid "Timeout" msgstr "Denbora" #: ../quodlibet/ext/songsmenu/cddb.py:167 msgid "Query could not be executed, connection timed out" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:172 #, fuzzy msgid "Select an album" msgstr "Hautatu _denak" #: ../quodlibet/ext/songsmenu/cddb.py:226 msgid "Select the album you wish to retrieve." msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:261 #, python-format msgid "CDDB lookup failed (%s)" msgstr "" #: ../quodlibet/ext/songsmenu/cddb.py:262 #, fuzzy, 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/ext/songsmenu/console.py:43 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:44 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:80 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:36 #, fuzzy msgid "Command" msgstr "komandoa|etiketa" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 #, fuzzy msgid "name" msgstr "Be_rrizendatu" #: ../quodlibet/ext/songsmenu/custom_commands.py:39 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "command" msgstr "komandoa|etiketa" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:43 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, 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:50 #, fuzzy msgid "pattern" msgstr "Patroi baliogabea" #: ../quodlibet/ext/songsmenu/custom_commands.py:51 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:54 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:58 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:59 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:82 #, fuzzy msgid "Input value" msgstr "Okerreko balioa" #: ../quodlibet/ext/songsmenu/custom_commands.py:83 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:113 #, fuzzy msgid "Custom Commands" msgstr "_Personalizatu" #: ../quodlibet/ext/songsmenu/custom_commands.py:114 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:160 #: ../quodlibet/ext/songsmenu/custom_commands.py:168 #: ../quodlibet/ext/songsmenu/custom_commands.py:217 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:169 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:235 #, 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:344 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:348 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:364 #, fuzzy msgid "Duplicates Browser" msgstr "Desgaitu nabigatzailea" #: ../quodlibet/ext/songsmenu/duplicates.py:365 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:404 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:406 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 #, fuzzy msgid "Duplicate Key" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:416 #, fuzzy msgid "Remove _Whitespace" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:417 #, fuzzy msgid "Remove _Diacritics" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Remove _Punctuation" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:419 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:427 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:16 #: ../quodlibet/ext/songsmenu/editplaycount.py:36 #, fuzzy msgid "Edit Playcount" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/songsmenu/editplaycount.py:17 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:63 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:64 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:20 #, fuzzy msgid "Edit Embedded Images" msgstr "Atera irudi txertatuak" #: ../quodlibet/ext/songsmenu/embedded.py:21 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Atera irudi txertatuak" #: ../quodlibet/ext/songsmenu/embedded.py:65 #, fuzzy msgid "_Remove all images" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/embedded.py:69 msgid "_Embed current image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:20 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:21 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:29 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:79 #, fuzzy msgid "Filter on Any Tag" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:17 #, fuzzy msgid "Filter on Directory" msgstr "Iragazi _generoz" #: ../quodlibet/ext/songsmenu/filterbrowser.py:18 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:27 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:28 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:46 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:38 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:47 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:53 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:54 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:68 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:34 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Ilaran" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 #, fuzzy msgid "Error" msgstr "Erroreak" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:114 #: ../quodlibet/qltk/edittags.py:417 msgid "Write" msgstr "Idatzi" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:142 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:156 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:288 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz pista IDa" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:294 #, fuzzy msgid "Group by directory" msgstr "direktorioa" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:303 #, fuzzy msgid "Album Mode" msgstr "_Album goiburuak" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:46 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:60 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:82 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:112 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:115 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:117 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:119 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:121 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:159 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:175 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:183 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:14 #, fuzzy msgid "Force Write" msgstr "Idatzi" #: ../quodlibet/ext/songsmenu/forcewrite.py:15 msgid "" "Saves the files again. This will make sure play counts and ratings are up to " "date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:63 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:64 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:16 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:17 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:16 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:17 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:46 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:47 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:84 #, fuzzy msgid "Import Metadata" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/ext/songsmenu/importexport.py:85 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:20 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:21 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:87 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:98 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:105 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:127 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:133 #, fuzzy msgid "Error during sync" msgstr "Errorea %r kargatzean" #: ../quodlibet/ext/songsmenu/lastfmsync.py:198 #: ../quodlibet/ext/songsmenu/lastfmsync.py:228 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:229 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:277 #, fuzzy msgid "_Username:" msgstr "Be_rrizendatu" #: ../quodlibet/ext/songsmenu/lyricwiki.py:168 #, fuzzy msgid "No active song" msgstr "Ezin da abestia gorde" #: ../quodlibet/ext/songsmenu/lyricwiki.py:196 #, fuzzy msgid "No lyrics found" msgstr "Ez da pluginik aurkitu." #: ../quodlibet/ext/songsmenu/lyricwiki.py:204 #, fuzzy msgid "Lyrics:" msgstr "Hitzak" #: ../quodlibet/ext/songsmenu/lyricwiki.py:209 #, fuzzy msgid "Lyrics Window" msgstr "Hitzak" #: ../quodlibet/ext/songsmenu/lyricwiki.py:210 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:33 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:34 msgid "Converts album and artist names to sort names, poorly." msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:35 msgid "Send To…" msgstr "" #: ../quodlibet/ext/songsmenu/openwith.py:36 msgid "Generic file-opening plugin." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:52 #, fuzzy msgid "Playlist Export" msgstr "Erreprodukzio-zerrendak" #: ../quodlibet/ext/songsmenu/playlist.py:53 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:95 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:150 #, fuzzy msgid "Unable to export playlist" msgstr "Ezin da erreprodukzio-zerrenda inportatu" #: ../quodlibet/ext/songsmenu/playlist.py:151 #, 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:19 #, fuzzy msgid "Refresh Songs" msgstr "_Freskatu liburutegia" #: ../quodlibet/ext/songsmenu/refresh.py:20 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:27 #: ../quodlibet/qltk/exfalsowindow.py:213 ../quodlibet/qltk/information.py:526 #: ../quodlibet/qltk/maskedbox.py:67 ../quodlibet/util/collection.py:544 #: ../quodlibet/util/collection.py:571 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "kanta %d" msgstr[1] "%d kanta" #: ../quodlibet/ext/songsmenu/refresh.py:28 #, fuzzy msgid "Refresh songs" msgstr "_Freskatu liburutegia" #: ../quodlibet/ext/songsmenu/replaygain.py:352 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:408 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:423 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:438 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:453 #, python-format msgid "There is <b>%(to-process)d</b> album to update (of %(all)d)" msgid_plural "There are <b>%(to-process)d</b> albums to update (of %(all)d)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:568 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:569 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:604 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:605 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:607 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:624 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:636 #, fuzzy msgid "Existing Tags" msgstr "Editatu etiketak" #: ../quodlibet/ext/songsmenu/splitting.py:15 #, fuzzy msgid "Split Tags" msgstr "Editatu etiketak" #: ../quodlibet/ext/songsmenu/splitting.py:16 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:40 #, fuzzy msgid "Split Album" msgstr "Album guztiak" #: ../quodlibet/ext/songsmenu/splitting.py:41 msgid "Split out disc number." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:34 #, fuzzy msgid "Website Search" msgstr "Bilatu" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, 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:79 #, fuzzy msgid "Search URL patterns" msgstr "Bide patroiak" #: ../quodlibet/ext/songsmenu/website_search.py:89 #, fuzzy msgid "Edit search URLs" msgstr "Editatu gordetako balioak..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:115 #, 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 "" #: ../quodlibet/library/libraries.py:657 ../quodlibet/library/libraries.py:667 #: ../quodlibet/library/libraries.py:723 ../quodlibet/qltk/information.py:250 #: ../quodlibet/qltk/prefs.py:608 ../quodlibet/util/library.py:77 msgid "Library" msgstr "Liburutegia" #: ../quodlibet/library/libraries.py:657 msgid "Checking mount points" msgstr "Muntatze puntuak arakatzen" #: ../quodlibet/library/libraries.py:667 msgid "Scanning library" msgstr "Liburutegia arakatzen" #: ../quodlibet/library/libraries.py:722 #, python-format msgid "Scanning %s" msgstr "%s arakatzen" #: ../quodlibet/operon/base.py:68 #, python-format msgid "Failed to load file: %r" msgstr "%r fitxategia kargatzeak huts egin du" #: ../quodlibet/operon/commands.py:33 msgid "List tags" msgstr "Erakutsi etiketak" #: ../quodlibet/operon/commands.py:38 ../quodlibet/operon/commands.py:77 #: ../quodlibet/operon/commands.py:451 msgid "Print terse output" msgstr "Erakutsi debugarako informazioa" #: ../quodlibet/operon/commands.py:40 ../quodlibet/operon/commands.py:79 #: ../quodlibet/operon/commands.py:453 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Zutabeak eta ordena Debugarako moduan (%s)" #: ../quodlibet/operon/commands.py:43 #, fuzzy msgid "Also list programmatic tags" msgstr "Ikusi etiketa _programatikoak" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:119 #: ../quodlibet/operon/commands.py:210 ../quodlibet/operon/commands.py:283 #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:330 #: ../quodlibet/operon/commands.py:381 ../quodlibet/operon/commands.py:384 #: ../quodlibet/operon/commands.py:423 ../quodlibet/operon/commands.py:458 #: ../quodlibet/operon/commands.py:498 ../quodlibet/operon/commands.py:530 #: ../quodlibet/operon/commands.py:569 msgid "Not enough arguments" msgstr "Argumentu nahikorik ez" #: ../quodlibet/operon/commands.py:49 ../quodlibet/operon/commands.py:84 #: ../quodlibet/operon/commands.py:121 ../quodlibet/operon/commands.py:212 #: ../quodlibet/operon/commands.py:460 #, fuzzy msgid "Too many arguments" msgstr "Errore gehiegi" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:86 #: ../quodlibet/operon/commands.py:465 ../quodlibet/qltk/data_editors.py:357 #, fuzzy msgid "Description" msgstr "azalpena" #: ../quodlibet/operon/commands.py:52 ../quodlibet/operon/commands.py:465 #: ../quodlibet/qltk/edittags.py:455 msgid "Value" msgstr "Balioa" #: ../quodlibet/operon/commands.py:72 msgid "List all common tags" msgstr "Erakutsi ohiko etiketak" #: ../quodlibet/operon/commands.py:108 msgid "Copy tags from one file to another" msgstr "Kopiatu etiketak fitxategi batetik beste batera" #: ../quodlibet/operon/commands.py:113 ../quodlibet/operon/commands.py:154 #: ../quodlibet/operon/commands.py:279 ../quodlibet/operon/commands.py:314 #: ../quodlibet/operon/commands.py:374 msgid "Show changes, don't apply them" msgstr "Erakutsi aldaketak, ez ezarri" #: ../quodlibet/operon/commands.py:115 msgid "Skip tags that can't be written" msgstr "Jauzi egin idatzi ezin daitezkeen etiketak" #: ../quodlibet/operon/commands.py:135 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Ezin da %r %r fitxategira kopiatu" #: ../quodlibet/operon/commands.py:147 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio etiketa editorea" #: ../quodlibet/operon/commands.py:241 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:245 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:250 #, fuzzy msgid "No changes detected" msgstr "Ez da abestirik hautatu." #: ../quodlibet/operon/commands.py:274 msgid "Set a tag and remove existing values" msgstr "Jarri etiketa bat eta ezabatu aurreko baloreak" #: ../quodlibet/operon/commands.py:294 ../quodlibet/operon/commands.py:434 #: ../quodlibet/operon/commands.py:660 #, python-format msgid "Can not set %r" msgstr "Ezin da %r jarri" #: ../quodlibet/operon/commands.py:309 #, fuzzy msgid "Remove tags" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/operon/commands.py:316 ../quodlibet/operon/commands.py:376 msgid "Value is a regular expression" msgstr "Balorea expresio erregularra da (RE)" #: ../quodlibet/operon/commands.py:318 #, fuzzy msgid "Remove all tags" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/operon/commands.py:322 msgid "Can't combine '--all' with '--regexp'" msgstr "Ezin da '--all' eta '--regexp' aldi berean erabili" #: ../quodlibet/operon/commands.py:356 #, python-format msgid "Can't remove %r from %r" msgstr "Ezin da %r %r -tik ezabatu" #: ../quodlibet/operon/commands.py:369 #, fuzzy msgid "Remove a tag value" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/operon/commands.py:418 #, fuzzy msgid "Add a tag value" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/operon/commands.py:446 #, fuzzy msgid "List file information" msgstr "Ez dago denbora informaziorik" #: ../quodlibet/operon/commands.py:492 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:505 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "%r fitxategia kargatzeak huts egin du" #: ../quodlibet/operon/commands.py:512 ../quodlibet/operon/commands.py:538 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:525 #, fuzzy msgid "Remove all embedded images" msgstr "Atera irudi txertatuak" #: ../quodlibet/operon/commands.py:552 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Atera irudi txertatuak" #: ../quodlibet/operon/commands.py:564 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:623 msgid "Rename files based on tags" msgstr "Izenaz aldatu etiketeen arabera" #: ../quodlibet/operon/commands.py:638 msgid "Fill tags based on the file path" msgstr "Bete etiketak fitxategiaren helbidearen arabera" #: ../quodlibet/operon/commands.py:688 ../quodlibet/qltk/information.py:291 #: ../quodlibet/qltk/properties.py:81 ../quodlibet/qltk/renamefiles.py:175 #: ../quodlibet/qltk/tagsfrompath.py:226 ../quodlibet/qltk/tracknumbers.py:73 msgid "File" msgstr "Fitxategia" #: ../quodlibet/operon/commands.py:696 msgid "Fill tracknumbers for all files" msgstr "Bete pista zenbakiak fitxategi guztietan" #: ../quodlibet/operon/commands.py:715 msgid "Print tags based on the given pattern" msgstr "Erakutsi emandako patroiarekin bat datozen etiketak" #: ../quodlibet/operon/commands.py:752 #, 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/player/gstbe/player.py:92 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:92 msgid "Buffering" msgstr "Buffering" #: ../quodlibet/player/gstbe/player.py:313 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Ezin da berezko GStreamer pipeline-a sortu." #: ../quodlibet/player/gstbe/player.py:553 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:554 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:34 #, 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:73 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Ez da katerik aurkitu" #: ../quodlibet/player/gstbe/util.py:92 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "GStreamer irteera kanalizazio baliogabea, lehenetsia saiatzen." #: ../quodlibet/player/xinebe/player.py:69 msgid "Unable to create audio output" msgstr "Ezin da audio irteera sortu" #: ../quodlibet/player/xinebe/player.py:70 #, 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:60 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:69 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Ezin da GStreamer pipeline-a lotu: '%s'" #: ../quodlibet/plugins/playlist.py:27 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:38 ../quodlibet/qltk/songsmenu.py:42 #: ../quodlibet/qltk/songsmenu.py:70 #, fuzzy msgid "_Run Plugin" msgstr "_Pluginak" #: ../quodlibet.py:150 msgid "Audio Backend Failed to Load" msgstr "" #: ../quodlibet.py:151 #, python-format msgid "" "Loading the audio backend '%(name)s' failed. Audio playback will be disabled." msgstr "" #: ../quodlibet/qltk/about.py:56 #, python-format msgid "Supported formats: %s" msgstr "Onartutako formatuak: %s" #: ../quodlibet/qltk/about.py:59 #, python-format msgid "Audio device: %s" msgstr "Audio gailua: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:25 msgid "Beginning" msgstr "Hasten" #: ../quodlibet/qltk/bookmarks.py:36 ../quodlibet/qltk/bookmarks.py:74 msgid "N/A" msgstr "E/G" #: ../quodlibet/qltk/bookmarks.py:79 msgid "Time" msgstr "Denbora" #: ../quodlibet/qltk/bookmarks.py:85 ../quodlibet/qltk/bookmarks.py:120 #: ../quodlibet/qltk/quodlibetwindow.py:691 msgid "Bookmark Name" msgstr "Laster-marka izena" #: ../quodlibet/qltk/bookmarks.py:118 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:203 ../quodlibet/qltk/information.py:76 msgid "Bookmarks" msgstr "Laster-markak" #: ../quodlibet/qltk/browser.py:50 msgid "_Filters" msgstr "_Iragazkia" #: ../quodlibet/qltk/browser.py:51 #, fuzzy msgid "Recently _Played" msgstr "_Inoiz ez erreproduzituak" #: ../quodlibet/qltk/browser.py:53 msgid "Recently _Added" msgstr "Duela gutxi _gehituak" #: ../quodlibet/qltk/browser.py:55 msgid "_Top 40" msgstr "40 gehien e_rabiliak" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "All _Songs" msgstr "Kate berria" #: ../quodlibet/qltk/browser.py:65 msgid "Filter on _Genre" msgstr "Iragazi _generoz" #: ../quodlibet/qltk/browser.py:66 msgid "Filter on _Artist" msgstr "Iragazi _artistaz" #: ../quodlibet/qltk/browser.py:67 msgid "Filter on Al_bum" msgstr "Iragazi al_bumez" #: ../quodlibet/qltk/browser.py:75 msgid "Random _Genre" msgstr "Ausazko _generoa" #: ../quodlibet/qltk/browser.py:76 msgid "Random _Artist" msgstr "Ausazko _artista" #: ../quodlibet/qltk/browser.py:77 msgid "Random Al_bum" msgstr "Ausazko Al_buma" #: ../quodlibet/qltk/browser.py:89 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/browser.py:275 ../quodlibet/qltk/notif.py:294 #: ../quodlibet/util/__init__.py:376 msgid "No time information" msgstr "Ez dago denbora informaziorik" #: ../quodlibet/qltk/cbes.py:47 ../quodlibet/qltk/edittags.py:312 msgid "_Value:" msgstr "_Balioa:" #: ../quodlibet/qltk/cbes.py:251 msgid "Saved Values" msgstr "Gordetako balioak" #: ../quodlibet/qltk/cbes.py:252 #, fuzzy msgid "Edit saved values…" msgstr "Editatu gordetako balioak..." #: ../quodlibet/qltk/chooser.py:23 msgid "_Open" msgstr "" #: ../quodlibet/qltk/chooser.py:49 ../quodlibet/qltk/filesel.py:487 msgid "Songs" msgstr "Abestiak" #: ../quodlibet/qltk/controls.py:99 msgid "Display remaining time" msgstr "Bistarazi faltako denbora" #: ../quodlibet/qltk/controls.py:321 msgid "Auto_matic" msgstr "Automati_koa" #: ../quodlibet/qltk/controls.py:322 #, fuzzy msgid "_Track Mode" msgstr "Pis_ta goiburuak" #: ../quodlibet/qltk/controls.py:323 #, fuzzy msgid "_Album Mode" msgstr "_Album goiburuak" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:332 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:338 #, fuzzy msgid "_Replay Gain Mode" msgstr "Erreprodukzio bolumen irabazi doitzea" #: ../quodlibet/qltk/data_editors.py:116 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:212 #, fuzzy msgid "(unknown)" msgstr "Ezezaguna" #: ../quodlibet/qltk/data_editors.py:349 #, fuzzy msgid "Tag expression" msgstr "Balorea expresio erregularra da (RE)" #: ../quodlibet/qltk/data_editors.py:376 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:377 #, fuzzy msgid "Enter new tag" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/qltk/debugwindow.py:41 msgid "Error Details" msgstr "" #: ../quodlibet/qltk/debugwindow.py:123 msgid "Error Occurred" msgstr "Errore bat gertatu da" #: ../quodlibet/qltk/debugwindow.py:125 #, fuzzy, python-format 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.." #: ../quodlibet/qltk/debugwindow.py:141 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." #: ../quodlibet/qltk/delete.py:33 #, fuzzy msgid "Files:" msgstr "Fixategiak" #: ../quodlibet/qltk/delete.py:59 #, 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:68 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/delete.py:73 #, 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:90 #, fuzzy msgid "_Delete Files" msgstr "Ezabatu fitxategiak" #: ../quodlibet/qltk/delete.py:105 #, 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:114 #, 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:137 ../quodlibet/qltk/delete.py:144 msgid "_Move to Trash" msgstr "_Mugitu zakarrontzira" #: ../quodlibet/qltk/delete.py:155 ../quodlibet/qltk/delete.py:189 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Mugitzen: %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:175 ../quodlibet/qltk/delete.py:207 #, fuzzy msgid "Unable to move to trash" msgstr "Ezin da iPod datu-basea gorde" #: ../quodlibet/qltk/delete.py:176 ../quodlibet/qltk/delete.py:208 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> ebazteak huts egin du." #: ../quodlibet/qltk/delete.py:218 ../quodlibet/qltk/delete.py:252 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Ezabatzen: %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:238 ../quodlibet/qltk/delete.py:271 #, fuzzy msgid "Unable to delete files" msgstr "Ezin da fitxategia ezabatu" #: ../quodlibet/qltk/delete.py:239 ../quodlibet/qltk/delete.py:272 #, 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:262 #: ../quodlibet/qltk/wlw.py:47 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:58 ../quodlibet/qltk/edittags.py:69 #, 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:62 ../quodlibet/qltk/edittags.py:66 #, 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:188 msgid "Split into _Multiple Values" msgstr "Zatitu _hainbat baliotan" #: ../quodlibet/qltk/edittags.py:208 msgid "Split Disc out of _Album" msgstr "Atera diskoa _albumetik" #: ../quodlibet/qltk/edittags.py:225 msgid "Split _Version out of Title" msgstr "Atera _bertsioa izenburutik" #: ../quodlibet/qltk/edittags.py:260 msgid "Split Arranger out of Ar_tist" msgstr "Atera moldatzailea ar_tistatik" #: ../quodlibet/qltk/edittags.py:265 msgid "Split _Performer out of Artist" msgstr "Atera _interpretea atistatik" #: ../quodlibet/qltk/edittags.py:271 #, fuzzy msgid "Split _Performer out of Title" msgstr "Atera _interpretea atistatik" #: ../quodlibet/qltk/edittags.py:277 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Atera _bertsioa izenburutik" #: ../quodlibet/qltk/edittags.py:284 msgid "Add a Tag" msgstr "Gehitu etiketa bat" #: ../quodlibet/qltk/edittags.py:303 msgid "_Tag:" msgstr "E_tiketa:" #: ../quodlibet/qltk/edittags.py:409 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:657 msgid "Unable to add tag" msgstr "Ezin da etiketa gehitu" #: ../quodlibet/qltk/edittags.py:658 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Ezin da abestia gehitu" #: ../quodlibet/qltk/edittags.py:660 #, 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:857 #: ../quodlibet/qltk/tagsfrompath.py:209 ../quodlibet/util/__init__.py:480 #: ../quodlibet/util/tags.py:225 msgid "Invalid tag" msgstr "Okerreko etiketa" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:858 #: ../quodlibet/qltk/tagsfrompath.py:210 #, 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:830 ../quodlibet/qltk/edittags.py:871 msgid "Invalid value" msgstr "Okerreko balioa" #: ../quodlibet/qltk/edittags.py:831 ../quodlibet/qltk/edittags.py:872 #, 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:78 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:81 #: ../quodlibet/qltk/quodlibetwindow.py:827 ../quodlibet/qltk/songsmenu.py:296 msgid "_Plugins" msgstr "_Pluginak" #: ../quodlibet/qltk/exfalsowindow.py:250 msgid "Ex Falso Preferences" msgstr "Ex Falso hobespenak" #: ../quodlibet/qltk/exfalsowindow.py:260 ../quodlibet/qltk/prefs.py:567 msgid "Split _on:" msgstr "Zati_tu:" #: ../quodlibet/qltk/exfalsowindow.py:266 ../quodlibet/qltk/prefs.py:582 msgid "Tag Editing" msgstr "Etiketa editatzea" #: ../quodlibet/qltk/filesel.py:178 msgid "Folders" msgstr "Karpetak" #: ../quodlibet/qltk/filesel.py:221 #, fuzzy msgid "_New Folder…" msgstr "Sortu karpeta" #: ../quodlibet/qltk/filesel.py:230 msgid "_Select All Subfolders" msgstr "__Hautatu azpikarpeta guztiak" #: ../quodlibet/qltk/filesel.py:342 msgid "New Folder" msgstr "Sortu karpeta" #: ../quodlibet/qltk/filesel.py:342 msgid "Enter a name for the new folder:" msgstr "Idatzi izen bat karpeta berriarentzat:" #: ../quodlibet/qltk/filesel.py:355 msgid "Unable to create folder" msgstr "Ezinda karpeta sortu" #: ../quodlibet/qltk/filesel.py:372 msgid "Unable to delete folder" msgstr "Ezin da karpeta ezabatu" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:40 #, python-format msgid "by %s" msgstr "%s -ez" #: ../quodlibet/qltk/info.py:41 ../quodlibet/qltk/information.py:117 #: ../quodlibet/qltk/information.py:424 #, python-format msgid "Disc %s" msgstr "%s diskoa" #: ../quodlibet/qltk/info.py:42 ../quodlibet/qltk/information.py:122 #, python-format msgid "Track %s" msgstr "%s pista" #: ../quodlibet/qltk/info.py:106 #, fuzzy msgid "_Edit Display…" msgstr "Editatu bistaratzea" #: ../quodlibet/qltk/information.py:53 msgid "No songs are selected." msgstr "Ez da abestirik hautatu." #: ../quodlibet/qltk/information.py:54 msgid "No Songs" msgstr "Abestirik ez" #: ../quodlibet/qltk/information.py:68 ../quodlibet/qltk/information.py:298 #: ../quodlibet/qltk/information.py:448 ../quodlibet/qltk/information.py:514 msgid "Information" msgstr "Informazioa" #: ../quodlibet/qltk/information.py:72 msgid "Lyrics" msgstr "Hitzak" #: ../quodlibet/qltk/information.py:156 ../quodlibet/qltk/information.py:393 #: ../quodlibet/util/tags.py:73 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:158 ../quodlibet/qltk/information.py:395 #: ../quodlibet/qltk/information.py:546 ../quodlibet/util/tags.py:73 msgid "artists" msgstr "artistak" #. for backwards compat #: ../quodlibet/qltk/information.py:201 ../quodlibet/qltk/information.py:403 #: ../quodlibet/util/tags.py:82 ../quodlibet/util/tags.py:110 msgid "performers" msgstr "interpreteak" #: ../quodlibet/qltk/information.py:211 ../quodlibet/qltk/information.py:227 #: ../quodlibet/qltk/songlistcolumns.py:167 msgid "Never" msgstr "Inoiz" #: ../quodlibet/qltk/information.py:213 #, 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:235 ../quodlibet/util/tags.py:134 msgid "added" msgstr "gehiturik" #: ../quodlibet/qltk/information.py:236 ../quodlibet/util/tags.py:135 msgid "last played" msgstr "azken erreproduzitua" #: ../quodlibet/qltk/information.py:237 ../quodlibet/util/tags.py:145 msgid "plays" msgstr "erreproduzitzen" #: ../quodlibet/qltk/information.py:238 ../quodlibet/util/tags.py:146 msgid "skips" msgstr "salto" #: ../quodlibet/qltk/information.py:239 ../quodlibet/util/tags.py:151 msgid "rating" msgstr "balorazioa" #: ../quodlibet/qltk/information.py:274 ../quodlibet/util/tags.py:149 msgid "length" msgstr "iraupena" #: ../quodlibet/qltk/information.py:275 #, fuzzy msgid "format" msgstr "Informazioa" #: ../quodlibet/qltk/information.py:276 ../quodlibet/util/tags.py:158 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:277 ../quodlibet/util/tags.py:159 #, fuzzy msgid "encoding" msgstr "Goraka" #: ../quodlibet/qltk/information.py:278 ../quodlibet/util/tags.py:155 msgid "bitrate" msgstr "bit-tasa" #: ../quodlibet/qltk/information.py:279 ../quodlibet/util/tags.py:156 msgid "file size" msgstr "fitxategi tamaina" #: ../quodlibet/qltk/information.py:280 ../quodlibet/util/tags.py:144 msgid "modified" msgstr "eraldatua" #: ../quodlibet/qltk/information.py:346 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d hautatua" msgstr[1] "%d hautatuak" #: ../quodlibet/qltk/information.py:359 #, python-format msgid "Produced by %s" msgstr "%s-ek sortua" #: ../quodlibet/qltk/information.py:401 ../quodlibet/util/tags.py:82 msgid "performer" msgstr "interpretea" #: ../quodlibet/qltk/information.py:434 msgid "Track unavailable" msgstr "Pista erabilezina" #: ../quodlibet/qltk/information.py:486 ../quodlibet/qltk/information.py:562 #, 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:490 msgid "Selected Discography" msgstr "Hautatu diskografia" #: ../quodlibet/qltk/information.py:543 #, 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:565 ../quodlibet/util/tags.py:71 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:580 msgid "Total length:" msgstr "Iraupena guztira:" #: ../quodlibet/qltk/information.py:584 msgid "Total size:" msgstr "Tamaina guztira:" #: ../quodlibet/qltk/information.py:587 msgid "Files" msgstr "Fixategiak" #: ../quodlibet/qltk/lyrics.py:34 msgid "_Download" msgstr "_Deskargatu" #: ../quodlibet/qltk/lyrics.py:37 #, 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:69 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ez da kanta honen letrarik aurkitu." #: ../quodlibet/qltk/lyrics.py:78 #, fuzzy msgid "Searching for lyrics…" msgstr "Letrak bilatzen..." #: ../quodlibet/qltk/lyrics.py:101 msgid "Unable to download lyrics." msgstr "Ezin dira letrak deskargatu." #: ../quodlibet/qltk/maskedbox.py:19 #, 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:20 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/maskedbox.py:43 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:85 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:40 msgid "Discard tag changes?" msgstr "Baztertu etiketa aldaketak?" #: ../quodlibet/qltk/msg.py:41 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:54 ../quodlibet/qltk/prefs.py:564 #: ../quodlibet/qltk/textedit.py:60 ../quodlibet/qltk/tracknumbers.py:109 #, fuzzy msgid "_Revert" msgstr "Inoiz" #: ../quodlibet/qltk/msg.py:85 msgid "File exists" msgstr "Fitxategia badago" #: ../quodlibet/qltk/msg.py:87 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:93 #, fuzzy msgid "_Replace File" msgstr "Berrizendatu fitxategiak" #: ../quodlibet/qltk/notif.py:181 msgid "Active tasks" msgstr "Lan aktiboak" #: ../quodlibet/qltk/notif.py:187 #, python-format msgid "%d tasks running" msgstr "Lan aktiboak: %d" #: ../quodlibet/qltk/playorder.py:21 msgid "_Unknown" msgstr "_Ezezaguna" #: ../quodlibet/qltk/playorder.py:74 msgid "In Order" msgstr "Ordenean" #: ../quodlibet/qltk/playorder.py:75 msgid "_In Order" msgstr "_Ordenean" #: ../quodlibet/qltk/playorder.py:134 msgid "Shuffle" msgstr "Ausaz" #: ../quodlibet/qltk/playorder.py:135 msgid "_Shuffle" msgstr "_Ausaz" #: ../quodlibet/qltk/playorder.py:157 msgid "Weighted" msgstr "Iraupena" #: ../quodlibet/qltk/playorder.py:158 msgid "_Weighted" msgstr "_Iraupena" #: ../quodlibet/qltk/playorder.py:178 msgid "One Song" msgstr "Abesti bat" #: ../quodlibet/qltk/playorder.py:179 msgid "_One Song" msgstr "_Abesti bat" #: ../quodlibet/qltk/pluginwin.py:31 msgid "Plugin Errors" msgstr "Plugin erroreak" #: ../quodlibet/qltk/pluginwin.py:110 msgid "Enabled" msgstr "Gaitua" #: ../quodlibet/qltk/pluginwin.py:111 msgid "Disabled" msgstr "Desgaitua" #: ../quodlibet/qltk/pluginwin.py:117 msgid "No category" msgstr "Kategoria gabe" #: ../quodlibet/qltk/pluginwin.py:229 msgid "No plugins found." msgstr "Ez da pluginik aurkitu." #: ../quodlibet/qltk/pluginwin.py:277 #, fuzzy msgid "Plugins" msgstr "_Pluginak" #: ../quodlibet/qltk/pluginwin.py:314 msgid "Show _Errors" msgstr "Ikusi erroreak" #: ../quodlibet/qltk/prefs.py:43 msgid "_Disc" msgstr "_Diskoa" #: ../quodlibet/qltk/prefs.py:44 msgid "_Track" msgstr "_Pista" #: ../quodlibet/qltk/prefs.py:45 #, fuzzy msgid "Grou_ping" msgstr "taldekatzea" #: ../quodlibet/qltk/prefs.py:48 msgid "Al_bum" msgstr "Al_buma" #: ../quodlibet/qltk/prefs.py:53 msgid "_Filename" msgstr "_Fitxategi-izena" #: ../quodlibet/qltk/prefs.py:55 msgid "_Length" msgstr "_Iraupena" #: ../quodlibet/qltk/prefs.py:62 msgid "Song List" msgstr "Abesti zerrenda" #: ../quodlibet/qltk/prefs.py:66 msgid "_Jump to playing song automatically" msgstr "_Salto erreproduzitzen den abestira automatikoki" #: ../quodlibet/qltk/prefs.py:68 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:71 msgid "Behavior" msgstr "Portaera" #: ../quodlibet/qltk/prefs.py:87 msgid "_Others:" msgstr "_Besteak:" #: ../quodlibet/qltk/prefs.py:93 #, fuzzy msgid "_Edit…" msgstr "_Editatu bistaratzea..." #: ../quodlibet/qltk/prefs.py:95 msgid "Add or remove additional column headers" msgstr "Gehitu edo ezabatu informazio gehigarriko zutabeak" #: ../quodlibet/qltk/prefs.py:106 msgid "Visible Columns" msgstr "Zutabe ikusgarriak" #: ../quodlibet/qltk/prefs.py:112 #, fuzzy msgid "Artist includes all _people" msgstr "Sarezko _bilaketa jendea barneratuz" #: ../quodlibet/qltk/prefs.py:116 msgid "Filename includes _folder" msgstr "Fitxategi-izenak _karpeta barneratzen du" #: ../quodlibet/qltk/prefs.py:132 #, fuzzy msgid "Column Preferences" msgstr "Hobespenak" #: ../quodlibet/qltk/prefs.py:138 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:221 #, fuzzy msgid "Edit Columns" msgstr "Zutabe gehigarriak" #: ../quodlibet/qltk/prefs.py:232 msgid "Browsers" msgstr "Nabigatzaileak" #: ../quodlibet/qltk/prefs.py:237 msgid "_Global filter:" msgstr "Iragazki na_gusia:" #: ../quodlibet/qltk/prefs.py:242 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:249 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Bilatu" #: ../quodlibet/qltk/prefs.py:254 msgid "Confirm _multiple ratings" msgstr "Berretsi balorazio a_nitz" #: ../quodlibet/qltk/prefs.py:256 #, 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:259 msgid "Enable _one-click ratings" msgstr "Gaitu klik-bakarreko balorazioak" #: ../quodlibet/qltk/prefs.py:261 #, 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:267 ../quodlibet/qltk/prefs.py:585 msgid "Ratings" msgstr "Balorazioak" #: ../quodlibet/qltk/prefs.py:272 msgid "_Use rounded corners on thumbnails" msgstr "_Erabili borobildutako ertzak argazkitxoentzat" #: ../quodlibet/qltk/prefs.py:274 #, fuzzy msgid "Round the corners of album artwork thumbnail images." msgstr "" "Borobildu album arte-lan argazkitxo irudiaren ertzak. Berrabiarazte behar " "dezake eragin izateko." #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:280 msgid "Prefer _embedded art" msgstr "Hobetsi album arte lan _txertatuak" #: ../quodlibet/qltk/prefs.py:282 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:287 #, fuzzy msgid "_Fixed image filename:" msgstr "_Ezarritako irudiaren izena:" #: ../quodlibet/qltk/prefs.py:289 #, fuzzy msgid "The single image filename to use if selected" msgstr "Album arte lanaren irudia erabiltzeko, izena ezartzen denean" #: ../quodlibet/qltk/prefs.py:295 msgid "The album art image file to use when forced" msgstr "Album arte lanaren irudia erabiltzeko, izena ezartzen denean" #: ../quodlibet/qltk/prefs.py:304 #, fuzzy msgid "Album Art" msgstr "Album zerrenda" #: ../quodlibet/qltk/prefs.py:328 #, fuzzy msgid "Playback" msgstr "Gelditu erreproduzitzeaz" #: ../quodlibet/qltk/prefs.py:333 #, fuzzy msgid "Output Configuration" msgstr "Erregistro irteera" #: ../quodlibet/qltk/prefs.py:344 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:347 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Lehenetsiriko irabazia (dB):" #: ../quodlibet/qltk/prefs.py:358 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:361 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Aurre-amp irabazia (dB):" #: ../quodlibet/qltk/prefs.py:366 msgid "_Enable Replay Gain volume adjustment" msgstr "_Gaitu erreprodukzio irabazte bolumen doitzea" #: ../quodlibet/qltk/prefs.py:391 msgid "Replay Gain Volume Adjustment" msgstr "Erreprodukzio bolumen irabazi doitzea" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "_Default rating:" msgstr "Berezkoa" #: ../quodlibet/qltk/prefs.py:463 #, fuzzy msgid "Rating _scale:" msgstr "Balorazioak" #: ../quodlibet/qltk/prefs.py:512 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:517 msgid "_Bayesian averaging amount:" msgstr "_Batezbesteko Bayesianaren kopurua:" #: ../quodlibet/qltk/prefs.py:526 msgid "Save ratings and play _counts" msgstr "Gorde balorazio eta erreprodukzio _kontaketak" #: ../quodlibet/qltk/prefs.py:530 msgid "_Email:" msgstr "_Eposta:" #: ../quodlibet/qltk/prefs.py:532 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:547 #, fuzzy msgid "Auto-save tag changes" msgstr "Baztertu etiketa aldaketak?" #: ../quodlibet/qltk/prefs.py:549 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:557 msgid "" "A list of separators to use when splitting tag values. The list is space-" "separated" msgstr "" "Etiketatik baloreak bereizterakoan erabil daitezkeen bereizle zerrenda " "(komaz bereiztuta)." #: ../quodlibet/qltk/prefs.py:579 #, fuzzy msgid "Tags" msgstr "Editatu etiketak" #: ../quodlibet/qltk/prefs.py:600 #, fuzzy msgid "Updating for new ratings" msgstr "_Kate berria" #: ../quodlibet/qltk/prefs.py:610 msgid "_Refresh library on start" msgstr "F_reskatu liburutegia abiaraztean" #: ../quodlibet/qltk/prefs.py:620 ../quodlibet/qltk/quodlibetwindow.py:916 msgid "Re_fresh Library" msgstr "_Freskatu liburutegia" #: ../quodlibet/qltk/prefs.py:622 ../quodlibet/qltk/quodlibetwindow.py:988 msgid "Check for changes in your library" msgstr "Aztertu zure liburutegiko aldaketak" #: ../quodlibet/qltk/prefs.py:627 msgid "Re_load Library" msgstr "Birkargatu _liburutegia" #: ../quodlibet/qltk/prefs.py:630 #, 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:640 #, fuzzy msgid "Scan Directories" msgstr "Arakatu _direktorioak" #: ../quodlibet/qltk/prefs.py:646 #, fuzzy msgid "Hidden Songs" msgstr "Abestirik ez" #: ../quodlibet/qltk/properties.py:159 ../quodlibet/qltk/properties.py:161 msgid "Properties" msgstr "Propietateak" #: ../quodlibet/qltk/queue.py:78 ../quodlibet/qltk/quodlibetwindow.py:926 msgid "_Queue" msgstr "_Ilara" #: ../quodlibet/qltk/queue.py:85 msgid "Remove all songs from the queue" msgstr "Kendu ilarako abesti guztiak" #: ../quodlibet/qltk/queue.py:106 msgid "_Random" msgstr "_Ausaz" #: ../quodlibet/qltk/quodlibetwindow.py:238 msgid "Restart the playlist when finished" msgstr "Berriz hasi erreprodukzio-zerrenda amaitzean" #: ../quodlibet/qltk/quodlibetwindow.py:374 #, fuzzy msgid "Playback Error" msgstr "Gelditu erreproduzitzeaz" #: ../quodlibet/qltk/quodlibetwindow.py:382 #, fuzzy msgid "Set up library directories?" msgstr "Hautatu direktorioak" #: ../quodlibet/qltk/quodlibetwindow.py:383 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:389 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:390 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:757 msgid "Unable to add songs" msgstr "Ezin dira abestiak gehitu" #: ../quodlibet/qltk/quodlibetwindow.py:758 #: ../quodlibet/qltk/quodlibetwindow.py:1195 #, 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:800 msgid "_Music" msgstr "_Musika" #: ../quodlibet/qltk/quodlibetwindow.py:803 #, fuzzy msgid "_Add a Folder…" msgstr "_Gehitu karpeta bat..." #: ../quodlibet/qltk/quodlibetwindow.py:808 #, fuzzy msgid "_Add a File…" msgstr "_Gehitu fitxategi bat..." #: ../quodlibet/qltk/quodlibetwindow.py:813 #, fuzzy msgid "_Add a Location…" msgstr "Gehitu kokapena" #: ../quodlibet/qltk/quodlibetwindow.py:818 #, fuzzy msgid "Open _Browser" msgstr "Ireki nabigatzaile berri bat" #: ../quodlibet/qltk/quodlibetwindow.py:837 msgid "_Control" msgstr "_Kontrola" #: ../quodlibet/qltk/quodlibetwindow.py:850 msgid "_Jump to Playing Song" msgstr "_Salto erreproduzitzen den abestira" #: ../quodlibet/qltk/quodlibetwindow.py:855 msgid "_View" msgstr "_Ikusi" #: ../quodlibet/qltk/quodlibetwindow.py:858 msgid "_Help" msgstr "_Laguntza" #: ../quodlibet/qltk/quodlibetwindow.py:876 #, fuzzy msgid "Stop After This Song" msgstr "Gelditu kanta honen ondoren" #: ../quodlibet/qltk/quodlibetwindow.py:882 #, fuzzy msgid "Add Bookmark" msgstr "Laster-markak" #: ../quodlibet/qltk/quodlibetwindow.py:888 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editatu laster-markak..." #: ../quodlibet/qltk/quodlibetwindow.py:893 msgid "_About" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:898 msgid "Online Help" msgstr "Laguntza sarean" #: ../quodlibet/qltk/quodlibetwindow.py:907 #, fuzzy msgid "Search Help" msgstr "Bilatu" #: ../quodlibet/qltk/quodlibetwindow.py:921 msgid "Song _List" msgstr "Abesti _zerrenda" #: ../quodlibet/qltk/quodlibetwindow.py:1183 msgid "Add a Location" msgstr "Gehitu kokapena" #: ../quodlibet/qltk/quodlibetwindow.py:1184 msgid "Enter the location of an audio file:" msgstr "Idatzi audio fitxategiaren kokapena:" #: ../quodlibet/qltk/quodlibetwindow.py:1189 #: ../quodlibet/qltk/quodlibetwindow.py:1194 msgid "Unable to add location" msgstr "Ezin da kokapena gehitu" #: ../quodlibet/qltk/quodlibetwindow.py:1190 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> ez da baliozko kokapen bat." #: ../quodlibet/qltk/quodlibetwindow.py:1209 #: ../quodlibet/qltk/quodlibetwindow.py:1225 msgid "Add Music" msgstr "Gehitu musika" #: ../quodlibet/qltk/quodlibetwindow.py:1211 msgid "Watch this folder for new songs" msgstr "Bilatu kanta berriak karpeta honetan" #: ../quodlibet/qltk/ratingsmenu.py:23 #, 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:25 #, fuzzy msgid "The saved ratings will be removed" msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/ratingsmenu.py:26 #, 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:45 #, fuzzy msgid "Change _Rating" msgstr "_Balorazioa" #: ../quodlibet/qltk/ratingsmenu.py:58 #, fuzzy msgid "_Remove Rating" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/qltk/ratingsmenu.py:76 #, fuzzy msgid "_Remove rating" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/qltk/renamefiles.py:42 msgid "Replace spaces with _underscores" msgstr "Ordeztu zuriuneak a_zpimarrez" #: ../quodlibet/qltk/renamefiles.py:52 msgid "Strip _Windows-incompatible characters" msgstr "Kendu windows-ekin bateragarriak ez diren karaktereak" #: ../quodlibet/qltk/renamefiles.py:70 msgid "Strip _diacritical marks" msgstr "Kendu marka _diakritikoak" #: ../quodlibet/qltk/renamefiles.py:82 msgid "Strip non-_ASCII characters" msgstr "Kendu ASCII ez diren karaktereak" #: ../quodlibet/qltk/renamefiles.py:94 msgid "Use only _lowercase characters" msgstr "Erabili letra _xeheak bakarrik" #: ../quodlibet/qltk/renamefiles.py:122 msgid "Rename Files" msgstr "Berrizendatu fitxategiak" #: ../quodlibet/qltk/renamefiles.py:138 ../quodlibet/qltk/tagsfrompath.py:113 msgid "Path Patterns" msgstr "Bide patroiak" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:114 #, fuzzy msgid "Edit saved patterns…" msgstr "Editatu gordetako balioak..." #: ../quodlibet/qltk/renamefiles.py:142 ../quodlibet/qltk/tagsfrompath.py:117 #: ../quodlibet/qltk/tracknumbers.py:61 msgid "_Preview" msgstr "_Aurreikusi" #: ../quodlibet/qltk/renamefiles.py:188 msgid "New Name" msgstr "Izen berria" #: ../quodlibet/qltk/renamefiles.py:252 msgid "Unable to rename file" msgstr "Ezin da fitxategia berrizendatu" #: ../quodlibet/qltk/renamefiles.py:253 #, 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:261 msgid "Ignore _All Errors" msgstr "Baztertu errore _guztiak" #: ../quodlibet/qltk/renamefiles.py:264 msgid "_Continue" msgstr "_Jarraitu" #: ../quodlibet/qltk/renamefiles.py:293 msgid "Path is not absolute" msgstr "Bidea ez da absolutua" #: ../quodlibet/qltk/renamefiles.py:294 #, 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:41 #, 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:108 msgid "Select Directories" msgstr "Hautatu direktorioak" #: ../quodlibet/qltk/searchbar.py:49 #, fuzzy msgid "Saved Searches" msgstr "Gordetako balioak" #: ../quodlibet/qltk/searchbar.py:50 #, fuzzy msgid "Edit saved searches…" msgstr "Editatu gordetako balioak..." #: ../quodlibet/qltk/searchbar.py:70 msgid "Search" msgstr "Bilatu" #: ../quodlibet/qltk/searchbar.py:71 msgid "Search your library, using free text or QL queries" msgstr "Bilatu zure bilduman, testua edo QL bilaketak erabiliz" #: ../quodlibet/qltk/searchbar.py:119 msgid "Search after _typing" msgstr "Bilatu ida_tzi ondoren" #: ../quodlibet/qltk/searchbar.py:122 msgid "Show search results after the user stops typing." msgstr "" "Bistarazi bilaketa emaitzak erabiltzaileak tekleatzeari utzi bezain laster." #: ../quodlibet/qltk/searchbar.py:177 msgid "_Limit:" msgstr "_Muga:" #: ../quodlibet/qltk/searchbar.py:190 msgid "_Weight" msgstr "_Tamaina" #: ../quodlibet/qltk/songlist.py:355 #, python-format msgid "_Filter on %s" msgstr "_Iragazi %s-ez" #: ../quodlibet/qltk/songlist.py:1071 #, fuzzy msgid "All _Headers" msgstr "_Album goiburuak" #: ../quodlibet/qltk/songlist.py:1072 msgid "_Track Headers" msgstr "Pis_ta goiburuak" #: ../quodlibet/qltk/songlist.py:1073 msgid "_Album Headers" msgstr "_Album goiburuak" #: ../quodlibet/qltk/songlist.py:1074 msgid "_People Headers" msgstr "_Pertsona goiburuak" #: ../quodlibet/qltk/songlist.py:1075 msgid "_Date Headers" msgstr "_Data goiburuak" #: ../quodlibet/qltk/songlist.py:1076 msgid "_File Headers" msgstr "_fixategi goiburuak" #: ../quodlibet/qltk/songlist.py:1077 msgid "_Production Headers" msgstr "P_rodukzio goiburuak" #: ../quodlibet/qltk/songlist.py:1092 #, fuzzy msgid "_Customize Headers…" msgstr "_Pertsonalizatu goiburuak..." #: ../quodlibet/qltk/songlist.py:1097 #, fuzzy msgid "_Expand Column" msgstr "Zutabe gehigarriak" #: ../quodlibet/qltk/songsmenu.py:32 #, 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:60 #, 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:326 #, fuzzy msgid "Play_lists" msgstr "Erreprodukzio-zerrendak" #: ../quodlibet/qltk/songsmenu.py:331 msgid "Add to _Queue" msgstr "Gehitu _ilarara" #: ../quodlibet/qltk/songsmenu.py:354 msgid "_Copy to Device" msgstr "_Kopiatu gailura" #: ../quodlibet/qltk/songsmenu.py:364 #, fuzzy msgid "_Remove from library" msgstr "_Kendu erreprodukzio-zerrendatik" #: ../quodlibet/qltk/tagsfrompath.py:44 msgid "Replace _underscores with spaces" msgstr "Ordeztu azpimarrak zuriunez" #: ../quodlibet/qltk/tagsfrompath.py:54 msgid "_Title-case tags" msgstr "_Titulu-gisako etiketak" #: ../quodlibet/qltk/tagsfrompath.py:64 msgid "Split into multiple _values" msgstr "Zatitu hainbat _ baliotan" #: ../quodlibet/qltk/tagsfrompath.py:98 msgid "Tags From Path" msgstr "Etiketak bidetik" #: ../quodlibet/qltk/tagsfrompath.py:135 msgid "Tags replace existing ones" msgstr "Etiketak daudenak ordezkatzen dituzte" #: ../quodlibet/qltk/tagsfrompath.py:136 msgid "Tags are added to existing ones" msgstr "Etiketak daudenei gehituko zaizkie" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:150 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:192 #, 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:213 msgid "Invalid tags" msgstr "Etiketa baliogabeak" #: ../quodlibet/qltk/tagsfrompath.py:214 #, 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:138 #, 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:154 msgid "Edit Display" msgstr "Editatu bistaratzea" #: ../quodlibet/qltk/tracknumbers.py:37 msgid "Track Numbers" msgstr "Pista zenbakiak" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Hasi he_mendik:" #: ../quodlibet/qltk/tracknumbers.py:53 msgid "_Total tracks:" msgstr "Pista _guztira:" #: ../quodlibet/qltk/unity.py:51 #, fuzzy msgid "Play/Pause" msgstr "Erreproduzigailua" #: ../quodlibet/qltk/unity.py:74 #, fuzzy msgid "Previous" msgstr "_Aurreikusi" #: ../quodlibet/qltk/views.py:803 #, fuzzy, python-format msgid "and %d more…" msgstr "eta %d gehiago..." #: ../quodlibet/qltk/wlw.py:186 msgid "Saving the songs you changed." msgstr "Aldatu dituzun abestiak gordetzen." #: ../quodlibet/qltk/wlw.py:187 #, 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:218 #, fuzzy, python-format msgid "%(current)d of %(all)d" msgstr "Mugitzen: %(current)d/%(total)d." #: ../quodlibet/util/collection.py:469 #, python-format msgid "A playlist named %s already exists." msgstr "Badago %s izeneko erreprodukzio-zerrenda bat." #: ../quodlibet/util/cover/built_in.py:18 msgid "Embed cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:19 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:41 #, fuzzy msgid "Filesystem cover" msgstr "Fitxategi sistema" #: ../quodlibet/util/cover/built_in.py:42 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #. Translators: "D" as in "Debug". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:123 #, fuzzy msgid "D:" msgstr "W: " #. Translators: "W" as in "Warning". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:140 #, fuzzy msgid "W:" msgstr "W: " #. Translators: "E" as in "Error". It is prepended to #. terminal output. APT uses a similar output format. #: ../quodlibet/util/dprint.py:153 #, fuzzy msgid "E:" msgstr "E: " #: ../quodlibet/util/__init__.py:73 msgid "Display brief usage information" msgstr "Erakutsi erabiltze argibide laburpena" #: ../quodlibet/util/__init__.py:75 msgid "Display version and copyright" msgstr "Bertsio eta kopia-eskubideak bistarazi" #: ../quodlibet/util/__init__.py:115 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:117 msgid "[options]" msgstr "[aukerak]" #: ../quodlibet/util/__init__.py:162 #, python-format msgid "Option %r not recognized." msgstr "Ez da %r aukera ezagutzen." #: ../quodlibet/util/__init__.py:165 #, python-format msgid "Option %r requires an argument." msgstr "%r aukerak argumentu bat behar du." #: ../quodlibet/util/__init__.py:168 #, python-format msgid "%r is not a unique prefix." msgstr "%r ez da aurrizki bakana." #: ../quodlibet/util/__init__.py:323 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:379 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "segundo %d" msgstr[1] "%d segundo" #: ../quodlibet/util/__init__.py:380 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "minutu %d" msgstr[1] "%d minutu" #: ../quodlibet/util/__init__.py:381 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "ordu %d" msgstr[1] "%d ordu" #: ../quodlibet/util/__init__.py:382 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "egun %d" msgstr[1] "%d egun" #: ../quodlibet/util/__init__.py:383 #, 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 other than "titlecase?". #: ../quodlibet/util/__init__.py:489 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Lehen hizkia larriz hitz bakoitzean?" #: ../quodlibet/util/massagers.py:31 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:43 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:63 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:82 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:103 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:113 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:102 msgid "Unable to edit song" msgstr "Ezin da abestia editatu" #: ../quodlibet/util/songwrapper.py:103 #, 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:31 #: ../quodlibet/util/string/__init__.py:40 msgid "[Invalid Encoding]" msgstr "[Kodeketa baliogabea]" #: ../quodlibet/util/tags.py:71 msgid "album" msgstr "albuma" #: ../quodlibet/util/tags.py:72 msgid "arranger" msgstr "Moldatzailea" #: ../quodlibet/util/tags.py:72 msgid "arrangers" msgstr "moldatzaileak" #: ../quodlibet/util/tags.py:72 #, fuzzy msgid "arrangement" msgstr "Moldatzailea" #: ../quodlibet/util/tags.py:74 msgid "author" msgstr "egilea" #: ../quodlibet/util/tags.py:74 msgid "authors" msgstr "egileak" #: ../quodlibet/util/tags.py:75 msgid "composer" msgstr "konposatzailea" #: ../quodlibet/util/tags.py:75 msgid "composers" msgstr "konposatzaileak" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "composition" msgstr "konposatzailea" #: ../quodlibet/util/tags.py:76 msgid "conductor" msgstr "gidaria" #: ../quodlibet/util/tags.py:76 msgid "conductors" msgstr "gidariak" #: ../quodlibet/util/tags.py:76 #, fuzzy msgid "conducting" msgstr "gidaria" #: ../quodlibet/util/tags.py:77 msgid "contact" msgstr "kontaktua" #: ../quodlibet/util/tags.py:78 msgid "copyright" msgstr "Copyright-a" #: ../quodlibet/util/tags.py:79 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:80 msgid "description" msgstr "azalpena" #: ../quodlibet/util/tags.py:81 msgid "genre" msgstr "generoa" #: ../quodlibet/util/tags.py:81 #, fuzzy msgid "genres" msgstr "generoa" #: ../quodlibet/util/tags.py:83 msgid "grouping" msgstr "taldekatzea" #: ../quodlibet/util/tags.py:84 msgid "language" msgstr "hizkuntza" #: ../quodlibet/util/tags.py:85 msgid "license" msgstr "lizentzia" #: ../quodlibet/util/tags.py:86 msgid "location" msgstr "kokapena" #: ../quodlibet/util/tags.py:87 msgid "lyricist" msgstr "idazlea" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:89 msgid "organization" msgstr "erakundea" #: ../quodlibet/util/tags.py:90 msgid "title" msgstr "izenburua" #: ../quodlibet/util/tags.py:91 msgid "version" msgstr "bertsioa" #: ../quodlibet/util/tags.py:92 msgid "website" msgstr "webgunea" #: ../quodlibet/util/tags.py:94 msgid "album artist" msgstr "album artista" #: ../quodlibet/util/tags.py:95 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:98 ../quodlibet/util/tags.py:99 msgid "disc subtitle" msgstr "disko azpititulua" #: ../quodlibet/util/tags.py:100 ../quodlibet/util/tags.py:136 msgid "disc" msgstr "diskoa" #: ../quodlibet/util/tags.py:101 ../quodlibet/util/tags.py:138 msgid "track" msgstr "pista" #: ../quodlibet/util/tags.py:102 msgid "label ID" msgstr "etiketa IDa" #: ../quodlibet/util/tags.py:103 msgid "original release date" msgstr "jatorrizko argitaratze data" #: ../quodlibet/util/tags.py:104 msgid "original album" msgstr "jatorrizko albuma" #: ../quodlibet/util/tags.py:105 msgid "original artist" msgstr "jatorrizko artista" #: ../quodlibet/util/tags.py:106 msgid "recording date" msgstr "grabaketa data" #: ../quodlibet/util/tags.py:107 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:116 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz pista IDa" #: ../quodlibet/util/tags.py:117 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz argitaratze IDa" #: ../quodlibet/util/tags.py:118 msgid "MusicBrainz release ID" msgstr "MusicBrainz argitaratze IDa" #: ../quodlibet/util/tags.py:119 #, fuzzy msgid "MusicBrainz artist ID" msgstr "Musicbrainz artista IDa" #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz argitaratze IDa" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM IDa" #: ../quodlibet/util/tags.py:122 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz album status" msgstr "MusicBrainz album egoera" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz album type" msgstr "MusicBrainz album mota" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:127 msgid "track gain" msgstr "Pistaren irabazpena" #: ../quodlibet/util/tags.py:128 msgid "track peak" msgstr "Pistaren erpina" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:130 msgid "album gain" msgstr "Albumaren irabazpena" #: ../quodlibet/util/tags.py:131 msgid "album peak" msgstr "Albumaren gailurra" #: ../quodlibet/util/tags.py:132 msgid "reference loudness" msgstr "erreferentzia ozena" #: ../quodlibet/util/tags.py:137 msgid "discs" msgstr "diskoak" #: ../quodlibet/util/tags.py:139 msgid "tracks" msgstr "pistak" #: ../quodlibet/util/tags.py:140 msgid "last started" msgstr "azken abiarazia" #: ../quodlibet/util/tags.py:141 msgid "full name" msgstr "Izen osoa" #: ../quodlibet/util/tags.py:148 msgid "mount point" msgstr "muntatze puntua" #: ../quodlibet/util/tags.py:150 msgid "people" msgstr "jendea" #: ../quodlibet/util/tags.py:152 msgid "year" msgstr "urtea" #: ../quodlibet/util/tags.py:153 #, fuzzy msgid "original release year" msgstr "jatorrizko argitaratze data" #: ../quodlibet/util/tags.py:154 msgid "bookmark" msgstr "laster-marka" #: ../quodlibet/util/tags.py:157 #, fuzzy msgid "file format" msgstr "Ez dago denbora informaziorik" #: ../quodlibet/util/tags.py:160 #, fuzzy msgid "playlists" msgstr "Erreprodukzio-zerrendak" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:250 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:258 msgid "roles" msgstr "" #~ 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 "Clear search" #~ msgstr "Garbitu bilaketa" #~ 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 "lyricists" #~ msgstr "Idazleak" #~ 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.5.3/README������������������������������������������������������������������������������0000644�0001750�0001750�00000000742�12646426641�014636� 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 more information see https://quodlibet.readthedocs.org/ ������������������������������quodlibet-3.5.3/data/�������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�014667� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/data/quodlibet.desktop.in�����������������������������������������������������������0000644�0001750�0001750�00000001366�12607265240�020653� 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/midi;audio/mp3;audio/mp4;audio/mpeg;audio/mpeg4;audio/mpg;audio/ogg;audio/vorbis;audio/wav;audio/wave;audio/x-aac;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; 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.5.3/data/net.sacredchao.QuodLibet.service.in��������������������������������������������0000644�0001750�0001750�00000000112�12501341560�023377� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[D-BUS Service] Name=net.sacredchao.QuodLibet Exec=@PREFIX@/bin/quodlibet ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/data/exfalso.desktop.in�������������������������������������������������������������0000644�0001750�0001750�00000000343�12607265240�020316� 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.5.3/data/exfalso.appdata.xml.in���������������������������������������������������������0000644�0001750�0001750�00000002033�12607265240�021054� 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> <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.5.3/data/org.mpris.MediaPlayer2.quodlibet.service.in������������������������������������0000644�0001750�0001750�00000000122�12501341560�025014� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[D-BUS Service] Name=org.mpris.MediaPlayer2.quodlibet Exec=@PREFIX@/bin/quodlibet ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/data/quodlibet.1��������������������������������������������������������������������0000644�0001750�0001750�00000016321�12607265240�016732� 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.org/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 or restart if near the beginning .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 .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\-playing Begin playing immediately .TP .B \-\-status Print playing status .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.org/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.org/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.org/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.org/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.org/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.org/en/latest/guide\fP, \fI\%https://quodlibet.readthedocs.org/en/latest/guide/faq.html\fP, \fBregex\fP(7), \fBgst\-launch\fP(1) .fi .sp .\" Generated by docutils manpage writer. . ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/data/quodlibet-search-provider.ini��������������������������������������������������0000644�0001750�0001750�00000000242�12501341560�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.5.3/data/exfalso.1����������������������������������������������������������������������0000644�0001750�0001750�00000005113�12607265240�016400� 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.org/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.org/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.org/en/latest/guide\fP, \fI\%https://quodlibet.readthedocs.org/en/latest/guide/faq.html\fP .fi .sp .\" Generated by docutils manpage writer. . �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/data/README.rst���������������������������������������������������������������������0000644�0001750�0001750�00000001671�12607265240�016351� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Some info on the file formats contained here: Symbolic Icons (``*-symbolic.svg.in``) Manually adjusted symbolic variants of the real application icons. The ``build-symbolic.sh`` script invokes Inkscape to change strokes to paths so they can be recolored at runtime by GTK+. The result will be copied to ``quodlibet/images/hicolor/scalable/``. 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.5.3/data/org.mpris.quodlibet.service.in�������������������������������������������������0000644�0001750�0001750�00000000105�12501341560�022540� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[D-BUS Service] Name=org.mpris.quodlibet Exec=@PREFIX@/bin/quodlibet �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/data/build-symbolic.sh��������������������������������������������������������������0000755�0001750�0001750�00000001372�12607265240�020135� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash # This script takes foo-symbolic-svg.in files, converts the strokes to paths, # adds all the paths together and copies the result into our hicolor theme # without the .in extension. # Note that this will remove all object fills.. set -e DIR="$( cd "$( dirname "$0" )" && pwd )" cd "$DIR" function build_symbolic { echo "Build $1" cp "$1.in" "temp-$1" inkscape -f "temp-$1" --verb=EditSelectAll \ --verb=SelectionUnGroup --verb=StrokeToPath --verb=SelectionUnion \ --verb=FileVacuum \ --verb=FileSave --verb=FileClose --verb=FileQuit mv "temp-$1" "../quodlibet/images/hicolor/scalable/apps/$1" echo "done" } build_symbolic "exfalso-symbolic.svg" build_symbolic "quodlibet-symbolic.svg" echo "all done" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/data/operon.1�����������������������������������������������������������������������0000644�0001750�0001750�00000017755�12607265240�016260� 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 COMMANDS .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.5.3/data/quodlibet.appdata.xml.in�������������������������������������������������������0000644�0001750�0001750�00000002405�12607265240�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> <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.5.3/PKG-INFO����������������������������������������������������������������������������0000644�0001750�0001750�00000000456�12646427760�015060� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Metadata-Version: 1.0 Name: quodlibet Version: 3.5.3 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.5.3/gdist/������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�015070� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/gdist/scripts.py��������������������������������������������������������������������0000644�0001750�0001750�00000001564�12607265240�017125� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 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 from distutils.dep_util import newer from distutils.command.build_scripts import build_scripts as du_build_scripts class build_scripts(du_build_scripts): description = "copy scripts to build directory" def run(self): self.mkpath(self.build_dir) for script in self.scripts: newpath = os.path.join(self.build_dir, os.path.basename(script)) if newpath.lower().endswith(".py"): newpath = newpath[:-3] if newer(script, newpath) or self.force: self.copy_file(script, newpath) ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/gdist/appdata.py��������������������������������������������������������������������0000644�0001750�0001750�00000006162�12607265240�017047� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # 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. """ AppData Specification: http://people.freedesktop.org/~hughsient/appdata/ """ import os from distutils.dep_util import newer from distutils.core import Command 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.5.3/gdist/clean.py����������������������������������������������������������������������0000644�0001750�0001750�00000005036�12607265240�016516� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 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. """clean up output of 'build' commands""" import os import shutil from distutils.core import Command from distutils.command.clean import clean as distutils_clean class clean(distutils_clean, Command): """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.5.3/gdist/man.py������������������������������������������������������������������������0000644�0001750�0001750�00000003517�12607265240�016211� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 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. """install man pages Commands to install Unix man pages. """ import os from distutils.core 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.5.3/gdist/docs.py�����������������������������������������������������������������������0000644�0001750�0001750�00000002134�12607265240�016360� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # 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 from distutils.core 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.5.3/gdist/__init__.py�������������������������������������������������������������������0000644�0001750�0001750�00000014502�12607265240�017171� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 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. """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. """ import os import sys try: from py2exe import Distribution except ImportError: from distutils.core import Distribution from distutils.command.build import build as distutils_build from distutils.command.install import install as distutils_install from gdist.shortcuts import build_shortcuts, install_shortcuts from gdist.man import install_man from gdist.po import build_mo, install_mo, po_stats, update_po, create_po from gdist.icons import install_icons from gdist.search_provider import install_search_provider from gdist.dbus_services import build_dbus_services, install_dbus_services from gdist.appdata import build_appdata, install_appdata from gdist.coverage import coverage_cmd from gdist.docs import build_sphinx from gdist.scripts import build_scripts from gdist.tests import quality_cmd, distcheck_cmd, test_cmd from gdist.clean import clean 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()), ] 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()), ] def initialize_options(self): distutils_install.initialize_options(self) self.mandir = None is_windows = (os.name == "nt") 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 = {} 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("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 not is_windows and bool(self.po_directory) def has_shortcuts(self): return not is_windows and not is_osx and bool(self.shortcuts) def has_appdata(self): return not is_windows and not is_osx and bool(self.appdata) def has_man_pages(self): return not is_windows and bool(self.man_pages) def has_dbus_services(self): return not is_windows and not is_osx and bool(self.dbus_services) def need_icon_install(self): return not is_windows and not is_osx def need_search_provider(self): return not is_windows and not is_osx __all__ = ["GDistribution"] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/gdist/search_provider.py������������������������������������������������������������0000644�0001750�0001750�00000002145�12607265240�020611� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # 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 from distutils.core 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.5.3/gdist/shortcuts.py������������������������������������������������������������������0000644�0001750�0001750�00000006417�12607265240�017476� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 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 from distutils.dep_util import newer from distutils.core import Command 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.5.3/gdist/tests.py����������������������������������������������������������������������0000644�0001750�0001750�00000012302�12646425016�016572� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # 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. from __future__ import absolute_import import os import sys import subprocess import tarfile from distutils.core import Command from distutils import dir_util from distutils.command.sdist import sdist 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"), ] use_colors = sys.stderr.isatty() and os.name != "nt" def initialize_options(self): self.to_run = [] self.suite = None self.strict = False self.all = False self.exitfirst = 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) @classmethod def _red(cls, text): from quodlibet.util.dprint import Colorise return Colorise.red(text) if cls.use_colors else text def run(self): mods = sys.modules.keys() if "gi" in mods: raise SystemExit("E: setup.py shouldn't depend on gi") import tests main = False if not self.suite or self.all: main = True subdirs = [] if self.all: test_path = tests.__path__[0] for entry in os.listdir(test_path): if os.path.isdir(os.path.join(test_path, entry)): subdirs.append(entry) elif self.suite: subdirs.append(self.suite) failures, errors = tests.unit(self.to_run, main=main, subdirs=subdirs, strict=self.strict, stop_first=self.exitfirst) if failures or errors: raise SystemExit(self._red("%d test failure(s) and " "%d test error(s), as detailed above." % (failures, errors))) class quality_cmd(Command): description = "Run pep8/pyflakes tests" user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): cmd = self.reinitialize_command("test") cmd.suite = "quality" cmd.ensure_finalized() cmd.run() class distcheck_cmd(sdist): description = "run tests on a fresh sdist" def _check_manifest(self): assert self.get_archive_files() # make sure MANIFEST.in includes all tracked files if subprocess.call(["hg", "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(["hg", "locate"], stdout=subprocess.PIPE) out, err = process.communicate() assert process.returncode == 0 tracked_files = [] for path in out.splitlines(): if not path.startswith("quodlibet" + os.sep): continue path = path.split(os.sep, 1)[-1] tracked_files.append(path) diff = set(tracked_files) ^ set(included_files) if diff: print("#" * 80) print("WARNING: MANFIFEST.in doesn't include all " "tracked files or includes non-tracked files") for path in sorted(diff): print(path) raise AssertionError 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", "--prefix", "../prefix", "--record", "../log.txt"]) os.chdir(old_pwd) def run(self): sdist.run(self) self._check_manifest() self._check_dist() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/gdist/coverage.py�������������������������������������������������������������������0000644�0001750�0001750�00000003774�12607265240�017236� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # 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. from __future__ import absolute_import import os import sys import urllib from distutils.core 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 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() cov.html_report(**self.options) dest = os.path.abspath(self.options["directory"]) index = os.path.join(dest, "index.html") index_url = urllib.pathname2url(index) print("Coverage summary: file://%s" % index_url) ����quodlibet-3.5.3/gdist/po.py�������������������������������������������������������������������������0000644�0001750�0001750�00000017761�12646426641�016071� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 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. """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.core import Command from distutils.errors import DistutilsOptionError 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('"POT-Creation-Date:'): done = True continue lines.append(line) with open(path, "wb") as h: h.write("".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.5.3/gdist/icons.py����������������������������������������������������������������������0000644�0001750�0001750�00000004167�12607265240�016553� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # 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 subprocess from distutils.core 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") scalable = os.path.join(local, "scalable", "apps") scalable_dst = os.path.join(basepath, "scalable", "apps") out = self.copy_tree(scalable, scalable_dst) self.outfiles.extend(out) png = os.path.join(local, "64x64", "apps") png_dst = os.path.join(basepath, "64x64", "apps") out = self.copy_tree(png, png_dst) self.outfiles.extend(out) # this fails during packaging.. so ignore the outcome update_icon_cache(basepath) # install png versions to /usr/share/pixmaps basepath = os.path.join(self.install_dir, 'share', 'pixmaps') out = self.copy_tree(png, basepath) self.outfiles.extend(out) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/gdist/dbus_services.py��������������������������������������������������������������0000644�0001750�0001750�00000006150�12607265240�020272� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # 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 from distutils.core 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) _replace(fullpath, "@PREFIX@", self.exec_prefix) __all__ = ["build_dbus_services", "install_dbus_services"] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/gdist/gettextutil.py����������������������������������������������������������������0000644�0001750�0001750�00000011624�12636563640�020025� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # 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. """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 # pgettext isn't included by default for Python XGETTEXT_ARGS = "--keyword=C_:1c,2 --keyword=npgettext:1c,2,3" 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("."))) 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 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.5.3/quodlibet.py������������������������������������������������������������������������0000755�0001750�0001750�00000015515�12646426641�016327� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python2 # -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012,2013 Christoph Reiter # 2010-2014 Nick Boultbee # <quod-libet-development@googlegroups.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 sys import os import traceback from quodlibet.cli import process_arguments, exit_ from quodlibet.util.dprint import print_d, print_ from quodlibet import util def main(argv): import quodlibet quodlibet.init_cli() 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 from quodlibet.util.string import decode app.name = "Quod Libet" app.id = "quodlibet" quodlibet.set_application_info(Icons.QUODLIBET, app.id, app.name) config.init(os.path.join(quodlibet.get_user_dir(), "config")) 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 = os.environ.get( "QUODLIBET_BACKEND", config.get("player", "backend")) backend_traceback = None for backend in [wanted_backend, "nullbe"]: try: player = quodlibet.player.init_player(backend, app.librarian) except PlayerError: backend_traceback = decode(traceback.format_exc()) else: break app.player = player os.environ["PULSE_PROP_media.role"] = "music" os.environ["PULSE_PROP_application.icon_name"] = "quodlibet" browsers.init() from quodlibet.qltk.songlist import SongList, get_columns from quodlibet.util.collection import Album try: cover_size = config.getint("browsers", "cover_size") except config.Error: pass else: if cover_size > 0: Album.COVER_SIZE = cover_size 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 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="") from quodlibet.qltk.quodlibetwindow import QuodLibetWindow # 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)) from quodlibet.qltk.debugwindow import MinExceptionDialog from quodlibet.qltk.window import on_first_map if backend_traceback is not None: def show_backend_error(window): d = MinExceptionDialog(window, _("Audio Backend Failed to Load"), _("Loading the audio backend '%(name)s' failed. " "Audio playback will be disabled.") % {"name": wanted_backend}, backend_traceback) d.run() # so we show the main window first on_first_map(app.window, show_backend_error, app.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.name, window, player) if "QUODLIBET_NO_MMKEYS" not in os.environ: 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 # 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.main(window, before_quit=before_quit) quodlibet.finish_first_session(app.id) mmkeys_handler.quit() remote.stop() fsiface.destroy() tracker.destroy() quodlibet.library.save() config.save() print_d("Finished shutdown.") if __name__ == "__main__": main(util.argv) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/MANIFEST.in�������������������������������������������������������������������������0000644�0001750�0001750�00000001043�12607265240�015500� 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 recursive-include quodlibet/images/hicolor/ *.svg *.png 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/README.rst include MANIFEST.in recursive-include docs *.py Makefile *.rst *.png prune docs/_build_guide prune docs/_build_all prune docs/_rtd_theme* ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/exfalso.py��������������������������������������������������������������������������0000755�0001750�0001750�00000004150�12633745051�015764� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python2 # -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Niklas Janlert # 2012 Christoph Reiter # <quod-libet-development@googlegroups.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 from quodlibet import app from quodlibet import util from quodlibet import const from quodlibet import config from quodlibet.util.path import fsdecode, fsnative def main(argv): import quodlibet quodlibet.init() 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")) # FIXME: support unicode on Windows, sys.argv isn't good enough argv.append(os.path.abspath(fsnative(u"."))) opts, args = opts.parse(argv[1:]) args[0] = os.path.realpath(args[0]) config.init(os.path.join(quodlibet.get_user_dir(), "config")) 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] if os.name == "nt": dir_ = fsdecode(dir_) 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.main(app.window) quodlibet.finish_first_session(app.id) config.save() print_d("Finished shutdown.") if __name__ == "__main__": main(util.argv) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/operon.py���������������������������������������������������������������������������0000755�0001750�0001750�00000000742�12607265240�015626� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python2 # -*- 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 """A simple command line tagger""" import sys import quodlibet from quodlibet.operon import main from quodlibet import util if __name__ == "__main__": quodlibet.init_cli() sys.exit(main(util.argv)) ������������������������������quodlibet-3.5.3/quodlibet/��������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�015746� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/pattern/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017423� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/pattern/_pattern.py�������������������������������������������������������0000644�0001750�0001750�00000034220�12646426641�021607� 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 quodlibet import util from quodlibet.query import Query from quodlibet.util.path import expanduser, fsnative, sep from quodlibet.util.path import strip_win32_incompat_from_path, limit_path from quodlibet.formats._audio import decode_value # 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.strip() 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 = self.tokens.next() 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 = self.tokens.next() 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 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[:2] == "~#" and "~" not in key[2:]: return 0 return u"_" def comma(self, *args): return u"_" def list_separate(self, *args): 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) 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) values = [value] else: values = self.__song.list_separate(key) if self.__formatter: return [self.__formatter(key, v) 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): """Returns a set of formatted patterns with all tag combinations: <performer>-bla returns [performer1-bla, performer2-bla] The returned set will never be empty (e.g. for an empty pattern). """ vals = [u""] for val in self.__list_func(self.SongProxy(song, self._format)): if not val: continue if isinstance(val, list): vals = [r + part for part in val for r in vals] else: vals = [r + val for r in vals] if self._post: vals = (self._post(v, 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): tags = [] queries = {} content = [ "def f(s):", " x = s." + song_func, " r = []", " a = r.append"] content.extend(self.__tag(self.__root, {}, {}, tags, queries)) content.append(" return r") code = "\n".join(content) scope = dict(queries.itervalues()) exec compile(code, "<string>", "exec") in 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 = [] if isinstance(node, TextNode): 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) ec = self.__tag( node.elsecase, dict(scope), dict(qscope), tags, queries) 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.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") list_func, tags = comp.compile("list_separate") 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, unicode) 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, unicode) 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 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): return Pattern(replace_nt_seps(string), _FileFromPattern) def ArbitraryExtensionFileFromPattern(string): return Pattern(replace_nt_seps(string), _ArbitraryExtensionFileFromPattern) def XMLFromPattern(string): return Pattern(string, _XMLFromPattern) def pattern_from_markup(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 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]" """ string = pattern_from_markup(string) return Pattern(string, _XMLFromPattern) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/pattern/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000000460�12607265240�021522� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from ._pattern import (Pattern, FileFromPattern, XMLFromPattern, XMLFromMarkupPattern, pattern_from_markup, error, ArbitraryExtensionFileFromPattern) ArbitraryExtensionFileFromPattern FileFromPattern Pattern pattern_from_markup XMLFromMarkupPattern XMLFromPattern error ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/config.py�����������������������������������������������������������������0000644�0001750�0001750�00000023526�12646426641�017572� 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 . import const from quodlibet.util.config import Config, Error # Some plugins can be enabled on first install AUTO_ENABLED_PLUGINS = ["Shuffle Playlist", "Remove Playlist Duplicates"] # 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": "1.5", # 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 "songlist": "true", # on or off "queue": "false", # on or off "shufflequeue": "false", # on or off "sortby": "0album", # <reversed?>tagname, song list sort "order": "inorder", "order_shuffle": "shuffle", "shuffle": "false", "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 <~year|[b][i]<~year>[/i][/b] - ><album>", "pane_selection": "", # selected pane values "pane_wide_mode": "0", # browser orientation "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_hotkeys": "true", # press number keys 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 }, # 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": "\xe2\x98\x85", # rating symbol (hollow star) "rating_symbol_blank": "\xe2\x98\x86", # probably belongs in memory "repeat": "false", # 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", }, "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": { "split_on": "/ & ,", # words to split on "id3encoding": "", # ID3 encodings to try "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": { "round": "true", # use rounded corners for artwork thumbnails "prefer_embedded": "false", "force_filename": "false", "filename": "folder.jpg", } } # global instance _config = Config(version=0) options = _config.options get = _config.get getboolean = _config.getboolean getint = _config.getint getfloat = _config.getfloat getstringlist = _config.getstringlist setstringlist = _config.setstringlist getlist = _config.getlist setlist = _config.setlist set = _config.set 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 _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 INITIAL.iteritems(): _config.defaults.add_section(section) for key, value in values.iteritems(): _config.defaults.set(section, key, value) def init(filename=None): global _filename if not _config.is_empty(): raise ValueError("config initialized twice without quitting") _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 get("settings", "rating_symbol_%s" % variant).decode("utf-8") class HardCodedRatingsPrefs(RatingsPrefs): number = int(INITIAL["settings"]["ratings"]) default = float(INITIAL["settings"]["default_rating"]) blank_symbol = INITIAL["settings"]["rating_symbol_blank"].decode("utf-8") full_symbol = INITIAL["settings"]["rating_symbol_full"].decode("utf-8") # Need an instance just for imports to work RATINGS = RatingsPrefs() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/library/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017412� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/library/librarians.py�����������������������������������������������������0000644�0001750�0001750�00000016564�12646426641�022123� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 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 """ Librarians for libraries. """ import itertools from gi.repository import GObject from quodlibet.util.dprint import print_d 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 self.libraries.itervalues(): 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 self.libraries.itervalues(): 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 self.libraries.itervalues(): library.remove(items) def __contains__(self, item): """Check if a key or item is in the library.""" for library in self.libraries.itervalues(): if item in library: return True else: return False def __iter__(self): """Iterate over all items in all libraries.""" return itertools.chain(*self.libraries.itervalues()) 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 list of all values for the given tag.""" tags = set() for library in self.libraries.itervalues(): tags.update(library.tag_values(tag)) return list(tags) 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 self.libraries.itervalues(): 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 self.libraries.itervalues(): 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.5.3/quodlibet/library/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000003335�12607265240�021515� 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 import quodlibet.formats as formats 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. """ s = ", ".join(formats.modules) print_d("Supported formats: %s" % s) 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.5.3/quodlibet/library/libraries.py������������������������������������������������������0000644�0001750�0001750�00000066300�12646426641�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. """ from pickle import Unpickler from cStringIO import StringIO import cPickle as pickle import os import shutil import time from gi.repository import GObject from quodlibet.formats import MusicFile from quodlibet.query import Query from quodlibet.qltk.notif import Task from quodlibet.util.collection import Album from quodlibet.util.collections import DictMixin from quodlibet import util from quodlibet import const from quodlibet import formats from quodlibet.util.dprint import print_d, print_w from quodlibet.util.path import fsdecode, expanduser, unexpand, mkdir, \ normalize_path 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 self.librarian.libraries.itervalues(): print_d("Changing %d items via librarian." % len(items), self) self.librarian.changed(items) else: items = set(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 self._contents.itervalues() def iteritems(self): return self._contents.iteritems() def iterkeys(self): return self._contents.iterkeys() def itervalues(self): return self._contents.itervalues() 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 self.values() 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 = set(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 = set(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 dump_items(filename, items): """Pickle items to disk. Doesn't handle exceptions. """ dirname = os.path.dirname(filename) mkdir(dirname) with util.atomic_save(filename, ".tmp", "wb") as fileobj: # While protocol 2 is usually faster it uses __setitem__ # for unpickle and we override it to clear the sort cache. # This roundtrip makes it much slower, so we use protocol 1 # unpickle numbers (py2.7): # 2: 0.66s / 2 + __set_item__: 1.18s / 1 + __set_item__: 0.72s # see: http://bugs.python.org/issue826897 pickle.dump(items, fileobj, 1) def unpickle_save(data, default, type_=dict): """Unpickle a list of `type_` subclasses and skip items for which the class is missing. In case not just the class lookup fails, returns default. """ class dummy(type_): pass class SaveUnpickler(Unpickler): def find_class(self, module, name): try: return Unpickler.find_class(self, module, name) except (ImportError, AttributeError): return dummy fileobj = StringIO(data) try: items = SaveUnpickler(fileobj).load() except Exception: return default return [i for i in items if not isinstance(i, dummy)] def load_items(filename, default=None): """Load items from disk. In case of an error returns default or an empty list. """ if default is None: default = [] try: fp = open(filename, "rb") except EnvironmentError: if const.DEBUG or os.path.exists(filename): print_w("Couldn't load library from: %r" % filename) return default # pickle makes 1000 read syscalls for 6000 songs # read the file into memory so that there are less # context switches. saves 40% CPU time.. try: data = fp.read() except IOError: fp.close() return default try: items = pickle.loads(data) except Exception: # 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() # try to skip items for which the class is missing # XXX: we assume the items are dict subclasses here.. while nothing # else does items = unpickle_save(data, default) 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: dump_items(filename, self.get_content()) 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 refresh(self, items): """Refresh albums after a manual change.""" self._changed(set(items)) 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 self._contents.iteritems(): 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 list of all values for the given tag.""" tags = set() for song in self.itervalues(): tags.update(song.list(tag)) return list(tags) 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, str): text = text.decode('utf-8') songs = self.values() if text != "": songs = filter(Query(text, star).search, songs) return songs 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 = os.path.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 (StandardError, EnvironmentError): 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 os.path.ismount(point): self._contents.update(items) del(self._masked[point]) self.emit('added', items.values()) 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 scan(self, paths, exclude=[], cofuncid=None): added = [] exclude = [expanduser(path) for path in exclude if path] 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 for fullpath in paths: print_d("Scanning %r." % fullpath, self) desc = _("Scanning %s") % (unexpand(fsdecode(fullpath))) with Task(_("Library"), desc) as task: if cofuncid: task.copool(cofuncid) fullpath = expanduser(fullpath) if filter(fullpath.startswith, exclude): continue for path, dnames, fnames in os.walk(fullpath): for filename in fnames: fullfilename = os.path.join(path, filename) if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: fullfilename = os.path.realpath(fullfilename) # skip unknown file extensions if not formats.filter(fullfilename): continue if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: item = self.add_filename(fullfilename, False) if item is not None: added.append(item) if len(added) > 100 or need_added(): self.add(added) added = [] task.pulse() yield if added and need_yield(): yield if added: self.add(added) added = [] task.pulse() yield True def get_content(self): """Return visible and masked items""" items = self.values() 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 self._masked.itervalues(): if item in point: return True else: # Checking a full item. return item in self._masked.get(point, {}).itervalues() 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 self.itervalues(): 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 self._masked.keys() def get_masked(self, mount_point): """List of items for a mount point""" return self._masked.get(mount_point, {}).values() 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 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.5.3/quodlibet/mmkeys/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017253� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/mmkeys/osx.py�������������������������������������������������������������0000644�0001750�0001750�00000012671�12607265240�020433� 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.5.3/quodlibet/mmkeys/pyhook.py����������������������������������������������������������0000644�0001750�0001750�00000002565�12607265240�021134� 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 gi.repository import GLib from ._base import MMKeysBackend, MMKeysAction, MMKeysImportError try: import pyHook except ImportError: raise MMKeysImportError class PyHookBackend(MMKeysBackend): _EVENTS = { "Media_Prev_Track": MMKeysAction.PREV, "Media_Next_Track": MMKeysAction.NEXT, "Media_Stop": MMKeysAction.STOP, "Media_Play_Pause": MMKeysAction.PLAYPAUSE, } def __init__(self, name, callback): self._hm = pyHook.HookManager() self._hm.KeyDown = self._keyboard_cb self._callback = callback self._hm.HookKeyboard() def _keyboard_cb(self, event): def idle_cb(action): if not self._callback: return self._callback(action) return False key = event.Key if key in self._EVENTS: GLib.idle_add(idle_cb, self._EVENTS[key]) # True, pass to other handlers return True def cancel(self): if not self._hm: return self._hm.UnhookKeyboard() self._hm.KeyDown = None self._hm = None self._callback = None �������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/mmkeys/__init__.py��������������������������������������������������������0000644�0001750�0001750�00000005521�12607265240�021355� 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 MMKeysAction, MMKeysImportError def iter_backends(): try: from .gnome import GnomeBackend, MateBackend except MMKeysImportError: pass else: yield GnomeBackend yield MateBackend try: from .keybinder import KeybinderBackend except MMKeysImportError: pass else: yield KeybinderBackend try: from .pyhook import PyHookBackend except MMKeysImportError: pass else: yield PyHookBackend 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_name, window, player): self._backend = None self._window = window self._player = 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.5.3/quodlibet/mmkeys/keybinder.py�������������������������������������������������������0000644�0001750�0001750�00000002477�12607265240�021601� 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.5.3/quodlibet/mmkeys/_base.py�����������������������������������������������������������0000644�0001750�0001750�00000002174�12607265240�020670� 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.5.3/quodlibet/mmkeys/gnome.py�����������������������������������������������������������0000644�0001750�0001750�00000011317�12607265240�020723� 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" 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, "Next": MMKeysAction.NEXT, "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) # FIXME: check if the media-keys plugin is active 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 class MateBackend(GnomeBackend): DBUS_NAME = "org.mate.SettingsDaemon" DBUS_PATH = "/org/mate/SettingsDaemon/MediaKeys" DBUS_IFACE = "org.mate.SettingsDaemon.MediaKeys" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/�����������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017614� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/playlists/�������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�021640� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/playlists/util.py������������������������������������������������0000644�0001750�0001750�00000010204�12646426641�023161� 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 import quodlibet from quodlibet import formats, qltk from quodlibet.qltk.wlw import WaitLoadWindow from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk import Icons from quodlibet.util import escape from quodlibet.util.collection import Playlist from quodlibet.util.path import mkdir, fsdecode, is_fsnative # Directory for playlist files from quodlibet.util.uri import URI PLAYLISTS = os.path.join(quodlibet.get_user_dir(), "playlists") assert is_fsnative(PLAYLISTS) 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 = fsdecode(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("#"): continue else: filenames.append(line) return __parse_playlist(plname, filename, filenames, library) def parse_pls(filename, name="", library=None): plname = fsdecode(os.path.basename( os.path.splitext(filename)[0])) filenames = [] h = file(filename) for line in h: line = line.strip() if not line.lower().startswith("file"): continue else: try: line = line[line.index("=") + 1:].strip() except ValueError: pass else: filenames.append(line) h.close() return __parse_playlist(plname, filename, filenames, library) def __parse_playlist(name, plfilename, files, library): playlist = Playlist.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): try: uri = URI(filename) except ValueError: if os.name == "nt": filename = filename.decode("utf-8", "replace") # 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: if uri.scheme == "file": # URI-encoded local filename. filename = os.path.realpath(os.path.join( os.path.dirname(plfilename), uri.filename)) if library and filename in library: songs.append(library[filename]) else: songs.append(formats.MusicFile(filename)) else: # Who knows! Hand it off to GStreamer. songs.append(formats.remote.RemoteFile(uri)) if win.step(): break win.destroy() playlist.extend(filter(None, songs)) return playlist ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/playlists/__init__.py��������������������������������������������0000644�0001750�0001750�00000000463�12607265240�023742� 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.5.3/quodlibet/browsers/playlists/main.py������������������������������������������������0000644�0001750�0001750�00000050024�12646426641�023134� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2012 - 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 import urllib from gi.repository import Gtk, GLib, Pango, Gdk from tempfile import NamedTemporaryFile from quodlibet.plugins.playlist import PLAYLIST_HANDLER from quodlibet import config from quodlibet.browsers import Browser from quodlibet.formats import AudioFile from quodlibet.qltk.completion import LibraryTagCompletion from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.songlist import SongList from quodlibet.query import Query from quodlibet.util import connect_obj from quodlibet.util.path import get_home_dir from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk.models import ObjectStore, ObjectModelSort from quodlibet.qltk.x import ScrolledWindow, Align, MenuItem from quodlibet.qltk import Icons from .util import * DND_QL, DND_URI_LIST, DND_MOZ_URL = range(3) class PlaylistsBrowser(Browser): name = _("Playlists") accelerated_name = _("_Playlists") keys = ["Playlists", "PlaylistsBrowser"] priority = 2 replaygain_profiles = ["track"] 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): model = klass.__lists.get_model() for playlist in os.listdir(PLAYLISTS): try: playlist = Playlist(PLAYLISTS, Playlist.unquote(playlist), library=library) model.append(row=[playlist]) except EnvironmentError: pass klass._ids = [ library.connect('removed', klass.__removed), library.connect('added', klass.__added), library.connect('changed', klass.__changed), ] @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: 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): PlaylistsBrowser.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): PlaylistsBrowser.changed(playlist) @classmethod def __changed(klass, library, songs): for playlist in klass.playlists(): for song in songs: if song in playlist.songs: PlaylistsBrowser.changed(playlist, refresh=False) break @staticmethod def cell_data(col, render, model, iter, data): render.markup = model[iter][0].format() render.set_property('markup', render.markup) def Menu(self, songs, library, items): songlist = qltk.get_top_parent(self).songlist model, iters = self.__get_selected_songs(songlist) item = qltk.MenuItem(_("_Remove from Playlist"), Icons.LIST_REMOVE) qltk.add_fake_accel(item, "Delete") connect_obj(item, 'activate', self.__remove, iters, model) item.set_sensitive(bool(self.__view.get_selection().get_selected()[1])) items.append([item]) menu = super(PlaylistsBrowser, self).Menu(songs, library, items) return menu def __get_selected_songs(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(lambda m, a, b, data: cmp(m[a][0], m[b][0])) def __init__(self, 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): newpl = qltk.Button(_("_New"), Icons.DOCUMENT_NEW, Gtk.IconSize.MENU) newpl.connect('clicked', self.__new_playlist) importpl = qltk.Button(_("_Import"), Icons.LIST_ADD, Gtk.IconSize.MENU) importpl.connect('clicked', self.__import, library) hb = Gtk.HBox(spacing=6) hb.set_homogeneous(True) hb.pack_start(newpl, True, True, 0) hb.pack_start(importpl, True, True, 0) self.pack_start(Align(hb, left=3, bottom=3), False, True, 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, PlaylistsBrowser.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_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): songlist = qltk.get_top_parent(self).songlist model, iters = self.__get_selected_songs(songlist) self.__remove(iters, model) def __key_pressed(self, widget, event): if qltk.is_accel(event, "Delete"): model, iter = self.__view.get_selection().get_selected() 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.__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) return True return False def __check_current(self, model, path, iter): model, citer = self.__view.get_selection().get_selected() 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): model, iter = self.__view.get_selection().get_selected() if iter: for iter_remove in iters: smodel.remove(iter_remove) playlist = model[iter][0] # Calling playlist.remove_songs(songs) won't remove the right ones # if there are duplicates playlist.clear() playlist.extend([row[0] for row in smodel]) PlaylistsBrowser.changed(playlist) self.activate() 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 = filter(None, map(library.get, 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 = Playlist.fromsongs(PLAYLISTS, songs, library) GLib.idle_add(self._select_playlist, playlist) else: playlist = model[path][0] playlist.extend(songs) PlaylistsBrowser.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 = urllib.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) PlaylistsBrowser.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 iter in filter(lambda i: i, iters): songs += list(model[iter][0]) if tid == 0: qltk.selection_set_songs(sel, songs) else: sel.set_uris([song("~uri") for song in songs]) def _select_playlist(self, playlist): view = self.__view model = view.get_model() for row in model: if row[0] is playlist: view.get_selection().select_iter(row.iter) def __popup_menu(self, view, library): model, itr = view.get_selection().get_selected() if itr is None: return songs = list(model[itr][0]) songs = filter(lambda s: isinstance(s, AudioFile), songs) 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.__render.set_property('editable', True) view.set_cursor(path, view.get_columns()[0], start_editing=True) 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 __focus(self, widget, *args): qltk.get_top_parent(widget).songlist.grab_focus() def __text_parse(self, bar, text): self.activate() def _get_text(self): return self._sb_box.get_text() 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_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) def _get_playlist_songs(self): model, iter = self.__view.get_selection().get_selected() songs = iter and list(model[iter][0]) or [] songs = filter(lambda s: isinstance(s, AudioFile), songs) return songs 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 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.__view.get_selection().get_selected() name = iter and model[iter][0].name or "" config.set("browsers", "playlist", name) text = self._get_text() config.set("browsers", "query_text", text) def __new_playlist(self, activator): playlist = Playlist.new(PLAYLISTS) self.__lists.get_model().append(row=[playlist]) self._select_playlist(playlist) def __start_editing(self, render, editable, path): editable.set_text(self.__lists[path][0].name) def __edited(self, render, path, newname): try: self.__lists[path][0].rename(newname) except ValueError, s: qltk.ErrorMessage( None, _("Unable to rename playlist"), s).run() else: row = self.__lists[path] self.__lists.row_changed(row.path, row.iter) def __import(self, activator, library): filt = lambda fn: fn.endswith(".pls") or fn.endswith(".m3u") from quodlibet.qltk.chooser import FileChooser chooser = FileChooser(self, _("Import Playlist"), filt, get_home_dir()) files = chooser.run() chooser.destroy() for filename in files: if filename.endswith(".m3u"): playlist = parse_m3u(filename, library=library) elif filename.endswith(".pls"): playlist = parse_pls(filename, library=library) else: qltk.ErrorMessage( qltk.get_top_parent(self), _("Unable to import playlist"), _("Quod Libet can only import playlists in the M3U " "and PLS formats.")).run() return PlaylistsBrowser.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 reordered(self, songs): model, iter = self.__view.get_selection().get_selected() playlist = None if iter: playlist = model[iter][0] playlist[:] = songs elif songs: playlist = Playlist.fromsongs(PLAYLISTS, songs) GLib.idle_add(self._select_playlist, playlist) if playlist: PlaylistsBrowser.changed(playlist, refresh=False) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/playlists/menu.py������������������������������������������������0000644�0001750�0001750�00000007040�12646426641�023154� 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, Pango from quodlibet import qltk from quodlibet.browsers.playlists import PlaylistsBrowser 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 class PlaylistMenu(Gtk.Menu): def __init__(self, songs): 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 PlaylistsBrowser.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) 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 } title = GetPlaylistName(qltk.get_top_parent(parent)).run(title) if title is None: return playlist = Playlist.new(PLAYLISTS, title) playlist.extend(songs) PlaylistsBrowser.changed(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) PlaylistsBrowser.changed(playlist) 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.5.3/quodlibet/browsers/collection/������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�021747� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/collection/prefs.py����������������������������������������������0000644�0001750�0001750�00000015306�12607265240�023433� 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.qltk.tagscombobox import TagsComboBoxEntry from quodlibet.qltk.views import BaseView from quodlibet.qltk import Button, Icons from quodlibet.util import connect_obj 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 self.__headers.iterkeys(): 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 self.__headers.iteritems(): 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.5.3/quodlibet/browsers/collection/__init__.py�������������������������������������������0000644�0001750�0001750�00000000504�12501341560�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.5.3/quodlibet/browsers/collection/models.py���������������������������������������������0000644�0001750�0001750�00000016762�12607265240�023606� 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.pattern import XMLFromPattern from quodlibet.util.collection import Album from quodlibet.qltk.models import ObjectTreeStore, ObjectModelFilter from quodlibet.qltk.models import ObjectModelSort 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>" UnknownNode = object() MultiNode = object() 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 tree.iteritems(): 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): if model[iter_][0] 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, Album): return {obj} albums = set() for child_iter, value in self.iterrows(iter_): if isinstance(value, Album): albums.add(value) 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, Album): yield value 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, Album): return PAT % obj if isinstance(obj, basestring): 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, Album): return obj 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=[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 tree.iteritems(): _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, Album): # remove albums if obj 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]) 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 sub.itervalues(): _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.5.3/quodlibet/browsers/collection/main.py�����������������������������������������������0000644�0001750�0001750�00000032330�12646426641�023243� 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, GLib, Pango, Gdk from quodlibet import qltk from quodlibet import util from quodlibet import config from quodlibet.browsers.albums import AlbumTagCompletion from quodlibet.browsers import Browser from quodlibet.query import Query 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 (get_scale_factor, get_pbosf_for_pixbuf, set_renderer_from_pbosf, scale, add_border_widget) from quodlibet.qltk.x import ScrolledWindow, Align, SymbolicIconImage from quodlibet.util.collection import Album from quodlibet.util import connect_obj from quodlibet.util.library import background_filter from .models import (CollectionTreeStore, CollectionSortModel, CollectionFilterModel, MultiNode, UnknownNode) 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 sort(model, i1, i2, data): t1, t2 = model[i1][0], model[i2][0] if t1 is None or t2 is None: # FIXME: why? return 0 # FIXME: order this deterministically if t1 is MultiNode or t1 is UnknownNode or \ t2 is MultiNode or t2 is UnknownNode: return -cmp(t1, t2) if not isinstance(t1, Album): return cmp(util.human_sort_key(t1), util.human_sort_key(t2)) a1, a2 = t1, t2 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, sort) 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(album): # XXX: Cache this somewhere else cover = None if not hasattr(album, "_scaled_cover"): scale_factor = get_scale_factor(self) album.scan_cover(scale_factor=scale_factor) if album.cover: s = 25 * scale_factor cover = scale(album.cover, (s, s)) album._scaled_cover = cover else: cover = album._scaled_cover return 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: cover = get_scaled_cover(album) if cover: round_ = config.getboolean("albumart", "round") cover = add_border_widget( cover, view, cell, round=round_) pbosf = get_pbosf_for_pixbuf(self, cover) set_renderer_from_pbosf(cell, pbosf) 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)) search = SearchBarBox(completion=AlbumTagCompletion(), accel_group=self.accelerators) search.connect('query-changed', self.__update_filter) 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, Album): return check_album(obj) 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], Album): 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 = filter(None, [self.__albums.get(k) for k in album_keys]) 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.5.3/quodlibet/browsers/media.py���������������������������������������������������������0000644�0001750�0001750�00000050306�12607265240�021237� 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.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 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) == unicode: 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) == unicode: 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.5.3/quodlibet/browsers/empty.py���������������������������������������������������������0000644�0001750�0001750�00000004567�12607265240�021326� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2013 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.browsers import Browser from quodlibet.query import Query from quodlibet.qltk.songlist import SongList class EmptyBar(Browser): """A browser that the user only interacts with indirectly, via the Filter menu. The VBox remains empty.""" name = _("Disable Browser") accelerated_name = _("_Disable Browser") keys = ["Disabled", "EmptyBar"] priority = 0 is_empty = True 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(EmptyBar, self).__init__() self._text = u"" self._query = None self._library = library def active_filter(self, song): if self._query is not None: return self._query.search(song) else: return True def filter_text(self, text): self._text = text self.activate() def get_filter_text(self): return self._text def save(self): config.set("browsers", "query_text", self._text.encode('utf-8')) def restore(self): try: text = config.get("browsers", "query_text") except Exception: return self._text = text def finalize(self, restore): config.set("browsers", "query_text", "") def _get_songs(self): try: self._query = Query(self._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: GLib.idle_add(self.songs_selected, songs) def can_filter_text(self): return True def unfilter(self): self.filter_text("") browsers = [EmptyBar] �����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/__init__.py������������������������������������������������������0000644�0001750�0001750�00000005257�12646426641�021733� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 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 quodlibet from quodlibet import util 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 `browers` 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 = os.path.dirname(__file__) load_pyc = util.is_windows() or util.is_osx() modules = load_dir_modules(this_dir, package=__package__, load_compiled=load_pyc) user_dir = os.path.join(quodlibet.get_user_dir(), "browsers") if os.path.isdir(user_dir): modules += load_dir_modules(user_dir, package="quodlibet.fake.browsers", load_compiled=load_pyc) for browser in modules: try: browsers.extend(browser.browsers) except AttributeError: print_w("%r doesn't contain any browsers." % browser.__name__) def is_browser(Kind): return isinstance(Kind, type) and issubclass(Kind, Browser) browsers = filter(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.5.3/quodlibet/browsers/paned/�����������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020703� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/paned/prefs.py���������������������������������������������������0000644�0001750�0001750�00000015564�12646426641�022404� 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 from quodlibet import util from quodlibet import qltk 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 from quodlibet.util import connect_obj from .util import get_headers, save_headers class PatternEditor(Gtk.VBox): PRESETS = [ ["genre", "~people", "album"], ["~people", "album"], ] COMPLETION = ["genre", "grouping", "~people", "artist", "album", "~year"] 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) cb = TagsComboBoxEntry(self.COMPLETION) 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 self.__headers.iterkeys(): 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 self.__headers.iteritems(): 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() apply_ = Button(_("_Apply")) connect_obj(apply_, "clicked", self.__apply, editor, browser, 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) cancel.grab_focus() self.get_child().show_all() def __apply(self, editor, browser, close): if editor.headers != get_headers(): save_headers(editor.headers) browser.set_all_panes() if close: self.destroy() ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/paned/util.py����������������������������������������������������0000644�0001750�0001750�00000005550�12607265240�022225� 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.pattern import XMLFromMarkupPattern as XMLFromPattern from quodlibet.pattern import pattern_from_markup 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 = 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(pattern_from_markup(cat), esc=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): format = lambda song: [unicode(f_round(song(cat)))] 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: unicode(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.5.3/quodlibet/browsers/paned/__init__.py������������������������������������������������0000644�0001750�0001750�00000000457�12607265240�023010� 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.5.3/quodlibet/browsers/paned/models.py��������������������������������������������������0000644�0001750�0001750�00000024566�12607265240�022543� 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 util from quodlibet.qltk.models import ObjectStore from quodlibet.util.collection import Collection class BaseEntry(Collection): def __init__(self, key=None, songs=None): super(BaseEntry, self).__init__() self.songs = set(songs or []) self.key = key 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, songs=None): super(SongsEntry, self).__init__(key, songs) 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__("", 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 = {} self.__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] = filter(None, 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 set(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: keys = self.get_format_keys(song) if not keys: unknown.songs.add(song) for key in keys: if key in collection: collection[key][0].songs.add(song) else: entry = SongsEntry(key) collection[key] = (entry, human_sort(key)) entry.songs.add(song) items = sorted(collection.iteritems(), 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) 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) = items.pop(-1) if key == entry.key: entry.songs |= val.songs entry.finalize() self.row_changed(self.get_path(iter_), iter_) key = None elif sort_key < human_sort(entry.key): self.insert_before(iter_, row=[val]) key = None # the last one failed, add it again if key: items.append((key, (val, sort_key))) # insert the left over songs if items: entries = [] for key, (val, srt) 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)) if entry.key in keys: 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 set(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.5.3/quodlibet/browsers/paned/main.py����������������������������������������������������0000644�0001750�0001750�00000023231�12646426641�022177� 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 # # This program is free software; you can redistribute 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.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 .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.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 panes = self.main_box.get_child1() if do_wide: self.main_box.props.orientation = hor panes.props.orientation = ver else: self.main_box.props.orientation = ver panes.props.orientation = hor 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): hbox = self.main_box.get_child1() if hbox: hbox.destroy() hbox = Gtk.HBox(spacing=6) hbox.set_homogeneous(True) # 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]) self._panes.insert(0, pane) self._panes.pop() # remove self for pane in self._panes: pane.connect('row-activated', lambda *x: self.songs_activated()) sw = ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(pane) hbox.pack_start(sw, True, True, 0) self.main_box.pack1(hbox, True, False) hbox.show_all() 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 __get_filter_pane(self, key): """Get the best pane for filtering etc.""" canditates = [] for pane in self._panes: if (key in pane.tags or (key in PEOPLE and "~people" in pane.tags)): canditates.append((len(pane.tags), pane)) canditates.sort() return (canditates and canditates[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.set("browsers", "query_text", self._get_text()) selected = [] for pane in self._panes: selected.append(pane.get_restore_string()) to_save = u"\n".join(selected).encode("utf-8") config.set("browsers", "pane_selection", to_save) def restore(self): try: text = config.get("browsers", "query_text") except config.Error: pass else: self._set_text(text) selected = config.get("browsers", "pane_selection") if not selected: return try: selected = selected.decode("utf-8") except UnicodeDecodeError: return for pane, string in zip(self._panes, selected.split(u"\n")): pane.parse_restore_string(string) def finalize(self, restored): config.set("browsers", "query_text", "") if not restored: self.fill_panes() def fill(self, songs): GLib.idle_add(self.songs_selected, list(songs)) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/paned/pane.py����������������������������������������������������0000644�0001750�0001750�00000021162�12646426641�022177� 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, TreeViewColumn from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk import is_accel from quodlibet.util import connect_obj 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 = TreeViewColumn(self.config.title) 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 = selection.connect('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, unicode) 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(key.decode('utf-8')) 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.get_selection().handler_block(self.__sig) def uninhibit(self): """Uninhibit selection change events and song propagation""" self.get_selection().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.5.3/quodlibet/browsers/search.py��������������������������������������������������������0000644�0001750�0001750�00000010625�12607265240�021425� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2013 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.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): """Like EmptyBar, but the user can also enter a query manually""" 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.set("browsers", "query_text", self._get_text()) def restore(self): try: text = config.get("browsers", "query_text") except config.Error: return 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.5.3/quodlibet/browsers/filesystem.py����������������������������������������������������0000644�0001750�0001750�00000021111�12646426641�022343� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 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 # 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 quodlibet import config from quodlibet import formats from quodlibet import qltk from quodlibet.browsers import Browser 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.uri import URI 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 = filter(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({URI.frompath(dir) for dir in dirs}) print_d("Directories to drop: %s" % [u.filename for u in uris]) 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, first)): 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, 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.5.3/quodlibet/browsers/_base.py���������������������������������������������������������0000644�0001750�0001750�00000021341�12607265240�021226� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 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 random from gi.repository import Gtk, GObject from quodlibet import app from quodlibet import util from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.util.library import background_filter 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, library.itervalues()) tags = set() for song in songs: tags.update(song.list(tag)) return list(tags) return 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 = set() values.update([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): """Browers 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, ()), } 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)""" is_empty = False """Whether the browser is usable or just the dummy/disabled one""" 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 reorderd the whole list of songs is passed to reordered(). """ def reordered(self, songs): """In case can_reorder is True and the song list gets reorderd 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 statusbar(self, i): return ngettext( "%(count)d song (%(time)s)", "%(count)d songs (%(time)s)", i) replaygain_profiles = None """Replay Gain profiles for this browser.""" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/iradio.py��������������������������������������������������������0000644�0001750�0001750�00000074024�12646426641�021441� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011 Joe Wreschnig, 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 bz2 import urllib2 import urllib import itertools from gi.repository import Gtk, GLib, Pango import quodlibet 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.qltk.getstring import GetStringDialog from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.notif import Task from quodlibet.qltk import Icons from quodlibet.util import copool, connect_destroy, sanitize_tags, connect_obj from quodlibet.util.string import decode, encode from quodlibet.util.uri import URI 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 STATION_LIST_URL = \ "http://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("%s=%s" % (tag, encode(value))) return "\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: qltk.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""" irfs = [] if isinstance(uri, unicode): uri = uri.encode('utf-8') if uri.lower().endswith(".pls") or uri.lower().endswith(".m3u"): try: sock = urllib.urlopen(uri) except EnvironmentError as e: encoding = util.get_locale_encoding() try: err = e.strerror.decode(encoding, 'replace') except (TypeError, AttributeError): err = e.strerror[1].decode(encoding, 'replace') qltk.ErrorMessage(None, _("Unable to add station"), err).run() return [] 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, err: qltk.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 = urllib2.urlopen(STATION_LIST_URL) except urllib2.URLError: 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, str): 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() try: URI(line) except ValueError: pass else: 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) try: self.set_show_close_button(True) except AttributeError: # < gtk3.10 action = self.get_action_area() close_button = CloseButton() close_button.show() self.add_action_widget(close_button, Gtk.ResponseType.CLOSE) # FIXME: doesn't seem to have any effect action.set_child_packing( close_button, False, True, 2, Gtk.PackType.START) 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 groups.iteritems(): 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 self.__fav_stations.iterkeys(): stations.pop(fav, None) # separate o, n = set(self.__stations.iterkeys()), 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 new.iterkeys() 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 not irfs: qltk.ErrorMessage( None, _("No stations found"), _("No Internet radio stations were found at %s.") % util.escape(uri)).run() return irfs = filter(lambda station: station not in self.__fav_stations, irfs) if not irfs: qltk.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.get("browsers", "query_text").decode("utf-8") 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().encode("utf-8") config.set("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 statusbar(self, i): return ngettext("%(count)d station", "%(count)d stations", i) from quodlibet import app if not app.player or app.player.can_play_uri("http://"): browsers = [InternetRadio] else: browsers = [] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/audiofeeds.py����������������������������������������������������0000644�0001750�0001750�00000041241�12646426641�022275� 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 cPickle as pickle import os import sys import threading import time from gi.repository import Gtk, GLib, Pango, Gdk import quodlibet from quodlibet import config from quodlibet import formats from quodlibet import qltk from quodlibet import util from quodlibet.browsers import Browser 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 from quodlibet.util.path import get_home_dir from quodlibet.qltk.x import ScrolledWindow, Align, Button, MenuItem 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: doc = feedparser.parse(self.uri) except: return False try: album = doc.channel.title except AttributeError: 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() 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.encode('ascii', 'replace') try: size = enclosure.length except AttributeError: size = 0 entries.append((uri, entry, size)) uris.add(uri) break except AttributeError: pass except AttributeError: pass for entry in list(self): if entry["~uri"] not in uris: self.remove(entry) else: uris.remove(entry["~uri"]) 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: pass else: self.insert(0, song) self.__lastgot = time.time() return bool(uris) 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): uri = super(AddFeedDialog, self).run() if uri: return Feed(uri.encode('ascii', 'replace')) else: 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 __last_folder = get_home_dir() 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] f = file(FEEDS, "wb") pickle.dump(feeds, f, pickle.HIGHEST_PROTOCOL) f.close() @classmethod def init(klass, library): try: feeds = pickle.load(file(FEEDS, "rb")) except (pickle.PickleError, EnvironmentError, EOFError): pass else: for feed in feeds: klass.__feeds.append(row=[feed]) GLib.idle_add(klass.__do_check) @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: songs = filter(lambda s: not s.is_file, songs) uris = [song("~uri") for song in songs] item = qltk.MenuItem(_(u"_Download…"), Icons.NETWORK_WORKGROUP) item.connect('activate', self.__download_many, uris) item.set_sensitive(bool(songs)) items.append([item]) menu = SongsMenu(library, songs, items=items) return menu def __download_many(self, activator, sources): chooser = Gtk.FileChooserDialog( title=_("Download Files"), parent=qltk.get_top_parent(self), action=Gtk.FileChooserAction.CREATE_FOLDER) chooser.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) chooser.add_button(_("_Save"), Gtk.ResponseType.OK) chooser.set_current_folder(self.__last_folder) resp = chooser.run() if resp == Gtk.ResponseType.OK: target = chooser.get_filename() if target: type(self).__last_folder = os.path.dirname(target) 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) chooser.destroy() def __download(self, activator, source): chooser = Gtk.FileChooserDialog( title=_("Download File"), parent=qltk.get_top_parent(self), action=Gtk.FileChooserAction.SAVE) chooser.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) chooser.add_button(_("_Save"), Gtk.ResponseType.OK) chooser.set_current_folder(self.__last_folder) name = os.path.basename(source) if name: chooser.set_current_name(name) resp = chooser.run() if resp == Gtk.ResponseType.OK: target = chooser.get_filename() if target: type(self).__last_folder = os.path.dirname(target) DownloadWindow.download(source, target, self) chooser.destroy() 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', map, model.remove, map(model.get_iter, paths)) menu.append(refresh) menu.append(delete) menu.show_all() menu.connect('selection-done', lambda m: m.destroy()) # XXX: keep the menu arround 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 = filter(Feed.parse, feeds) AudioFeeds.changed(changed) 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 = [] try: import feedparser except ImportError: print_w(_("Could not import %s. Audio Feeds browser disabled.") % "python-feedparser") else: from quodlibet import app 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.5.3/quodlibet/browsers/albums/����������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�021077� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/albums/prefs.py��������������������������������������������������0000644�0001750�0001750�00000012005�12645176434�022564� 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 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, GLib, Pango from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet.formats import PEOPLE from quodlibet.util import format_rating, connect_obj from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk.textedit import PatternEditBox from quodlibet.qltk import Button, Icons from quodlibet.pattern import XMLFromMarkupPattern EMPTY = _("Songs not in an album") PATTERN = """[b]<album|<album>|%s>[/b]<date| (<date>)> [small]<~discs|<~discs> - ><~tracks> - <~long-length>[/small] <~people>""" % EMPTY class FakeAlbum(dict): 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", ", ") PEOPLE _SOME_PEOPLE = "\n".join([util.tag("artist"), util.tag("performer"), util.tag("composer"), util.tag("arranger"), ]) class Preferences(qltk.UniqueWindow): _EXAMPLE_ALBUM = FakeAlbum({ "date": "2010-10-31", "~length": util.format_time_display(6319), "~long-length": util.format_time_long(6319), "~tracks": ngettext("%d track", "%d tracks", 5) % 5, "~discs": ngettext("%d disc", "%d discs", 2) % 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._EXAMPLE_ALBUM["~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) 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(PATTERN) edit.text = browser._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) f = qltk.Frame(_("Album Display"), child=vbox) box.pack_start(f, 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() def __set_pattern(self, apply, edit, browser): browser.refresh_pattern(edit.text) def __preview_pattern(self, edit, label): try: text = XMLFromMarkupPattern(edit.text) % self._EXAMPLE_ALBUM 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.5.3/quodlibet/browsers/albums/__init__.py�����������������������������������������������0000644�0001750�0001750�00000000570�12607265240�023200� 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.5.3/quodlibet/browsers/albums/models.py�������������������������������������������������0000644�0001750�0001750�00000005643�12607265240�022732� 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.qltk.models import ObjectStore, ObjectModelFilter from quodlibet.qltk.models import ObjectModelSort class AlbumModelMixin(object): def get_albums(self, paths): values = [self.get_value(self.get_iter(p), 0) for p in paths] try: values.remove(None) except ValueError: return values else: return [v for v in self.itervalues() if v] def get_album(self, iter_): return self.get_value(iter_, 0) 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=[None]) self.append_many(albums.itervalues()) 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(added) self._update_all() def _remove_albums(self, library, removed): removed_albums = removed.copy() iters_remove = [] for iter_, value in self.iterrows(): if value is not None and value in removed_albums: removed_albums.remove(value) 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_, value in self.iterrows(): if value is not None and value in changed_albums: changed_albums.remove(value) 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) for p in paths) return None in values class AlbumSortModel(ObjectModelSort, AlbumModelMixin): pass ���������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/browsers/albums/main.py���������������������������������������������������0000644�0001750�0001750�00000063662�12646426641�022407� 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 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 .prefs import Preferences, PATTERN from .models import AlbumModel, AlbumFilterModel, AlbumSortModel import quodlibet from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet.browsers import Browser from quodlibet.query import Query from quodlibet.pattern import XMLFromMarkupPattern 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 from quodlibet.util.collection import Album from quodlibet.qltk.cover import get_no_cover_pixbuf from quodlibet.qltk.image import (get_pbosf_for_pixbuf, get_scale_factor, set_renderer_from_pbosf, add_border_widget) PATTERN_FN = os.path.join(quodlibet.get_user_dir(), "album_pattern") 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): # All albums should stay at the top if (a1 and a2) is None: return cmp(a1, a2) # 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): if (a1 and a2) is None: return cmp(a1, a2) 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): if (a1 and a2) is None: return cmp(a1, a2) 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): if (a1 and a2) is None: return cmp(a1, a2) 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): if (a1 and a2) is None: return cmp(a1, a2) 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 = 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): __model = None __last_render = None __last_render_pb = None 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): try: klass._pattern_text = file(PATTERN_FN).read().rstrip() except EnvironmentError: klass._pattern_text = PATTERN klass._pattern = XMLFromMarkupPattern(klass._pattern_text) @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_pattern(klass, pattern_text): if pattern_text == klass._pattern_text: return klass._pattern_text = pattern_text klass._pattern = XMLFromMarkupPattern(pattern_text) klass.__model.refresh_all() pattern_fn = PATTERN_FN f = file(pattern_fn, "w") f.write(pattern_text + "\n") f.close() @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 of pixbuf representing a missing cover""" cover_size = Album.COVER_SIZE scale_factor = get_scale_factor(self) pb = get_no_cover_pixbuf(cover_size, cover_size, scale_factor) return get_pbosf_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(Album.COVER_SIZE + 12) render.set_property('height', Album.COVER_SIZE + 8) render.set_property('width', Album.COVER_SIZE + 8) def cell_data_pb(column, cell, model, iter_, no_cover): album = model.get_album(iter_) if album is None: pixbuf = None elif album.cover: pixbuf = album.cover round_ = config.getboolean("albumart", "round") pixbuf = add_border_widget( pixbuf, self.view, cell, round_) pixbuf = get_pbosf_for_pixbuf(self, pixbuf) # don't cache, too much state has an effect on the result self.__last_render_pb = None else: pixbuf = no_cover if self.__last_render_pb == pixbuf: return self.__last_render_pb = pixbuf set_renderer_from_pbosf(cell, pixbuf) 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>" % _("All Albums") text += "\n" + ngettext("%d album", "%d albums", len(model) - 1) % (len(model) - 1) markup = text else: markup = AlbumList._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 = connect_destroy( view.get_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) 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) self.show_all() 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_): album = model.get_album(iter_) return album is not None and not album.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)) album = model.get_album(iter_) scale_factor = get_scale_factor(self) album.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 = key.decode('utf-8').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): albums = self.__get_selected_albums() for album in albums: album.scan_cover(True) self._refresh_albums(albums) 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].key for row in model if row[0]] def filter_albums(self, values): view = self.view self.__inhibit() changed = view.select_by_func(lambda r: r[0] and r[0].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.get_selection().handler_block(self.__sig) def __uninhibit(self): self.view.get_selection().handler_unblock(self.__sig) def restore(self): text = config.get("browsers", "query_text").decode("utf-8") 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.get("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] 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] and r[0].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.set("browsers", "albums", conf) text = self.__search.get_text().encode("utf-8") config.set("browsers", "query_text", text) def __update_songs(self, selection): songs = self.__get_selected_songs(sort=False) self.songs_selected(songs) ������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/const.py������������������������������������������������������������������0000644�0001750�0001750�00000010250�12646427612�017440� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Constants used in various parts of QL, mostly strings. import sys import os class Version(tuple): """Represent the version of a dependency as a tuple""" def __new__(cls, *args): # Support tuple or varargs instantiation value = args[0] if len(args) == 1 else args return tuple.__new__(Version, value) def human_version(self): return ".".join(map(str, self)) def __str__(self): return self.human_version() class MinVersions(object): """Dependency requirements for Quod Libet / Ex Falso""" PYTHON = Version(2, 7) MUTAGEN = Version(1, 27) VERSION_TUPLE = Version(3, 5, 3) VERSION = str(VERSION_TUPLE) # entry point for the user guide / wiki BRANCH_NAME = "quodlibet-3.5" 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" # 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" MAIN_AUTHORS = """\ Joe Wreschnig Michael Urman Iñigo Serna Steven Robertson Christoph Reiter Nick Boultbee""".split("\n") # about dialog, --version etc. WEBSITE = "https://quodlibet.readthedocs.org/" COPYRIGHT = """Copyright © 2004-2015 %s...""" % ", ".join(MAIN_AUTHORS) AUTHORS = sorted("""\ Alexandre Passos Alexey Bobyakov Alex Geoffrey Smith Anders Carlsson Andreas Bombe Anton Shestakov Ari Pollak Aymeric Mansoux Bastian Kleineidam Bastien Gorissen Benjamin Boutier Ben Zeigler Bruno Bergot Carlo Teubner Christine Spang Christoph Reiter David Kågedal David Schneider Decklin Foster Eduardo Gonzalez Eric Casteleijn Erich Schubert Eric Le Lay Federico Pelloni Felix Krull Florian Demmer Guillaume Chazarain Hans Scholze Iñigo Serna Jacob Lee 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 Vasiliy Faronov Zack Weinberg """.strip().split("\n")) TRANSLATORS = sorted(""" 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, gl_ES, eu, 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) 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) """.strip().splitlines()) ARTISTS = sorted("""\ 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.5.3/quodlibet/devices/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017370� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/devices/_gpod.py����������������������������������������������������������0000644�0001750�0001750�00000066706�12646426641�021046� 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 """ctypes bindings for libgpod. Similar to the in libgpod included swig bindings except: - Functions for pixbuf handling are missing (itdb_artwork_*) - Swig wrappers (sw_*) from the swig bindings are mostly missing These are needed since the original bindings depend on pygtk which breaks in combination with pygobject. """ from quodlibet.util import load_library from ctypes import * try: _glib = load_library(["libglib-2.0.so.0", "libglib-2.0.so", "glib-2.0"])[0] except OSError: raise ImportError("Couldn't find libglib-2.0") try: _lib = load_library(["libgpod.so.4"])[0] except OSError: raise ImportError("Couldn't find libgpod") gchar_p = c_char_p gchar = c_char guchar = c_uint8 guchar_p = POINTER(c_uint8) guint = c_uint gpointer = c_void_p gint32 = c_int32 guint32 = c_uint32 gint = c_int gboolean = c_bool gint8 = c_int8 guint8 = c_uint8 gint16 = c_int16 guint16 = c_uint16 gint64 = c_int64 guint64 = c_uint64 gfloat = c_float gdouble = c_double gshort = c_short gushort = c_ushort glong = c_long gulong = c_ulong gsize = c_size_t gconstpointer = c_void_p time_t = c_ulong g_strdup = _glib.g_strdup g_strdup.argtypes = [gchar_p] g_strdup.restype = gpointer g_free = _glib.g_free g_free.argtypes = [gpointer] g_free.restype = None class StructPointerMixin(object): """Access struct fields through the struct pointer""" def _get_type(self, name): """Returns the type of the field""" for n, type_ in self._fields_: if name == n: return type_ else: raise KeyError def __getattr__(self, name): if not self: raise AttributeError("NULL pointer access") return getattr(self.contents, name) def __setattr__(self, name, value): if not self: raise AttributeError("NULL pointer access") if not hasattr(self.contents, name): raise AttributeError("Invalid attribute: %r" % name) # copy c_char_p values and free old ones type_ = self._get_type(name) if type_ is gchar_p: old_value = getattr(self.contents, name) g_free(old_value) value = g_strdup(value) setattr(self.contents, name, value) class GList(Structure): pass class GListPtr(POINTER(GList), StructPointerMixin): _type_ = GList GList._fields_ = [ ("data", gpointer), ("next", GListPtr), ("prev", GListPtr), ] class GTreePtr(gpointer): pass class Enum(guint): def __str__(self): for a in (c for c in dir(self) if c.upper() == c): if getattr(self, a) == self.value: return a return "Unkown" def __repr__(self): return repr(str(self)) def __int__(self): return self.value class Flags(guint): def __str__(self): values = [] for a in (c for c in dir(self) if c.upper() == c): if getattr(self, a) & self.value: values.append(a) return " | ".join(values) or "Unkown" def __repr__(self): return repr(str(self)) def __int__(self): return self.value class IpodGeneration(Enum): (UNKNOWN, FIRST, SECOND, THIRD, FOURTH, PHOTO, MOBILE, MINI_1, MINI_2, SHUFFLE_1, SHUFFLE_2, SHUFFLE_3, NANO_1, NANO_2, NANO_3, NANO_4, VIDEO_1, VIDEO_2, CLASSIC_1, CLASSIC_2, TOUCH_1, IPHONE_1, SHUFFLE_4, TOUCH_2, IPHONE_2, IPHONE_3, CLASSIC_3, NANO_5, TOUCH_3, IPAD_1, IPHONE_4, TOUCH_4, NANO_6) = range(33) class IpodModel(Enum): (INVALID, UNKNOWN, COLOR, COLOR_U2, REGULAR, REGULAR_U2, MINI, MINI_BLUE, MINI_PINK, MINI_GREEN, MINI_GOLD, SHUFFLE, NANO_WHITE, NANO_BLACK, VIDEO_WHITE, VIDEO_BLACK, MOBILE_1, VIDEO_U2, NANO_SILVER, NANO_BLUE, NANO_GREEN, NANO_PINK, NANO_RED, NANO_YELLOW, NANO_PURPLE, NANO_ORANGE, IPHONE_1, SHUFFLE_SILVER, SHUFFLE_PINK, SHUFFLE_BLUE, SHUFFLE_GREEN, SHUFFLE_ORANGE, SHUFFLE_PURPLE, SHUFFLE_RED, CLASSIC_SILVER, CLASSIC_BLACK, TOUCH_SILVER, SHUFFLE_BLACK, IPHONE_WHITE, IPHONE_BLACK, SHUFFLE_GOLD, SHUFFLE_STAINLESS, IPAD) = range(43) class IpodInfo(Structure): _fields_ = [ ("model_number", gchar_p), ("capacity", c_double), ("ipod_model", IpodModel), ("ipod_generation", IpodGeneration), ("musicdirs", guint), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gconstpointer), ("reserved2", gconstpointer), ] class IpodInfoPtr(POINTER(IpodInfo), StructPointerMixin): _type_ = IpodInfo ITDB_SPL_STRING_MAXLEN = 255 ITDB_SPL_DATE_IDENTIFIER = 0x2dae2dae2dae2dae class SPLMatch(Enum): AND = 0 OR = 1 class LimitType(Enum): MINUTES = 0x01 MB = 0x02 SONGS = 0x03 HOURS = 0x04 GB = 0x05 class LimitSort(Enum): RANDOM = 0x02 SONG_NAME = 0x03 ALBUM = 0x04 ARTIST = 0x05 GENRE = 0x07 MOST_RECENTLY_ADDED = 0x10 LEAST_RECENTLY_ADDED = 0x80000010 MOST_OFTEN_PLAYED = 0x14 LEAST_OFTEN_PLAYED = 0x80000014 MOST_RECENTLY_PLAYED = 0x15 LEAST_RECENTLY_PLAYED = 0x80000015 HIGHEST_RATING = 0x17 LOWEST_RATING = 0x80000017 class SPLAction(Enum): IS_INT = 0x00000001 IS_GREATER_THAN = 0x00000010 IS_LESS_THAN = 0x00000040 IS_IN_THE_RANGE = 0x00000100 IS_IN_THE_LAST = 0x00000200 BINARY_AND = 0x00000400 BINARY_UNKNOWN1 = 0x00000800 IS_STRING = 0x01000001 CONTAINS = 0x01000002 STARTS_WITH = 0x01000004 ENDS_WITH = 0x01000008 IS_NOT_INT = 0x02000001 IS_NOT_GREATER_THAN = 0x02000010 IS_NOT_LESS_THAN = 0x02000040 IS_NOT_IN_THE_RANGE = 0x02000100 IS_NOT_IN_THE_LAST = 0x02000200 NOT_BINARY_AND = 0x02000400 BINARY_UNKNOWN2 = 0x02000800 IS_NOT = 0x03000001 DOES_NOT_CONTAIN = 0x03000002 DOES_NOT_START_WITH = 0x03000004 DOES_NOT_END_WITH = 0x03000008 class SPLFieldType(Enum): (STRING, INT, BOOLEAN, DATE, PLAYLIST, UNKNOWN, BINARY_AND) = range(1, 8) class SPLActionType(Enum): (STRING, INT, DATE, RANGE_INT, RANGE_DATE, INTHELAST, PLAYLIST, NONE, INVALID, UNKNOWN, BINARY_AND) = range(1, 12) class SPLActionLast(Enum): DAYS_VALUE = 86400 WEEKS_VALUE = 604800 MONTHS_VALUE = 2628000 class SPLField(Enum): SONG_NAME = 0x02 ALBUM = 0x03 ARTIST = 0x04 BITRATE = 0x05 SAMPLE_RATE = 0x06 YEAR = 0x07 GENRE = 0x08 KIND = 0x09 DATE_MODIFIED = 0x0a TRACKNUMBER = 0x0b SIZE = 0x0c TIME = 0x0d COMMENT = 0x0e DATE_ADDED = 0x10 COMPOSER = 0x12 PLAYCOUNT = 0x16 LAST_PLAYED = 0x17 DISC_NUMBER = 0x18 RATING = 0x19 COMPILATION = 0x1f BPM = 0x23 GROUPING = 0x27 PLAYLIST = 0x28 PURCHASE = 0x29 DESCRIPTION = 0x36 CATEGORY = 0x37 PODCAST = 0x39 VIDEO_KIND = 0x3c TVSHOW = 0x3e SEASON_NR = 0x3f SKIPCOUNT = 0x44 LAST_SKIPPED = 0x45 ALBUMARTIST = 0x47 SORT_SONG_NAME = 0x4e SORT_ALBUM = 0x4f SORT_ARTIST = 0x50 SORT_ALBUMARTIST = 0x51 SORT_COMPOSER = 0x52 SORT_TVSHOW = 0x53 ALBUM_RATING = 0x5a class SPLPref(Structure): _fields_ = [ ("liveupdate", guint8), ("checkrules", guint8), ("checklimits", guint8), ("limittype", guint32), ("limitsort", guint32), ("limitvalue", guint32), ("matchcheckedonly", guint8), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ] class SPLRule(Structure): _fields_ = [ ("field", guint32), ("action", guint32), ("string", gchar_p), ("fromvalue", guint64), ("fromdate", guint64), ("fromunits", guint64), ("tovalue", guint64), ("todate", gint64), ("tounits", guint64), ("unk052", guint32), ("unk056", guint32), ("unk060", guint32), ("unk064", guint32), ("unk068", guint32), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ] class SPLRulePtr(POINTER(SPLRule), StructPointerMixin): _type_ = SPLRule class SPLRules(Structure): _fields_ = [ ("unk004", guint32), ("match_operator", guint32), ("rules", GListPtr), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ] class Chapter(Structure): _fields_ = [ ("startpos", guint32), ("chaptertitle", gchar_p), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ] class ChapterPtr(POINTER(Chapter), StructPointerMixin): _type_ = Chapter class Chapterdata(Structure): _fields_ = [ ("chapters", GListPtr), ("unk024", guint32), ("unk028", guint32), ("unk032", guint32), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ] class ChapterdataPtr(POINTER(Chapterdata), StructPointerMixin): _type_ = Chapterdata ITDB_RATING_STEP = 20 class ThumbPtr(c_void_p): pass UserDataDuplicateFunc = CFUNCTYPE(gpointer, gpointer) UserDataDestroyFunc = CFUNCTYPE(None, gpointer) class Artwork(Structure): _fields_ = [ ("thumbnail", ThumbPtr), ("id", guint32), ("dbid", guint64), ("unk028", gint32), ("rating", guint32), ("unk036", gint32), ("creation_date", time_t), ("digitized_date", time_t), ("artwork_size", guint32), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ("usertype", guint64), ("userdata", gpointer), ("userdata_duplicate", UserDataDuplicateFunc), ("userdata_destroy", UserDataDestroyFunc), ] class ArtworkPtr(POINTER(Artwork), StructPointerMixin): _type_ = Artwork class PhotoDB(Structure): _fields_ = [ ("photos", GListPtr), ("photoalbums", GListPtr), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ("usertype", guint64), ("userdata", gpointer), ("userdata_duplicate", UserDataDuplicateFunc), ("userdata_destroy", UserDataDestroyFunc), ] class PhotoDBPtr(POINTER(PhotoDB), StructPointerMixin): _type_ = PhotoDB class DevicePtr(c_void_p): pass class iTunesDB_PrivatePtr(c_void_p): pass class iTunesDB(Structure): _fields_ = [ ("tracks", GListPtr), ("playlists", GListPtr), ("filename", gchar_p), ("device", DevicePtr), ("version", guint32), ("id", guint64), ("tzoffset", gint32), ("reserved_int2", gint32), ("priv", iTunesDB_PrivatePtr), ("reserved2", gpointer), ("usertype", guint64), ("userdata", gpointer), ("userdata_duplicate", UserDataDuplicateFunc), ("userdata_destroy", UserDataDestroyFunc), ] class iTunesDBPtr(POINTER(iTunesDB), StructPointerMixin): _type_ = iTunesDB class PhotoAlbum(Structure): _fields_ = [ ("photodb", PhotoDBPtr), ("name", gchar_p), ("members", GListPtr), ("album_type", guint8), ("playmusic", guint8), ("repeat", guint8), ("random", guint8), ("show_titles", guint8), ("transition_direction", guint8), ("slide_duration", gint32), ("transition_duration", gint32), ("song_id", gint64), ("unk024", gint32), ("unk028", gint16), ("unk044", gint32), ("unk048", gint32), ("album_id", gint32), ("prev_album_id", gint32), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved1", gpointer), ("reserved2", gpointer), ("usertype", guint64), ("userdata", gpointer), ("userdata_duplicate", UserDataDuplicateFunc), ("userdata_destroy", UserDataDestroyFunc), ] class PhotoAlbumPtr(POINTER(PhotoAlbum), StructPointerMixin): _type_ = PhotoAlbum class Playlist_PrivatePtr(c_void_p): pass class Playlist(Structure): _fields_ = [ ("itdb", iTunesDBPtr), ("name", gchar_p), ("type", guint8), ("flag1", guint8), ("flag2", guint8), ("flag3", guint8), ("num", gint), ("members", GListPtr), ("is_spl", gboolean), ("timestamp", time_t), ("id", guint64), ("sortorder", guint32), ("podcastflag", guint32), ("splpref", SPLPref), ("splrules", SPLRules), ("reserved100", gpointer), ("reserved101", gpointer), ("reserved_int1", gint32), ("reserved_int2", gint32), ("*priv", Playlist_PrivatePtr), ("reserved2", gpointer), ("usertype", guint64), ("userdata", gpointer), ("userdata_duplicate", UserDataDuplicateFunc), ("userdata_destroy", UserDataDestroyFunc), ] class PlaylistPtr(POINTER(Playlist), StructPointerMixin): _type_ = Playlist class PlaylistSortOrder(Enum): MANUAL = 1 TITLE = 3 ALBUM = 4 ARTIST = 5 BITRATE = 6 GENRE = 7 FILETYPE = 8 TIME_MODIFIED = 9 TRACK_NR = 10 SIZE = 11 TIME = 12 YEAR = 13 SAMPLERATE = 14 COMMENT = 15 TIME_ADDED = 16 EQUALIZER = 17 COMPOSER = 18 PLAYCOUNT = 20 TIME_PLAYED = 21 CD_NR = 22 RATING = 23 RELEASE_DATE = 24 BPM = 25 GROUPING = 26 CATEGORY = 27 DESCRIPTION = 28 class Mediatype(Flags): AUDIO = 1 << 0 MOVIE = 1 << 1 PODCAST = 1 << 2 AUDIOBOOK = 1 << 3 MUSICVIDEO = 1 << 5 TVSHOW = 1 << 6 RINGTONE = 1 << 14 RENTAL = 1 << 15 ITUNES_EXTRA = 1 << 16 MEMO = 1 << 20 ITUNES_U = 1 << 21 EPUB_BOOK = 1 << 22 PDF_BOOK = 1 << 23 class Track_PrivatePtr(c_void_p): pass class Track(Structure): _fields_ = [ ("itdb", iTunesDBPtr), ("title", gchar_p), ("ipod_path", gchar_p), ("album", gchar_p), ("artist", gchar_p), ("genre", gchar_p), ("filetype", gchar_p), ("comment", gchar_p), ("category", gchar_p), ("composer", gchar_p), ("grouping", gchar_p), ("description", gchar_p), ("podcasturl", gchar_p), ("podcastrss", gchar_p), ("chapterdata", ChapterdataPtr), ("subtitle", gchar_p), ("tvshow", gchar_p), ("tvepisode", gchar_p), ("tvnetwork", gchar_p), ("albumartist", gchar_p), ("keywords", gchar_p), ("sort_artist", gchar_p), ("sort_title", gchar_p), ("sort_album", gchar_p), ("sort_albumartist", gchar_p), ("sort_composer", gchar_p), ("sort_tvshow", gchar_p), ("id", guint32), ("size", guint32), ("tracklen", gint32), ("cd_nr", gint32), ("cds", gint32), ("track_nr", gint32), ("tracks", gint32), ("bitrate", gint32), ("samplerate", guint16), ("samplerate_low", guint16), ("year", gint32), ("volume", gint32), ("soundcheck", guint32), ("time_added", time_t), ("time_modified", time_t), ("time_played", time_t), ("bookmark_time", guint32), ("rating", guint32), ("playcount", guint32), ("playcount2", guint32), ("recent_playcount", guint32), ("transferred", gboolean), ("BPM", gint16), ("app_rating", guint8), ("type1", guint8), ("type2", guint8), ("compilation", guint8), ("starttime", guint32), ("stoptime", guint32), ("checked", guint8), ("dbid", guint64), ("drm_userid", guint32), ("visible", guint32), ("filetype_marker", guint32), ("artwork_count", guint16), ("artwork_size", guint32), ("samplerate2", c_float), ("unk126", guint16), ("unk132", guint32), ("time_released", time_t), ("unk144", guint16), ("explicit_flag", guint16), ("unk148", guint32), ("unk152", guint32), ("skipcount", guint32), ("recent_skipcount", guint32), ("last_skipped", guint32), ("has_artwork", guint8), ("skip_when_shuffling", guint8), ("remember_playback_position", guint8), ("flag4", guint8), ("dbid2", guint64), ("lyrics_flag", guint8), ("movie_flag", guint8), ("mark_unplayed", guint8), ("unk179", guint8), ("unk180", guint32), ("pregap", guint32), ("samplecount", guint64), ("unk196", guint32), ("postgap", guint32), ("unk204", guint32), ("mediatype", guint32), ("season_nr", guint32), ("episode_nr", guint32), ("unk220", guint32), ("unk224", guint32), ("unk228", guint32), ("unk232", guint32), ("unk236", guint32), ("unk240", guint32), ("unk244", guint32), ("gapless_data", guint32), ("unk252", guint32), ("gapless_track_flag", guint16), ("gapless_album_flag", guint16), ("obsolete", guint16), ("artwork", ArtworkPtr), ("mhii_link", guint32), ("reserved_int1", gint32), ("reserved_int2", gint32), ("reserved_int3", gint32), ("reserved_int4", gint32), ("reserved_int5", gint32), ("reserved_int6", gint32), ("priv", Track_PrivatePtr), ("reserved2", gpointer), ("reserved3", gpointer), ("reserved4", gpointer), ("reserved5", gpointer), ("reserved6", gpointer), ("usertype", guint64), ("userdata", gpointer), ("userdata_duplicate", UserDataDuplicateFunc), ("userdata_destroy", UserDataDestroyFunc), ] class TrackPtr(POINTER(Track), StructPointerMixin): _type_ = Track class FileError(Enum): SEEK, CORRUPT, NOTFOUND, RENAME, ITDB_CORRUPT = range(5) class Error(Enum): SEEK, CORRUPT, NOTFOUND, RENAME, ITDB_CORRUPT, SQLITE = range(6) class GErrorPtrPtr(c_void_p): pass _functions = [ ("itdb_parse", iTunesDBPtr, [gchar_p, GErrorPtrPtr]), ("itdb_parse_file", iTunesDBPtr, [gchar_p, GErrorPtrPtr]), ("itdb_write", gboolean, [iTunesDBPtr, GErrorPtrPtr]), ("itdb_write_file", gboolean, [iTunesDBPtr, gchar_p, GErrorPtrPtr]), ("itdb_shuffle_write", gboolean, [iTunesDBPtr, GErrorPtrPtr]), ("itdb_shuffle_write_file", gboolean, [iTunesDBPtr, gchar_p, GErrorPtrPtr]), ("itdb_start_sync", gboolean, [iTunesDBPtr]), ("itdb_stop_sync", gboolean, [iTunesDBPtr]), ("itdb_new", iTunesDBPtr, []), ("itdb_free", None, [iTunesDBPtr]), ("itdb_duplicate", iTunesDBPtr, [iTunesDBPtr]), ("itdb_tracks_number", guint32, [iTunesDBPtr]), ("itdb_tracks_number_nontransferred", guint32, [iTunesDBPtr]), ("itdb_playlists_number", guint32, [iTunesDBPtr]), ("itdb_musicdirs_number", gint, [iTunesDBPtr]), ("itdb_resolve_path", gchar_p, [gchar_p, POINTER(gchar_p)]), ("itdb_rename_files", gboolean, [gchar_p, GErrorPtrPtr]), ("itdb_cp_get_dest_filename", gchar_p, [TrackPtr, gchar_p, gchar_p, GErrorPtrPtr]), ("itdb_cp", gboolean, [gchar_p, gchar_p, GErrorPtrPtr]), ("itdb_cp_finalize", TrackPtr, [TrackPtr, gchar_p, gchar_p, GErrorPtrPtr]), ("itdb_cp_track_to_ipod", gboolean, [TrackPtr, gchar_p, GErrorPtrPtr]), ("itdb_filename_fs2ipod", None, [gchar_p]), ("itdb_filename_ipod2fs", None, [gchar_p]), ("itdb_filename_on_ipod", gchar_p, [TrackPtr]), ("itdb_set_mountpoint", None, [iTunesDBPtr, gchar_p]), ("itdb_get_mountpoint", gchar_p, [iTunesDBPtr]), ("itdb_get_control_dir", gchar_p, [gchar_p]), ("itdb_get_itunes_dir", gchar_p, [gchar_p]), ("itdb_get_music_dir", gchar_p, [gchar_p]), ("itdb_get_artwork_dir", gchar_p, [gchar_p]), ("itdb_get_photos_dir", gchar_p, [gchar_p]), ("itdb_get_photos_thumb_dir", gchar_p, [gchar_p]), ("itdb_get_device_dir", gchar_p, [gchar_p]), ("itdb_get_itunesdb_path", gchar_p, [gchar_p]), ("itdb_get_itunescdb_path", gchar_p, [gchar_p]), ("itdb_get_itunessd_path", gchar_p, [gchar_p]), ("itdb_get_artworkdb_path", gchar_p, [gchar_p]), ("itdb_get_photodb_path", gchar_p, [gchar_p]), ("itdb_get_path", gchar_p, [gchar_p, gchar_p]), ("itdb_device_new", DevicePtr, []), ("itdb_device_free", None, [DevicePtr]), ("itdb_device_set_mountpoint", None, [DevicePtr, gchar_p]), ("itdb_device_read_sysinfo", gboolean, [DevicePtr]), ("itdb_device_write_sysinfo", gboolean, [DevicePtr, GErrorPtrPtr]), ("itdb_device_get_sysinfo", gchar_p, [DevicePtr, gchar_p]), ("itdb_device_set_sysinfo", None, [DevicePtr, gchar_p, gchar_p]), ("itdb_device_get_ipod_info", IpodInfoPtr, [DevicePtr]), ("itdb_info_get_ipod_info_table", IpodInfoPtr, []), ("itdb_device_supports_artwork", gboolean, [DevicePtr]), ("itdb_device_supports_chapter_image", gboolean, [DevicePtr]), ("itdb_device_supports_video", gboolean, [DevicePtr]), ("itdb_device_supports_photo", gboolean, [DevicePtr]), ("itdb_device_supports_podcast", gboolean, [DevicePtr]), ("itdb_info_get_ipod_model_name_string", gchar_p, [IpodModel]), ("itdb_info_get_ipod_generation_string", gchar_p, [IpodGeneration]), ("itdb_device_get_uuid", gchar_p, [DevicePtr]), ("itdb_track_new", TrackPtr, []), ("itdb_track_free", None, [TrackPtr]), ("itdb_track_add", None, [iTunesDBPtr, TrackPtr, gint32]), ("itdb_track_remove", None, [TrackPtr]), ("itdb_track_unlink", None, [TrackPtr]), ("itdb_track_duplicate", TrackPtr, [TrackPtr]), ("itdb_track_by_id", TrackPtr, [iTunesDBPtr, guint32]), ("itdb_track_id_tree_create", GTreePtr, [iTunesDBPtr]), ("itdb_track_id_tree_destroy", None, [GTreePtr]), ("itdb_track_id_tree_by_id", TrackPtr, [GTreePtr, guint32]), ("itdb_playlist_new", PlaylistPtr, [gchar_p, gboolean]), ("itdb_playlist_free", None, [PlaylistPtr]), ("itdb_playlist_add", None, [iTunesDBPtr, PlaylistPtr, gint32]), ("itdb_playlist_move", None, [PlaylistPtr, gint32]), ("itdb_playlist_remove", None, [PlaylistPtr]), ("itdb_playlist_unlink", None, [PlaylistPtr]), ("itdb_playlist_duplicate", PlaylistPtr, [PlaylistPtr]), ("itdb_playlist_exists", gboolean, [iTunesDBPtr, PlaylistPtr]), ("itdb_playlist_add_track", None, [PlaylistPtr, TrackPtr, gint32]), ("itdb_playlist_by_id", PlaylistPtr, [iTunesDBPtr, guint64]), ("itdb_playlist_by_nr", PlaylistPtr, [iTunesDBPtr, guint32]), ("itdb_playlist_by_name", PlaylistPtr, [iTunesDBPtr, gchar_p]), ("itdb_playlist_contains_track", gboolean, [PlaylistPtr, TrackPtr]), ("itdb_playlist_contain_track_number", guint32, [TrackPtr]), ("itdb_playlist_remove_track", None, [PlaylistPtr, TrackPtr]), ("itdb_playlist_tracks_number", guint32, [PlaylistPtr]), ("itdb_playlist_randomize", None, [PlaylistPtr]), ("itdb_playlist_mpl", PlaylistPtr, [iTunesDBPtr]), ("itdb_playlist_is_mpl", gboolean, [PlaylistPtr]), ("itdb_playlist_set_mpl", None, [PlaylistPtr]), ("itdb_playlist_podcasts", PlaylistPtr, [iTunesDBPtr]), ("itdb_playlist_is_podcasts", gboolean, [PlaylistPtr]), ("itdb_playlist_set_podcasts", None, [PlaylistPtr]), ("itdb_playlist_is_audiobooks", gboolean, [PlaylistPtr]), ("itdb_splr_get_field_type", SPLFieldType, [SPLRulePtr]), ("itdb_splr_get_action_type", SPLActionType, [SPLRulePtr]), ("itdb_splr_validate", None, [SPLRulePtr]), ("itdb_splr_remove", None, [PlaylistPtr, SPLRulePtr]), ("itdb_splr_new", SPLRulePtr, []), ("itdb_splr_add", None, [PlaylistPtr, SPLRulePtr, gint]), ("itdb_splr_add_new", SPLRulePtr, [PlaylistPtr, gint]), ("itdb_spl_copy_rules", None, [PlaylistPtr, PlaylistPtr]), ("itdb_splr_eval", gboolean, [SPLRulePtr, TrackPtr]), ("itdb_spl_update", None, [PlaylistPtr]), ("itdb_spl_update_all", None, [iTunesDBPtr]), ("itdb_spl_update_live", None, [iTunesDBPtr]), ("itdb_track_set_thumbnails", gboolean, [TrackPtr, gchar_p]), ("itdb_track_set_thumbnails_from_data", gboolean, [TrackPtr, guchar_p, gsize]), ("itdb_track_set_thumbnails_from_pixbuf", gboolean, [TrackPtr, gpointer]), ("itdb_track_has_thumbnails", gboolean, [TrackPtr]), ("itdb_track_remove_thumbnails", None, [TrackPtr]), ("itdb_track_get_thumbnail", gpointer, [TrackPtr, gint, gint]), ("itdb_photodb_parse", PhotoDBPtr, [gchar_p, GErrorPtrPtr]), ("itdb_photodb_add_photo", ArtworkPtr, [PhotoDBPtr, gchar_p, gint, gint, GErrorPtrPtr]), ("itdb_photodb_add_photo_from_data", ArtworkPtr, [PhotoDBPtr, guchar_p, gsize, gint, gint, GErrorPtrPtr]), ("itdb_photodb_add_photo_from_pixbuf", ArtworkPtr, [PhotoDBPtr, gpointer, gint, gint, GErrorPtrPtr]), ("itdb_photodb_photoalbum_add_photo", None, [PhotoDBPtr, PhotoAlbumPtr, ArtworkPtr, gint]), ("itdb_photodb_photoalbum_create", PhotoAlbumPtr, [PhotoDBPtr, gchar_p, gint]), ("itdb_photodb_create", PhotoDBPtr, [gchar_p]), ("itdb_photodb_photoalbum_new", PhotoAlbumPtr, [gchar_p]), ("itdb_photodb_photoalbum_free", None, [PhotoAlbumPtr]), ("itdb_photodb_photoalbum_add", None, [PhotoDBPtr, PhotoAlbumPtr, gint]), ("itdb_photodb_free", None, [PhotoDBPtr]), ("itdb_photodb_write", gboolean, [PhotoDBPtr, GErrorPtrPtr]), ("itdb_photodb_remove_photo", None, [PhotoDBPtr, PhotoAlbumPtr, ArtworkPtr]), ("itdb_photodb_photoalbum_remove", None, [PhotoDBPtr, PhotoAlbumPtr, gboolean]), ("itdb_photodb_photoalbum_unlink", None, [PhotoAlbumPtr]), ("itdb_photodb_photoalbum_by_name", PhotoAlbumPtr, [PhotoDBPtr, gchar_p]), ("itdb_chapterdata_new", ChapterdataPtr, []), ("itdb_chapterdata_free", None, [ChapterdataPtr]), ("itdb_chapterdata_duplicate", ChapterdataPtr, [ChapterdataPtr]), ("itdb_chapterdata_remove_chapter", None, [ChapterdataPtr, ChapterPtr]), ("itdb_chapterdata_unlink_chapter", None, [ChapterdataPtr, ChapterPtr]), ("itdb_chapterdata_remove_chapters", None, [ChapterdataPtr]), ("itdb_chapter_new", ChapterPtr, []), ("itdb_chapter_free", None, [ChapterPtr]), ("itdb_chapter_duplicate", ChapterPtr, [ChapterPtr]), ("itdb_chapterdata_add_chapter", gboolean, [ChapterdataPtr, guint32, gchar_p]), ("itdb_init_ipod", gboolean, [gchar_p, gchar_p, gchar_p, GErrorPtrPtr]), ] def wrap_pointer_return(func): """If the returned value is a NULL pointer return None instead""" def wrapper(*args, **kwargs): ret = func(*args, **kwargs) if not ret: return None return ret return wrapper for name, ret, args in _functions: try: handle = getattr(_lib, name) except AttributeError: print_d("symbol not found: %r" % name) continue handle.argtypes = args handle.restype = ret # validate pointer return values if hasattr(ret, "contents"): handle = wrap_pointer_return(handle) globals()[name] = handle def sw_get_tracks(itdb_ptr): """Get tracks in itdb.""" if not itdb_ptr: raise ValueError tracks = [] node = itdb_ptr.contents.tracks while node: entry = node.contents track_ptr = cast(entry.data, TrackPtr) tracks.append(track_ptr) node = node.next return tracks __all__ = [] for key in globals().keys(): lower = key.lower() if lower.startswith("itdb_") or lower.startswith("sw_"): __all__.append(key) ����������������������������������������������������������quodlibet-3.5.3/quodlibet/devices/storage.py��������������������������������������������������������0000644�0001750�0001750�00000012322�12607265240�021374� 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 util from quodlibet import app 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) 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: encoding = util.get_locale_encoding() return str(exc).decode(encoding, 'replace') 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: encoding = util.get_locale_encoding() return str(exc).decode(encoding, 'replace') 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.5.3/quodlibet/devices/ipod.py�����������������������������������������������������������0000644�0001750�0001750�00000036446�12607265240�020700� 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 time from gi.repository import Gtk from quodlibet import util from quodlibet import app from quodlibet.qltk.msg import WarningMessage from quodlibet.qltk.x import Button from quodlibet.devices._base import Device from quodlibet.formats import AudioFile # Wraps an itdb_track from libgpod in an AudioFile instance from quodlibet.util.path import fsdecode, mtime, filesize, fsnative2glib from quodlibet.util.string import decode, encode class ConfirmDBCreate(WarningMessage): RESPONSE_CREATE = 1 def __init__(self, parent): title = _("Uninitialized iPod") description = _( "Do you want to create an empty database on this iPod?") super(ConfirmDBCreate, self).__init__( parent, title, description, buttons=Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) save_button = Button(_("_Create Database"), "system-run") save_button.show() self.add_action_widget(save_button, self.RESPONSE_CREATE) self.set_default_response(Gtk.ResponseType.CANCEL) class IPodSong(AudioFile): is_file = False def __init__(self, track): super(IPodSong, self).__init__() self.sanitize(gpod.itdb_filename_on_ipod(track)) # String keys for key in ['artist', 'album', 'title', 'genre', 'grouping', 'composer', 'albumartist']: # albumartist since libgpod-0.4.2 value = getattr(track, key, None) if value: self[key] = decode(value) # Sort keys (since libgpod-0.5.0) for key in ['artist', 'album', 'albumartist']: value = getattr(track, 'sort_' + key, None) if value: self[key + 'sort'] = decode(value) # Numeric keys for key in ['bitrate', 'playcount']: value = getattr(track, key) if value: self['~#' + key] = value try: self["date"] = unicode(track.year) except AttributeError: pass if track.cds: self["discnumber"] = u"%d/%d" % (track.cd_nr, track.cds) elif track.cd_nr: self["discnumber"] = u"%d" % track.cd_nr if track.tracks: self['tracknumber'] = u"%d/%d" % (track.track_nr, track.tracks) elif track.track_nr: self['tracknumber'] = u"%d" % track.track_nr for key, value in { '~#rating': min(1.0, track.rating / 100.0), '~#length': track.tracklen / 1000.0, }.items(): if value != 0: self[key] = value self['~format'] = u"iPod: %s" % track.filetype # Disable all tag editing def can_change(self, k=None): return [] class IPodDevice(Device): icon = 'multimedia-player-ipod' protocol = 'ipod' ordered = True defaults = { 'gain': 0.0, 'covers': True, 'all_tags': False, 'title_version': False, 'album_part': False, } __itdb = None __covers = [] def __init__(self, backend_id, device_id): super(IPodDevice, self).__init__(backend_id, device_id) #In case we can't initialize the iPod and there is a rockbox directory, #the device is probably a rockboxed iPod. #FIXME: what if the device isn't connected? self.__itdb = gpod.itdb_parse(self.mountpoint, None) rockbox_dir = os.path.join(self.mountpoint, ".rockbox") if self.__itdb is None and os.path.isdir(rockbox_dir): raise TypeError def Properties(self): props = [] gain = Gtk.SpinButton() gain.set_range(-20, 20) gain.set_digits(1) gain.set_increments(0.1, 1) gain.set_value(float(self['gain'])) props.append((_("_Volume Gain (dB):"), gain, 'gain')) for key, label in [ ['covers', _("Copy _album covers")], ['all_tags', _("Combine tags with _multiple values")], ['title_version', _("Title includes _version")], ['album_part', _("Album includes _disc subtitle")], ]: check = Gtk.CheckButton() check.set_active(self[key]) props.append((label, check, key)) if self.is_connected(): details = self.__get_details() if len(details) > 0: props.append((None, None, None)) if 'model' in details: props.append((_("Model:"), details['model'], None)) if 'space' in details: props.append((_("Capacity:"), details['space'], None)) if 'firmware' in details: props.append((_("Firmware:"), details['firmware'], None)) return props def __get_details(self): d = {} sysinfo = os.path.join(self.mountpoint, 'iPod_Control', 'Device', 'SysInfo') if os.path.isfile(sysinfo): file = open(sysinfo) while True: line = file.readline() if not line: break parts = line.split() if len(parts) < 2: continue parts[0] = parts[0].rstrip(":") if parts[0] == "ModelNumStr" and parts[1] in self.__models: d['model'], d['space'] = self.__models[parts[1]] elif parts[0] == "visibleBuildID": d['firmware'] = parts[2].strip("()") file.close() else: # Assume an iPod shuffle info = os.statvfs(self.mountpoint) space = info.f_bsize * info.f_blocks if space > 512 * 1024 * 1024: model = 'M9725' else: model = 'M9724' if model in self.__models: d['model'], d['space'] = self.__models[model] return d def list(self, wlb): if self.__load_db() is None: return [] songs = [] orphaned = False for track in gpod.sw_get_tracks(self.__itdb): filename = gpod.itdb_filename_on_ipod(track) if filename: songs.append(IPodSong(track)) else: # Remove orphaned iTunesDB track orphaned = True print_w(_("Removing orphaned iPod track")) self.__remove_track(track) if orphaned: self.__save_db() self.__close_db() return songs def copy(self, parent_widget, song): if self.__load_db() is None: return False track = gpod.itdb_track_new() # All values should be utf-8 encoded strings # Filepaths should be encoded with the fs encoding # Either combine tags with comma, or only take the first value if self['all_tags']: tag = song.comma else: tag = lambda key: (song.list(key) or ('',))[0] title = tag('title') if self['title_version'] and song('version'): title = " - ".join([title, song('version')]) track.title = encode(title) album = tag('album') if self['album_part'] and song('discsubtitle'): album = " - ".join([album, song('discsubtitle')]) track.album = encode(album) # String keys for key in ['artist', 'genre', 'grouping', 'composer', 'albumartist']: if hasattr(track, key): # albumartist since libgpod-0.4.2 setattr(track, key, encode(tag(key))) # Sort keys (since libgpod-0.5.0) for key in ['artist', 'album', 'albumartist']: if hasattr(track, 'sort_' + key): setattr(track, 'sort_' + key, encode(tag(key + 'sort'))) # Numeric keys for key in ['bitrate', 'playcount', 'year']: try: setattr(track, key, int(song('~#' + key))) except ValueError: continue # Numeric keys where the names differ for key, value in { 'cd_nr': song('~#disc'), 'cds': song('~#discs'), 'rating': min(100, song('~#rating') * 100), 'time_added': self.__mactime(time.time()), 'time_modified': self.__mactime(mtime(song('~filename'))), 'track_nr': song('~#track'), 'tracklen': song('~#length') * 1000, 'tracks': song('~#tracks'), 'size': filesize(song('~filename')), 'soundcheck': self.__soundcheck(song), }.items(): try: setattr(track, key, int(value)) except ValueError: continue track.filetype = encode(song('~format')) track.comment = encode(fsdecode(song('~filename'))) # Associate a cover with the track if self['covers']: cover = app.cover_manager.get_cover(song) if cover: # libgpod will copy the file later when the iTunesDB # is saved, so we have to keep a reference around in # case the cover is a temporary file. self.__covers.append(cover) gpod.itdb_track_set_thumbnails( track, fsnative2glib(cover.name)) # Add the track to the master playlist gpod.itdb_track_add(self.__itdb, track, -1) master = gpod.itdb_playlist_mpl(self.__itdb) gpod.itdb_playlist_add_track(master, track, -1) # Copy the actual file if gpod.itdb_cp_track_to_ipod(track, song['~filename'], None) == 1: return IPodSong(track) else: return False def delete(self, parent_widget, song): if self.__load_db() is None: return False try: for track in gpod.sw_get_tracks(self.__itdb): if gpod.itdb_filename_on_ipod(track) == song['~filename']: os.remove(song['~filename']) self.__remove_track(track) return True else: return False except IOError as exc: encoding = util.get_locale_encoding() return str(exc).decode(encoding, 'replace') def cleanup(self, wlb, action): try: wlb.set_text("<b>%s</b>" % _(u"Saving iPod database…")) if not self.__save_db(): wlb.set_text(_("Unable to save iPod database")) return False return True finally: self.__close_db() self.__covers = [] def __load_db(self): if self.__itdb: return self.__itdb self.__itdb = gpod.itdb_parse(self.mountpoint, None) if not self.__itdb and self.is_connected(): dialog = ConfirmDBCreate(None) resp = dialog.run() if resp == ConfirmDBCreate.RESPONSE_CREATE: self.__itdb = self.__create_db() return self.__itdb def __save_db(self): if self.__itdb is None: return True if gpod.itdb_write(self.__itdb, None) == 1 and \ gpod.itdb_shuffle_write(self.__itdb, None) == 1: return True else: return False def __create_db(self): db = gpod.itdb_new() gpod.itdb_set_mountpoint(db, self.mountpoint) master = gpod.itdb_playlist_new('iPod', False) gpod.itdb_playlist_set_mpl(master) gpod.itdb_playlist_add(db, master, 0) return db def __close_db(self): if self.__itdb is not None: gpod.itdb_free(self.__itdb) self.__itdb = None def __remove_track(self, track): master = gpod.itdb_playlist_mpl(self.__itdb) gpod.itdb_playlist_remove_track(master, track) gpod.itdb_track_remove(track) def __mactime(self, time): time = int(time) if time == 0: return time else: # libgpod >= 0.5.0 doesn't use mac-type timestamps anymore. check # if we're using a newer version by looking for a renamed constant. if hasattr(gpod, 'ITDB_SPL_STRING_MAXLEN'): offset = 0 else: offset = 2082844800 return time + offset # Convert ReplayGain values to Apple Soundcheck values def __soundcheck(self, song): if 'replaygain_album_gain' in song: db = float(song['replaygain_album_gain'].split()[0]) elif 'replaygain_track_gain' in song: db = float(song['replaygain_track_gain'].split()[0]) else: db = 0.0 soundcheck = int(round(1000 * 10. ** ( -0.1 * (db + float(self['gain']))))) return soundcheck # This list is taken from # http://en.wikipedia.org/wiki/List_of_iPod_model_numbers __models = { # First Generation 'M8513': ('iPod', '5GB'), 'M8541': ('iPod', '5GB'), 'M8697': ('iPod', '5GB'), 'M8709': ('iPod', '10GB'), # Second Generation 'M8737': ('iPod', '10GB'), 'M8740': ('iPod', '10GB'), 'M8738': ('iPod', '20GB'), 'M8741': ('iPod', '20GB'), # Third Generation 'M8976': ('iPod', '10GB'), 'M8946': ('iPod', '15GB'), 'M9460': ('iPod', '15GB'), 'M9244': ('iPod', '20GB'), 'M8948': ('iPod', '30GB'), 'M9245': ('iPod', '40GB'), # Fourth Generation 'M9282': ('iPod', '20GB'), 'M9787': ('iPod (U2 edition)', '20GB'), 'M9268': ('iPod', '40GB'), # Photo / Fourth Generation 'MA079': ('iPod photo', '20GB'), 'MA127': ('iPod photo (U2 edition)', '20GB'), 'M9829': ('iPod photo', '30GB'), 'M9585': ('iPod photo', '40GB'), 'M9586': ('iPod photo', '60GB'), 'M9830': ('iPod photo', '60GB'), # Shuffle / Fourth Generation 'M9724': ('iPod shuffle', '512MB'), 'M9725': ('iPod shuffle', '1GB'), 'MA133': ('iPod shuffle', '512MB'), # Video / Fifth Generation 'MA002': ('iPod video white', '30GB'), 'MA146': ('iPod video black', '30GB'), 'MA003': ('iPod video white', '60GB'), 'MA147': ('iPod video black', '60GB'), # Nano / Fifth Generation 'MA350': ('iPod nano white', '1GB'), 'MA352': ('iPod nano black', '1GB'), 'MA004': ('iPod nano white', '2GB'), 'MA099': ('iPod nano black', '2GB'), 'MA005': ('iPod nano white', '4GB'), 'MA107': ('iPod nano black', '4GB'), # First Generation Mini 'M9160': ('iPod mini silver', '4GB'), 'M9436': ('iPod mini blue', '4GB'), 'M9435': ('iPod mini pink', '4GB'), 'M9434': ('iPod mini green', '4GB'), 'M9437': ('iPod mini gold', '4GB'), # Second Generation Mini 'M9800': ('iPod mini silver', '4GB'), 'M9802': ('iPod mini blue', '4GB'), 'M9804': ('iPod mini pink', '4GB'), 'M9806': ('iPod mini green', '4GB'), 'M9801': ('iPod mini silver', '6GB'), 'M9803': ('iPod mini blue', '6GB'), 'M9805': ('iPod mini pink', '6GB'), 'M9807': ('iPod mini green', '6GB'), } try: from quodlibet.devices import _gpod as gpod except ImportError: print_w(_("Could not find libgpod, iPod support disabled.")) devices = [] else: devices = [IPodDevice] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/devices/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000045203�12646426641�021502� 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 import ConfigParser from os.path import dirname, basename from quodlibet.util.dprint import print_d, print_w from gi.repository import GObject from quodlibet.util.path import xdg_get_system_data_dirs import quodlibet from quodlibet import util from quodlibet.devices import _udev as udev from quodlibet.util.importhelper import load_dir_modules 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(dirname(__file__), 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() 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(): f = file(DEVICES, 'w') config.write(f) f.close() # 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 = path.encode("ascii") enum = udev.UdevEnumerate.new(udev_ctx) if not enum: raise EnvironmentError # only match the device we want if enum.add_match_property("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] = value.decode("string-escape") device_attrs.append(attrs) # the first device owns its parents devices[0].unref() return device_attrs def dbus_barray_to_str(array): return b"".join(map(bytes, array)).rstrip(b"\x00") 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_str(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, unicode(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 objects.iteritems(): 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_str(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_str(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", unicode(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 [] class UDisks1Manager(DeviceManager): def __init__(self): bus_name = "org.freedesktop.UDisks" interface = "org.freedesktop.UDisks" path = "/org/freedesktop/UDisks" super(UDisks1Manager, self).__init__(bus_name) error = False try: udev.init() except OSError: print_w("UDisks: " + _("Could not find '%s'.") % "libudev") error = True else: self.__udev = udev.Udev.new() if get_mpi_dir() is None: print_w("UDisks: " + _("Could not find '%s'.") % "media-player-info") error = True if error: raise LookupError obj = self._system_bus.get_object(bus_name, path) self.__interface = dbus.Interface(obj, interface) self.__devices = {} self.__interface.connect_to_signal('DeviceAdded', self.__device_added) self.__interface.connect_to_signal('DeviceRemoved', self.__device_removed) def __get_dev_prop_interface(self, path): bus_name = "org.freedesktop.UDisks" obj = self._system_bus.get_object(bus_name, path) return dbus.Interface(obj, "org.freedesktop.DBus.Properties") def __get_dev_interface(self, path): bus_name = "org.freedesktop.UDisks" obj = self._system_bus.get_object(bus_name, path) return dbus.Interface(obj, "org.freedesktop.UDisks.Device") def __get_dev_property(self, interface, property): return interface.Get("org.freedesktop.DBus.Properties", property) def __get_device_id(self, path): """A unique device id""" prop_if = self.__get_dev_prop_interface(path) dev_id = self.__get_dev_property(prop_if, 'device-file-by-id')[0] dev_id = basename(dev_id) return dev_id.replace("-", "_").replace(":", "_") def __device_added(self, path): dev = self.__build_dev(path) if dev: self.__devices[path] = dev self.emit("added", dev) def __device_removed(self, path): # only forward removed events if we have handled the device if path not in self.__devices: return self.emit("removed", path) dev = self.__devices[path] dev.close() del self.__devices[path] def discover(self): paths = self.__interface.EnumerateDevices() for path in paths: self.__device_added(path) def __get_parent_disk_path(self, path): prop_if = self.__get_dev_prop_interface(path) prop_get = self.__get_dev_property if not prop_get(prop_if, "device-is-partition"): return path return prop_get(prop_if, "partition-slave") def eject(self, path): dev_if = self.__get_dev_interface(path) parent_path = self.__get_parent_disk_path(path) parent_if = self.__get_dev_interface(parent_path) try: dev_if.FilesystemUnmount([]) parent_if.DriveEject([]) return True except dbus.DBusException: return False def get_name(self, path): prop_if = self.__get_dev_prop_interface(path) prop_get = self.__get_dev_property num = "" if prop_get(prop_if, 'device-is-partition'): num = str(prop_get(prop_if, 'partition-number')) parent_path = prop_get(prop_if, 'partition-slave') prop_if = self.__get_dev_prop_interface(parent_path) vendor = prop_get(prop_if, 'drive-vendor') name = prop_get(prop_if, 'drive-model') return " ".join([vendor, name, num]).strip() def get_mountpoint(self, path): """/media/myplayer""" prop_if = self.__get_dev_prop_interface(path) prop_get = self.__get_dev_property if prop_get(prop_if, 'device-is-mounted'): return str(prop_get(prop_if, 'device-mount-paths')[0]) return '' def get_block_device(self, path): """/dev/sda for example""" prop_if = self.__get_dev_prop_interface(path) return str(self.__get_dev_property(prop_if, 'device-file')) def __build_dev(self, path): """Return the right device instance by determining the supported AccessProtocol""" prop_if = self.__get_dev_prop_interface(path) prop_get = self.__get_dev_property #filter out useless devices if not (prop_get(prop_if, 'device-is-drive') or prop_get(prop_if, 'device-is-partition')) \ or prop_get(prop_if, 'device-is-system-internal') \ or prop_get(prop_if, 'device-is-partition-table') \ or not prop_get(prop_if, 'device-is-media-available'): return #filter out empty partitions (issue 422) #http://www.win.tue.nl/~aeb/partitions/partition_types-1.html if prop_get(prop_if, 'device-is-partition') and \ prop_get(prop_if, 'partition-scheme') == "mbr" and \ int(prop_get(prop_if, 'partition-type'), 16) == 0: return # ask libudev if the device is a media player # and get supported protocols if any devpath = self.get_block_device(path) media_player_id = get_media_player_id(self.__udev, devpath) if not media_player_id: return protocols = get_media_player_protocols(media_player_id) # unique id device_id = self.__get_device_id(path) dev = self.create_device(path, device_id, protocols) icon = prop_get(prop_if, 'device-presentation-icon-name') if dev and icon: dev.icon = icon return dev 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_d(try_text % "UDisks1") try: device_manager = UDisks1Manager() 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.5.3/quodlibet/devices/_base.py����������������������������������������������������������0000644�0001750�0001750�00000013007�12607265240�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 import quodlibet.devices 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 os.path.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.5.3/quodlibet/devices/_udev.py����������������������������������������������������������0000644�0001750�0001750�00000017053�12607265240�021040� 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 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 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.5.3/quodlibet/compat.py�����������������������������������������������������������������0000644�0001750�0001750�00000001630�12646426641�017600� 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 urlparse from urllib import pathname2url pathname2url from cStringIO import StringIO as cBytesIO cBytesIO text_type = unicode exec("def reraise(tp, value, tb):\n raise tp, value, tb") elif PY3: import builtins builtins from urllib.parse import urlparse urlparse from urllib.request import pathname2url pathname2url from io import BytesIO as cBytesIO cBytesIO text_type = str def reraise(tp, value, tb): raise tp(value).with_traceback(tb) ��������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016546� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/gstreamer/������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020537� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/gstreamer/compressor.py�����������������������������������������������0000644�0001750�0001750�00000010375�12607265240�023301� 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.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.") PLUGIN_ICON = "audio-volume-high" @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.5.3/quodlibet/ext/gstreamer/karaoke.py��������������������������������������������������0000644�0001750�0001750�00000010126�12607265240�022514� 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.plugins import PluginImportException from quodlibet.plugins.gstelement import GStreamerPlugin from quodlibet import qltk from quodlibet import config _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 = "audio-volume-high" @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.5.3/quodlibet/ext/gstreamer/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�022627� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/gstreamer/mono.py�����������������������������������������������������0000644�0001750�0001750�00000001501�12607265240�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.plugins.gstelement import GStreamerPlugin class MonoDownmix(GStreamerPlugin): PLUGIN_ID = "mono" PLUGIN_NAME = _("Mono Downmix") PLUGIN_DESC = _("Downmixes audio channels to mono.") PLUGIN_ICON = "audio-volume-high" 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.5.3/quodlibet/ext/gstreamer/crossfeed.py������������������������������������������������0000644�0001750�0001750�00000013617�12607265240�023064� 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 if os.name == "nt": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError from gi.repository import Gtk, Gst, GObject 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.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.5.3/quodlibet/ext/gstreamer/pitch.py����������������������������������������������������0000644�0001750�0001750�00000007055�12607265240�022215� 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 from gi.repository import Gtk, GObject, Gst from quodlibet.plugins import PluginImportException, PluginNotSupportedError from quodlibet.plugins.gstelement import GStreamerPlugin from quodlibet import qltk from quodlibet import config if os.name == "nt": # https://github.com/quodlibet/quodlibet/issues/1534 raise PluginNotSupportedError("Crashes under Windows...") _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.") PLUGIN_ICON = "audio-volume-high" @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.5.3/quodlibet/ext/covers/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020047� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/covers/__init__.py����������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�022137� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/covers/lastfm.py������������������������������������������������������0000644�0001750�0001750�00000006420�12607265240�021677� 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 import gi try: gi.require_version("Soup", "2.4") except ValueError as e: raise ImportError(e) from gi.repository import Soup 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 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 = 'http://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.5.3/quodlibet/ext/covers/musicbrainz.py�������������������������������������������������0000644�0001750�0001750�00000003065�12607265240�022741� 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.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 'http://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.5.3/quodlibet/ext/_shared/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020153� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/_shared/squeezebox/���������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�022345� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/_shared/squeezebox/base.py��������������������������������������������0000644�0001750�0001750�00000014276�12607265240�023631� 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 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.5.3/quodlibet/ext/_shared/squeezebox/util.py��������������������������������������������0000644�0001750�0001750�00000003207�12607265240�023664� 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 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.5.3/quodlibet/ext/_shared/squeezebox/__init__.py����������������������������������������0000644�0001750�0001750�00000000360�12607265240�024443� 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.5.3/quodlibet/ext/_shared/squeezebox/server.py������������������������������������������0000644�0001750�0001750�00000017542�12607265240�024224� 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 socket from telnetlib import Telnet import time import urllib from quodlibet import print_w, print_d, print_, app 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: print_d("Couldn't talk to %s" % (self.config,)) 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") if not want_reply: return None raw_response = self.telnet.read_until("\n").strip() 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 urllib.unquote(raw_response) 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 = urllib.unquote(string) cpos = s.index(":") return (s[0:cpos], s[cpos + 1:]) # Do a meaningful URL-unescaping and tuplification for all values pairs = map(demunge, 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" % (urllib.quote(path))) def playlist_add(self, path): self.player_request("playlist add %s" % (urllib.quote(path)), False) def playlist_save(self, name): self.player_request("playlist save %s" % (urllib.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" % (urllib.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" % (urllib.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.5.3/quodlibet/ext/_shared/__init__.py���������������������������������������������������0000644�0001750�0001750�00000000543�12607265240�022254� 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.5.3/quodlibet/ext/playorder/������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020547� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/playorder/track_repeat.py���������������������������������������������0000644�0001750�0001750�00000005414�12607265240�023557� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,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. # # 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? Non-shuffle? Integration with main UI? # from gi.repository import Gtk from quodlibet.plugins.playorder import PlayOrderPlugin, PlayOrderShuffleMixin from quodlibet.util.dprint import print_d from quodlibet.plugins import PluginConfigMixin from quodlibet.qltk import Icons class TrackRepeatOrder(PlayOrderPlugin, PlayOrderShuffleMixin, PluginConfigMixin): PLUGIN_ID = "track_repeat" PLUGIN_NAME = _("Track Repeat") PLUGIN_ICON = Icons.VIEW_REFRESH PLUGIN_DESC = _("Shuffle songs, " "but repeat every track a set number of times.") PLAY_EACH_DEFAULT = 2 # Plays of the current song play_count = 0 @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 = 0 print_d("Resetting play count", context=self) def next(self, playlist, iter): self.play_count += 1 play_each = int(self.config_get('play_each', self.PLAY_EACH_DEFAULT)) print_d("Play count now at %d/%d" % (self.play_count, play_each)) if self.play_count < play_each and iter is not None: return iter else: self.restart_counting() return super(TrackRepeatOrder, self).next(playlist, iter) def next_explicit(self, *args): self.restart_counting() return super(TrackRepeatOrder, self).next(*args) def previous(self, *args): return super(TrackRepeatOrder, self).previous(*args) def set(self, playlist, iter): self.restart_counting() return super(TrackRepeatOrder, self).set(playlist, iter) def reset(self, playlist): super(TrackRepeatOrder, self).reset(playlist) self.play_count = 0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/playorder/reverse.py��������������������������������������������������0000644�0001750�0001750�00000001053�12607265240�022561� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from quodlibet.qltk import Icons from quodlibet.plugins.playorder import PlayOrderPlugin, PlayOrderInOrderMixin class ReverseOrder(PlayOrderPlugin, PlayOrderInOrderMixin): PLUGIN_ID = "reverse" PLUGIN_NAME = _("Reverse") PLUGIN_ICON = Icons.VIEW_REFRESH 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.5.3/quodlibet/ext/playorder/follow.py���������������������������������������������������0000644�0001750�0001750�00000003247�12607265240�022417� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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 quodlibet.plugins.playorder import PlayOrderPlugin, \ PlayOrderRememberedMixin, PlayOrderInOrderMixin from quodlibet import app from quodlibet.qltk import Icons class FollowOrder(PlayOrderPlugin, PlayOrderRememberedMixin, PlayOrderInOrderMixin): PLUGIN_ID = "follow" PLUGIN_NAME = _("Follow Cursor") PLUGIN_ICON = Icons.GO_JUMP PLUGIN_DESC = _("Playback follows your selection.") __last_path = None def next(self, playlist, iter): next_fallback = PlayOrderInOrderMixin.next(self, playlist, iter) PlayOrderRememberedMixin.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): return super(FollowOrder, self).previous(*args) self.__last_path = None 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.5.3/quodlibet/ext/playorder/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�022637� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/playorder/queue.py����������������������������������������������������0000644�0001750�0001750�00000001665�12607265240�022243� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2009 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. from quodlibet.plugins.playorder import PlayOrderPlugin, PlayOrderInOrderMixin from quodlibet import app from quodlibet.qltk import Icons class QueueOrder(PlayOrderPlugin, PlayOrderInOrderMixin): PLUGIN_ID = "queue" PLUGIN_NAME = _("Queue Only") PLUGIN_ICON = Icons.MEDIA_SKIP_FORWARD PLUGIN_DESC = _("Limits playing of songs to the queue. Double-click on " "any song to enqueue it.") 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.5.3/quodlibet/ext/__init__.py�����������������������������������������������������������0000644�0001750�0001750�00000000372�12607265240�020647� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # 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.5.3/quodlibet/ext/playlist/�������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020407� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/playlist/remove_duplicates.py�����������������������������������������0000644�0001750�0001750�00000004226�12607265240�024465� 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.util.dprint import print_d 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.5.3/quodlibet/ext/playlist/shuffle.py���������������������������������������������������0000644�0001750�0001750�00000001322�12607265240�022401� 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.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.SYSTEM_RUN 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.5.3/quodlibet/ext/playlist/__init__.py��������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�022477� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/playlist/export_to_squeezebox.py��������������������������������������0000644�0001750�0001750�00000007072�12607265240�025252� 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 threading import Thread 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 Squeezebox Sync plugin.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP 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") self.__cancel = False self.server.playlist_save(self.TEMP_PLAYLIST) self.server.playlist_clear() # 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 worker = Thread(target=self.server.playlist_add, args=(self.get_sb_path(song),)) worker.daemon = True worker.start() worker.join(timeout=3) #self.server.playlist_add(self.get_path(song)) task.update(float(i) / total) yield True print_d("Saving Squeezebox playlist \"%s\"" % name) task.pulse() self.server.playlist_save(name) yield True task.pulse() # 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( None, _("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.5.3/quodlibet/ext/events/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020052� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/themeswitcher.py�����������������������������������������������0000644�0001750�0001750�00000013144�12607265240�023270� 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 warnings import os from gi.repository import Gtk from quodlibet import qltk from quodlibet import config from quodlibet.util.path import get_home_dir from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.plugins.events import EventPlugin def has_header_bar_prop(): """if gtk is recent enough to have the property""" settings = Gtk.Settings.get_default() return hasattr(settings.props, "gtk_dialogs_use_header") def set_header_bar(value): if not has_header_bar_prop(): return settings = Gtk.Settings.get_default() settings.set_property('gtk-dialogs-use-header', value) def get_header_bar(): if not has_header_bar_prop(): return False settings = Gtk.Settings.get_default() return settings.get_property('gtk-dialogs-use-header') class ThemeSwitcher(EventPlugin): PLUGIN_ID = "Theme Switcher" PLUGIN_NAME = _("Theme Switcher") PLUGIN_DESC = _("Changes the active GTK+ theme.") __enabled = False __defaults = False CONFIG_THEME = PLUGIN_ID + "_theme" CONFIG_DARK = PLUGIN_ID + "_prefer_dark" CONFIG_HEADER_BAR = PLUGIN_ID + "_prefer_header_bar" 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') self.__default_header_bar = get_header_bar() 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) hb_button = ConfigCheckButton( _("Use header bars"), "plugins", self.CONFIG_HEADER_BAR, populate=True, default=self.__get_header_bar()) def hb_cb(button): self.__set_header_bar(button.get_active()) hb_button.connect('toggled', hb_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) vbox.pack_start(hb_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_) 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 __set_header_bar(self, value): if not self.__enabled: return if value is None: value = self.__default_header_bar set_header_bar(value) def __get_header_bar(self): return config.getboolean( "plugins", self.CONFIG_HEADER_BAR, self.__default_header_bar) 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()) self.__set_header_bar(self.__get_header_bar()) def disabled(self): self.__set_theme(None) self.__set_dark(None) self.__set_header_bar(None) self.__enabled = False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/trayicon.py����������������������������������������������������0000644�0001750�0001750�00000046432�12646426641�022262� 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, Pango, Gdk, GdkPixbuf, GLib from quodlibet import browsers, config, qltk, util, app from quodlibet.config import RATINGS from quodlibet.pattern import Pattern from quodlibet.plugins.events import EventPlugin from quodlibet.qltk.browser import LibraryBrowser from quodlibet.qltk.information import Information from quodlibet.qltk.playorder import ORDERS from quodlibet.qltk.properties import SongProperties from quodlibet.qltk.window import Window from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk.x import RadioMenuItem, SeparatorMenuItem, MenuItem from quodlibet.qltk import Icons from quodlibet.util.thumbnails import scale from quodlibet.util import connect_obj def get_hide_window(): return config.getboolean('plugins', 'trayicon_window_hide', True) class Preferences(Gtk.VBox): """A small window to configure the tray icon's tooltip.""" def __init__(self, activator): super(Preferences, self).__init__(spacing=12) self.set_border_width(6) ccb = ConfigCheckButton(_("Hide main window on close"), 'plugins', 'trayicon_window_hide') ccb.set_active(get_hide_window()) self.pack_start(ccb, False, True, 0) combo = Gtk.ComboBoxText() combo.append_text(_("Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song")) combo.append_text(_("Scroll wheel changes song\n" "Shift and scroll wheel adjusts volume")) combo.set_active(int( config.getboolean("plugins", "icon_modifier_swap", False))) combo.connect('changed', self.__changed_combo) self.pack_start(qltk.Frame(_("Scroll _Wheel"), child=combo), True, True, 0) box = Gtk.VBox(spacing=12) table = Gtk.Table(n_rows=2, n_columns=4) table.set_row_spacings(6) table.set_col_spacings(12) cbs = [] for i, tag in enumerate([ "genre", "artist", "album", "discnumber", "part", "tracknumber", "title", "version"]): cb = Gtk.CheckButton(label=util.tag(tag)) cb.tag = tag cbs.append(cb) table.attach(cb, i % 3, i % 3 + 1, i // 3, i // 3 + 1) box.pack_start(table, True, True, 0) entry = Gtk.Entry() box.pack_start(entry, False, True, 0) preview = Gtk.Label() preview.set_ellipsize(Pango.EllipsizeMode.END) ev = Gtk.EventBox() ev.add(preview) box.pack_start(ev, False, True, 0) frame = qltk.Frame(_("Tooltip Display"), child=box) frame.get_label_widget().set_mnemonic_widget(entry) self.pack_start(frame, True, True, 0) for cb in cbs: cb.connect('toggled', self.__changed_cb, cbs, entry) entry.connect( 'changed', self.__changed_entry, cbs, preview) try: entry.set_text(config.get("plugins", "icon_tooltip")) except: entry.set_text( "<album|<album~discnumber~part~tracknumber~title~version>|" "<artist~title~version>>") for child in self.get_children(): child.show_all() def __changed_combo(self, combo): config.set( "plugins", "icon_modifier_swap", str(bool(combo.get_active()))) def __changed_cb(self, cb, cbs, entry): text = "<%s>" % "~".join([c.tag for c in cbs if c.get_active()]) entry.set_text(text) def __changed_entry(self, entry, cbs, label): text = entry.get_text() if text[0:1] == "<" and text[-1:] == ">": parts = text[1:-1].split("~") for cb in cbs: if parts and parts[0] == cb.tag: parts.pop(0) if parts: for cb in cbs: cb.set_inconsistent(True) else: parts = text[1:-1].split("~") for cb in cbs: cb.set_inconsistent(False) cb.set_active(cb.tag in parts) else: for cb in cbs: cb.set_inconsistent(True) if app.player.info is None: text = _("Not playing") else: text = Pattern(entry.get_text()) % app.player.info label.set_text(text) label.get_parent().set_tooltip_text(text) config.set("plugins", "icon_tooltip", entry.get_text()) 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 TrayIcon(EventPlugin): _icon = None __pixbuf = None __pixbuf_paused = None __icon_theme = None __menu = None __size = -1 __w_sig_map = None __w_sig_del = None __theme_sig = None __first_map = True __pattern = Pattern( "<album|<album~discnumber~part~tracknumber~title~version>|" "<artist~title~version>>") PLUGIN_ID = "Tray Icon" PLUGIN_NAME = _("Tray Icon") PLUGIN_DESC = _("Controls Quod Libet from the system tray.") def enabled(self): 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_show = app.window.connect('show', self.__window_show) 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) if sys.platform != "darwin": if not config.getboolean("plugins", "icon_window_visible", True): Window.prevent_inital_show(True) def __embedded_changed(self, icon, *args): if icon.get_property("embedded"): size = icon.get_size() self.__size_changed(icon, size) def disabled(self): 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_show) app.window.disconnect(self.__w_sig_del) self._icon.set_visible(False) self._icon = None self.__show_window() 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 PluginPreferences(self, parent): p = Preferences(self) p.connect('destroy', self.__prefs_destroy) return p 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 __prefs_destroy(self, *args): if self._icon: self.plugin_on_song_started(app.player.song) def __window_delete(self, win, event): if self.__user_can_unhide() and get_hide_window(): self.__hide_window() return True return False def __window_show(self, win, *args): config.set("plugins", "icon_window_visible", "true") def __hide_window(self): app.hide() config.set("plugins", "icon_window_visible", "false") 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 ^= config.getboolean("plugins", "icon_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 plugin_on_song_started(self, song): if not self._icon: return if song: try: pattern = Pattern(config.get("plugins", "icon_tooltip")) except (ValueError, config.Error): pattern = self.__pattern tooltip = pattern % song else: tooltip = _("Not playing") self._icon.set_tooltip_markup(util.escape(tooltip)) 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 = Gtk.Menu() player = app.player window = app.window if player.paused: playpause = MenuItem(_("_Play"), Icons.MEDIA_PLAYBACK_START) else: playpause = MenuItem(_("P_ause"), Icons.MEDIA_PLAYBACK_PAUSE) playpause.connect('activate', self.__play_pause) previous = MenuItem(_("Pre_vious"), Icons.MEDIA_SKIP_BACKWARD) previous.connect('activate', lambda *args: player.previous()) next = MenuItem(_("_Next"), Icons.MEDIA_SKIP_FORWARD) next.connect('activate', lambda *args: player.next()) orders = Gtk.MenuItem(label=_("Play _Order"), use_underline=True) repeat = Gtk.CheckMenuItem(label=_("_Repeat"), use_underline=True) repeat.set_active(window.repeat.get_active()) repeat.connect('toggled', lambda s: window.repeat.set_active(s.get_active())) def set_safter(widget, safter_action): safter_action.set_active(widget.get_active()) safter_action = app.window.stop_after safter = Gtk.CheckMenuItem(label=_("Stop _after this song"), use_underline=True) safter.set_active(safter_action.get_active()) safter.connect('toggled', set_safter, safter_action) def set_order(widget, order): name = order.name try: window.order.set_active_by_name(name) except ValueError: pass order_items = [] item = None active_order = window.order.get_active() for Kind in ORDERS: item = RadioMenuItem( group=item, label=Kind.accelerated_name, use_underline=True) order_items.append(item) if Kind is active_order: item.set_active(True) item.connect('toggled', set_order, Kind) order_sub = Gtk.Menu() order_sub.append(repeat) order_sub.append(safter) order_sub.append(SeparatorMenuItem()) for item in order_items: order_sub.append(item) orders.set_submenu(order_sub) browse = qltk.MenuItem(_("_Browse Library"), Icons.EDIT_FIND) browse_sub = Gtk.Menu() for Kind in browsers.browsers: if Kind.is_empty: continue 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) props = qltk.MenuItem(_("Edit _Tags"), Icons.DOCUMENT_PROPERTIES) props.connect('activate', self.__properties) info = MenuItem(_("_Information"), Icons.DIALOG_INFORMATION) info.connect('activate', self.__information) def set_rating(value): song = player.song if song is None: return else: song["~#rating"] = value app.librarian.changed([song]) rating = Gtk.MenuItem(label=_("_Rating"), use_underline=True) rating_sub = Gtk.Menu() for r in RATINGS.all: item = Gtk.MenuItem(label="%0.2f\t%s" % (r, util.format_rating(r))) connect_obj(item, 'activate', set_rating, r) rating_sub.append(item) rating.set_submenu(rating_sub) quit = MenuItem(_("_Quit"), Icons.APPLICATION_EXIT) quit.connect('activate', lambda *x: app.quit()) menu.append(playpause) menu.append(SeparatorMenuItem()) menu.append(previous) menu.append(next) menu.append(orders) menu.append(SeparatorMenuItem()) menu.append(browse) menu.append(SeparatorMenuItem()) menu.append(props) menu.append(info) menu.append(rating) menu.append(SeparatorMenuItem()) menu.append(quit) 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) plugin_on_paused = __update_icon plugin_on_unpaused = __update_icon def __properties(self, *args): song = app.player.song if song: window = SongProperties(app.librarian, [song]) window.show() def __information(self, *args): song = app.player.song if song: window = Information(app.librarian, [song]) window.show() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/telepathy_status.py��������������������������������������������0000644�0001750�0001750�00000014130�12607265240�024013� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Quod Libet Telepathy Plugin # Copyright 2012 Nick Boultbee, 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 if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import dbus from gi.repository import Gtk 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.NETWORK_WORKGROUP 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.5.3/quodlibet/ext/events/advanced_preferences.py����������������������������������������0000644�0001750�0001750�00000010766�12607265240�024552� 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 quodlibet import config from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk import Icons from quodlibet.util.string import decode from quodlibet.plugins.events import EventPlugin def _config(section, option, label, tooltip, getter): def on_changed(entry, *args): config.set(section, option, entry.get_text()) entry = UndoEntry() entry.set_tooltip_text(tooltip) entry.set_text(decode(config.get(section, option))) entry.connect("changed", on_changed) def on_reverted(*args): config.reset(section, option) entry.set_text(decode(config.get(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): 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 unicode(config.getboolean(section, option)) return _config(section, option, label, tooltip, getter) def int_config(section, option, label, tooltip): def getter(section, option): return unicode(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 to tweak advanced config settings.") PLUGIN_CAN_ENABLE = False 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( boolean_config( "browsers", "rating_hotkeys", "Rating Hotkeys:", "Enable rating by pressing the 0-X keys")) rows.append( int_config( "browsers", "cover_size", "Album Cover Size:", ("Size of the album cover images in the album list browser " "(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) vb.pack_start(table, True, True, 0) return vb ����������quodlibet-3.5.3/quodlibet/ext/events/write_cover.py�������������������������������������������������0000644�0001750�0001750�00000003667�12646426641�022765� 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 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: f = file(outfile, "wb") f.write(cover.read()) f.close() 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.5.3/quodlibet/ext/events/clock.py�������������������������������������������������������0000644�0001750�0001750�00000007747�12607265240�021524� 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 time from gi.repository import Gtk, GLib 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.DIALOG_INFORMATION _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.5.3/quodlibet/ext/events/mpris.py�������������������������������������������������������0000644�0001750�0001750�00000055621�12646426641�021564� 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 import time import tempfile from gi.repository import Gtk import dbus import dbus.service try: import indicate except ImportError: indicate = None 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.util.uri import URI from quodlibet.util.dbusutils import DBusIntrospectable, DBusProperty from quodlibet.util.dbusutils import dbus_unicode_validate as unival from quodlibet.plugins.events import EventPlugin # TODO: OpenUri, CanXYZ # Date parsing (util?) 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) 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 # 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, loop): app.window.repeat.set_active(loop) @dbus.service.method(IFACE, in_signature="b") def SetRandom(self, shuffle): window = app.window window.order.set_shuffle(shuffle) 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) self.__rsig = app.window.repeat.connect( "toggled", self.__update_status) self.__ssig = app.window.order.connect( "changed", 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) app.window.repeat.disconnect(self.__rsig) app.window.order.disconnect(self.__ssig) 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 strings.iteritems(): 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): window = app.window play = (not app.player.info and 2) or int(app.player.paused) shuffle = window.order.get_shuffle() repeat_one = window.order.get_active_name() == "onesong" repeat_all = int(window.repeat.get_active()) 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) def Repeat(self): pass @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 # 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) self.__rsig = app.window.repeat.connect("toggled", self.__repeat_changed) self.__ssig = app.window.order.connect("changed", self.__order_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 app.window.repeat.disconnect(self.__rsig) app.window.order.disconnect(self.__ssig) 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 __order_changed(self, *args): self.emit_properties_changed(self.PLAYER_IFACE, ["Shuffle", "LoopStatus"]) def __seeked(self, player, song, ms): self.Seeked(ms * 1000) def __library_changed(self, library, song): if song and song is not app.player.info: 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"] = str(URI.frompath(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 list_val.iteritems(): vals = song.list(tag) if vals: metadata["xesam:" + xesam] = map(unival, vals) # All single values sing_val = {"album": "album", "title": "title", "asText": "~lyrics"} for xesam, tag in sing_val.iteritems(): 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 num_val.iteritems(): 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 window = app.window if interface == self.PLAYER_IFACE: if name == "LoopStatus": if value == "Playlist": window.repeat.set_active(True) window.order.set_active_by_name("inorder") elif value == "Track": window.repeat.set_active(True) window.order.set_active_by_name("onesong") elif value == "None": window.repeat.set_active(False) elif name == "Rate": pass elif name == "Shuffle": window.order.set_shuffle(value) elif name == "Volume": player.volume = value def get_property(self, interface, name): player = app.player window = app.window 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": repeat = window.repeat.get_active() if repeat: onesong = window.order.get_active_name() == "onesong" if onesong: return "Track" else: return "Playlist" else: return "None" elif name == "Rate": return 1.0 elif name == "Shuffle": return window.order.get_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.5.3/quodlibet/ext/events/autorating.py��������������������������������������������������0000644�0001750�0001750�00000001653�12607265240�022574� 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.plugins.events import EventPlugin 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.") 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.5.3/quodlibet/ext/events/inhibit.py�����������������������������������������������������0000644�0001750�0001750�00000004566�12607265240�022053� 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 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 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.PROCESS_STOP 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.5.3/quodlibet/ext/events/notify.py������������������������������������������������������0000644�0001750�0001750�00000040502�12607265240�021723� 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 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 unescape from quodlibet.util.uri import URI from quodlibet.util import connect_obj # configuration stuff DEFAULT_CONFIG = { "timeout": 4000, "show_notifications": "all", "show_only_when_unfocused": 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, unicode(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) 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: image_path = fileobj.name return URI.frompath(image_path).decode("utf-8") 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 "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.5.3/quodlibet/ext/events/radioadmute.py�������������������������������������������������0000644�0001750�0001750�00000003756�12607265240�022723� 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 re from quodlibet import app 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.") 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 = 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.5.3/quodlibet/ext/events/viewlyrics.py��������������������������������������������������0000644�0001750�0001750�00000007702�12646426641�022627� 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 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. # # 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 can get a copy of the GNU General Public License at: # http://www.gnu.org/licenses/gpl-2.0.html """Provides the `ViewLyrics` plugin for viewing lyrics in the main window.""" import os from gi.repository import Gtk, Gdk from quodlibet import app from quodlibet.plugins.events import EventPlugin class ViewLyrics(EventPlugin): """The plugin for viewing lyrics in the main window.""" PLUGIN_ID = 'View Lyrics' PLUGIN_NAME = _('View Lyrics') PLUGIN_DESC = _('Displays lyrics beneath the song list.') 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. """ if (song is not None) and os.path.exists(song.lyric_filename): with open(song.lyric_filename, 'r') as lyric_file: self.textbuffer.set_text(lyric_file.read()) self.adjustment.set_value(0) # Scroll to the top. self.expander.show() else: 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.5.3/quodlibet/ext/events/automask.py����������������������������������������������������0000644�0001750�0001750�00000003075�12607265240�022243� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 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 gi gi.require_version("Gio", "2.0") from gi.repository import Gio 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.") __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.5.3/quodlibet/ext/events/randomalbum.py�������������������������������������������������0000644�0001750�0001750�00000021512�12607265240�022714� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2009 Joe Wreschnig, Steven Robertson # 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 import random from gi.repository import Gtk, GLib from quodlibet import app from quodlibet import config from quodlibet.plugins.events import EventPlugin from quodlibet import util try: from quodlibet.qltk import notif 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.") 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): if (song is None and config.get("memory", "order") != "onesong" and not app.player.paused): browser = app.window.browser if not browser.can_filter('album'): 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 not browser.can_filter('album'): 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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/iradiolog.py���������������������������������������������������0000644�0001750�0001750�00000002244�12607265240�022365� 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 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.5.3/quodlibet/ext/events/__init__.py����������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�022142� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/auto_library_update.py�����������������������������������������0000644�0001750�0001750�00000014605�12646426641�024465� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Automatic library update plugin # # (c) 2009 Joe Higton # 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 sys 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.MissingGstreamerElementPluginException("pyinotify") if hasattr(plugins, "MissingPluginDependencyException") else e) from quodlibet import print_d from quodlibet.plugins.events import EventPlugin from quodlibet.util.library import get_scan_dirs from quodlibet import app from gi.repository import GLib import os class LibraryEvent(ProcessEvent): """pynotify event handler for library changes""" # Slightly dodgy state mechanism for updates _being_created = set() def __init__(self, library): 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): print_d('Triggered for "%s"' % event.name) GLib.idle_add(self.add, event) def process_IN_CREATE(self, event): #print_d('Triggered for "%s"' % event.name) # Just remember that they've been created, process in further updates path = os.path.join(event.path, event.name) self._being_created.add(path) def process_IN_DELETE(self, event): print_d('Triggered for "%s"' % event.name) GLib.idle_add(self.update, event) def process_IN_MOVED_FROM(self, event): print_d('Triggered for "%s"' % event.name) GLib.idle_add(self.update, event) 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" # 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(app.library) # Choose event types to watch for # FIXME: watch for IN_CREATE or for some reason folder copies # are missed, --nickb FLAGS = ['IN_DELETE', 'IN_CLOSE_WRITE',# 'IN_MODIFY', 'IN_MOVED_FROM', 'IN_MOVED_TO', 'IN_CREATE'] mask = reduce(lambda x, s: x | EventsCodes.ALL_FLAGS[s], FLAGS, 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(): print_d('Watching directory %s for %s' % (path, FLAGS)) # See https://github.com/seb-m/pyinotify/wiki/ # Frequently-Asked-Questions wm.add_watch(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.5.3/quodlibet/ext/events/equalizer.py���������������������������������������������������0000644�0001750�0001750�00000017146�12607265240�022424� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010 Steven Robertson # 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 # # TODO: Include presets, saving and loading. from gi.repository import Gtk from quodlibet import app from quodlibet import config from quodlibet.qltk import Button, Icons from quodlibet.plugins.events import EventPlugin # Presets 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.1, 3.4, 3.4, 3.4, 3.4, 3.4, 3.4, 3.4, 2.8, 1.6, 1.8]), "full_bass_treble": (_("Full Bass & Treble"), [4.8, 4.8, 3.5, 2.5, 0.0, -7.0, -14.0, -10.0, -10.0, -8.0, 1.0, 1.0, 5.2, 7.7, 9.5]), "club": (_("Club"), [-0.2, -0.2, -0.2, -0.2, 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"), [4.8, 4.8, 4.8, 3.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.5, 4.8]), "rock": (_("Rock"), [5.3, 2.6, 2.6, -8.5, -10.5, -11.2, -16.0, -14.7, -6.6, -5.7, -3.0, 3.0, 6.7, 7.3, 7.3]), "soft": (_("Soft"), [3.2, 2.8, 0.8, 0.9, 0.0, -2.4, -4.8, 1.5, 0.0, 1.1, 3.0, 3.0, 5.8, 7.8, 7.8]), "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.4]), "classical": (_("Classical"), [-0.2, -0.2, -0.2, -0.2, -0.2, -0.2, -0.2, -0.2, -0.2, -0.2, -0.2, -0.2, -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.3, 7.0, 3.0, -1.0, -6.6, -6.3, -4.5, -4.0, 1.1, 1.2, 5.8, 7.9, 8.8]), "soft_rock": (_("Soft Rock"), [2.7, 2.7, 2.7, 1.5, 1.5, 1.4, 0.0, -3.6, -8.0, -7.2, -9.8, -8.9, -6.6, 1.4, 5.8]), "full_treble": (_("Full Treble"), [4.8, -18.6, -18.6, -18.6, -18.6, -10.0, -8.0, -6.5, 1.5, 1.5, 1.5, 8.5, 10.6, 10.6, 10.6]), "dance": (_("Dance"), [6.1, 4.3, 4.3, 1.7, 1.7, 1.7, -0.1, -0.1, -0.1, 0.8, -10.7, -14.2, -15.1, -7.2, 0.0]), "pop": (_("Pop"), [-3.4, 1.7, 2.0, 3.0, 5.0, 5.6, 6.5, 5.2, 3.2, 1.5, 0.0, -2.5, -4.8, -4.8, -3.2]), "techno": (_("Techno"), [5.0, 4.0, 3.9, 3.3, 0.0, -4.5, -10.0, -8.9, -8.1, -5.5, -1.5, 3.0, 6.0, 6.1, 5.8]), "ska": (_("Ska"), [-4.5, -8.1, -8.9, -8.5, -8.0, -6.0, 0.0, 1.5, 2.5, 2.7, 3.2, 3.3, 5.8, 6.4, 6.4]), "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: return map(float, config.get('plugins', 'equalizer_levels').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.") 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): levels[idx] = adj.get_value() config.set('plugins', 'equalizer_levels', ','.join(map(str, 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.1) adj.connect('value-changed', set_band, i) adjustments.append(adj) hs = Gtk.HScale(adjustment=adj) 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(PRESETS.iteritems()) 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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/squeezebox_sync.py���������������������������������������������0000644�0001750�0001750�00000006043�12607265240�023643� 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 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.5.3/quodlibet/ext/events/zeitgeist_client.py��������������������������������������������0000644�0001750�0001750�00000005356�12607265240�023770� 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 if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import time try: import __builtin__ # zeitgeist overrides our gettext functions old_builtin = __builtin__.__dict__.copy() from zeitgeist.client import ZeitgeistClient from zeitgeist.datamodel import Event, Subject from zeitgeist.datamodel import Interpretation, Manifestation __builtin__.__dict__.update(old_builtin) except ImportError as e: from quodlibet import plugins raise (plugins.MissingModulePluginException("zeitgeist") if hasattr(plugins, "MissingModulePluginException") else e) from quodlibet.qltk import Icons from quodlibet.plugins.events import EventPlugin class Zeitgeist(EventPlugin): PLUGIN_ID = "zeitgeist" PLUGIN_NAME = _("Event Logging") PLUGIN_DESC = _("Sends song events to the Zeitgeist event logging " "service.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP def enabled(self): self.client = ZeitgeistClient() self.__stopped_by_user = False def disabled(self): del self.client del self.__stopped_by_user def plugin_on_song_started(self, song): if self.__stopped_by_user: manifestation = Manifestation.USER_ACTIVITY else: manifestation = Manifestation.SCHEDULED_ACTIVITY self.__send_event(song, Interpretation.ACCESS_EVENT, manifestation) def plugin_on_song_ended(self, song, stopped): self.__stopped_by_user = stopped if stopped: manifestation = Manifestation.USER_ACTIVITY else: manifestation = Manifestation.SCHEDULED_ACTIVITY self.__send_event(song, Interpretation.LEAVE_EVENT, manifestation) def __send_event(self, song, interpretation, manifestation): if not song: return print_d("event: interpretation=%s, manifestation=%s" % (interpretation.__name__, manifestation.__name__)) subject = Subject.new_for_values( uri=song("~uri"), interpretation=Interpretation.AUDIO, manifestation=Manifestation.FILE_DATA_OBJECT, ) event = Event.new_for_values( timestamp=int(time.time() * 1000), interpretation=interpretation, manifestation=manifestation, actor="application://quodlibet.desktop", subjects=[subject] ) self.client.insert_event(event) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/gajim_status.py������������������������������������������������0000644�0001750�0001750�00000014573�12607265240�023116� 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> # # 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 string import join from gi.repository import Gtk import dbus from quodlibet.plugins.events import EventPlugin from quodlibet.pattern import Pattern from quodlibet.qltk import Frame from quodlibet import config 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.") 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, 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=3) pattern_box = Gtk.HBox(spacing=3) 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:"), True, 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:"), True, 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 in ['online', 'offline', 'chat', 'away', 'xa', 'invisible']: button = Gtk.CheckButton(label=status) 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) vb.pack_start(Frame(label=_("Statuses for which status message\n" "will be changed")), True, True, 0) vb.pack_start(table, True, True, 0) return vb �������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/searchprovider.py����������������������������������������������0000644�0001750�0001750�00000012504�12607265240�023434� 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 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: if SearchProvider.BUS_NAME in handle.read(): 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.NETWORK_WORKGROUP 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.5.3/quodlibet/ext/events/mpdserver/�����������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�022061� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/mpdserver/tcpserver.py�����������������������������������������0000644�0001750�0001750�00000017071�12607265240�024444� 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.5.3/quodlibet/ext/events/mpdserver/__init__.py������������������������������������������0000644�0001750�0001750�00000012620�12607265240�024161� 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 import threading from gi.repository import Gtk, GLib 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 .main import MPDServer from .tcpserver import ServerError from .avahi import AvahiService, AvahiError def fill_ip(entry): """Fill GtkEntry with the local IP. Can be called from a thread.""" 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 = "?.?.?.?" def idle_fill(): if entry.get_realized(): entry.set_text(addr) GLib.idle_add(idle_fill) 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): 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 _server = None def PluginPreferences(self, parent): table = Gtk.Table(n_rows=2, 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, 0, 1, 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(str(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, 0, 1) 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, 0, 1, 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, 1, 2, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) entry = UndoEntry() entry.set_text("...") entry.set_editable(False) table.attach(entry, 1, 3, 1, 2) threading.Thread(target=fill_ip, args=(entry,)).start() 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 1.06</a> (Android)<small> </small>\u2022 <a href="http://sonata.berlios.de/">Sonata 1.6</a> (Linux)\ """) 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, port_num) try: self._server.start() except ServerError as e: print_w(str(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(str(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.5.3/quodlibet/ext/events/mpdserver/avahi.py���������������������������������������������0000644�0001750�0001750�00000016323�12607265240�023516� 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 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.5.3/quodlibet/ext/events/mpdserver/main.py����������������������������������������������0000644�0001750�0001750�00000056013�12646426641�023361� 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 gi.repository import GObject from quodlibet import const 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 TAG_MAPPING = [ (u"Artist", "artist"), (u"ArtistSort", "artistsort"), (u"Album", "album"), (u"AlbumArtist", "albumartist"), (u"AlbumArtistSort", "albumartistsort"), (u"Title", "title"), (u"Track", "tracknumber"), (u"Name", ""), (u"Genre", "genre"), (u"Date", "~year"), (u"Composer", "composer"), (u"Performer", "performer"), (u"Comment", "commend"), (u"Disc", "discnumber"), (u"Time", "~#length"), (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: if not ql_key: continue if ql_key.startswith("~#"): value = song(ql_key, None) if value is not None: value = str(value) else: 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("[ \\t]+", line, maxsplit=1) if not parts: raise ParseError("empty command") command = parts[0] if len(parts) > 1: lex = shlex.shlex(parts[1], posix=True) lex.whitespace_split = True lex.commenters = "" lex.quotes = "\"" lex.whitespace = " \t" args = list(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 PlayerOptions(GObject.Object): """Provides a simplified interface for playback options. This should probably go into the core. """ __gsignals__ = { 'random-changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), 'repeat-changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), 'single-changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), } def __init__(self, app): super(PlayerOptions, self).__init__() self._repeat = app.window.repeat self._rid = self._repeat.connect( "toggled", lambda *x: self.emit("repeat-changed")) def order_changed(*args): self.emit("random-changed") self.emit("single-changed") self._order = app.window.order self._oid = self._order.connect("changed", order_changed) def destroy(self): self._repeat.disconnect(self._rid) del self._repeat self._order.disconnect(self._oid) del self._order def set_single(self, value): is_single = self.get_single() if value and not is_single: self._order.set_active_by_name("onesong") elif not value and is_single: self._order.set_active_by_name("inorder") def get_single(self): return self._order.get_active_name() == "onesong" def get_random(self): return self._order.get_shuffle() def set_random(self, value): self._order.set_shuffle(value) def get_repeat(self): return self._repeat.get_active() def set_repeat(self, value): self._repeat.set_active(value) class MPDService(object): """This is the actual shared MPD service which the clients talk to""" version = (0, 17, 0) def __init__(self, app): self._app = app self._connections = set() self._idle_subscriptions = {} self._idle_queue = {} self._pl_ver = 0 self._options = PlayerOptions(app) def options_changed(*args): self.emit_changed("options") self._options.connect("random-changed", options_changed) self._options.connect("repeat-changed", options_changed) self._options.connect("single-changed", 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_) self._options.destroy() del self._app del self._options 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 self._idle_subscriptions.iteritems(): # 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 self._idle_queue.iteritems(): 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.set_repeat(value) def random(self, value): self._options.set_random(value) def single(self, value): self._options.set_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.get_repeat())), ("random", int(self._options.get_random())), ("single", int(self._options.get_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"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, port): self._app = app super(MPDServer, self).__init__(port, MPDConnection, const.DEBUG) def handle_init(self): print_d("Creating the MPD service") self.service = MPDService(self._app) 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 = ".".join(map(str, service.version)) self._buf = bytearray("OK MPD %s\n" % str_version) 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.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 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("\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, unicode) self.log(u"<- " + repr(line)) self._buf.extend(line.encode("utf-8", errors="replace") + "\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 = self._commands[command] 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): def wrap(func): assert name not in cls._commands, name cls._commands[name] = (func, ack) 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") def _cmd_ping(conn, service, args): return @MPDConnection.Command("noidle") def _cmd_noidle(conn, service, args): service.unregister_idle(conn) @MPDConnection.Command("close", ack=False) 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") def _cmd_commands(conn, service, args): for name in conn.list_commands(): conn.write_line(u"command: " + unicode(name)) @MPDConnection.Command("tagtypes") def _cmd_tagtypes(conn, service, args): for mpd_key, ql_key in TAG_MAPPING: if ql_key: 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.5.3/quodlibet/ext/events/animosd/�������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�021504� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/events/animosd/config.py����������������������������������������������0000644�0001750�0001750�00000005623�12607265240�023317� 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 def str_to_tuple(s): """Raises ValueError""" lst = map(float, s.split()) while len(lst) < 4: lst.append(0.0) return tuple(lst) def tuple_to_str(t): return " ".join(map(str, t)) 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>>""") 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 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) class ColorConfProp(object): def __init__(self, conf, name, default): self._conf = conf self._name = name self._conf.defaults.set(name, tuple_to_str(default)) def __get__(self, *args, **kwargs): s = self._conf.get(self._name) try: return str_to_tuple(s) except ValueError: return str_to_tuple(self._conf.defaults.get(self._name)) def __set__(self, obj, value): self._conf.set(self._name, tuple_to_str(value)) 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.5.3/quodlibet/ext/events/animosd/prefs.py�����������������������������������������������0000644�0001750�0001750�00000024102�12607265240�023162� 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 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.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.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.5.3/quodlibet/ext/events/animosd/__init__.py��������������������������������������������0000644�0001750�0001750�00000000744�12607265240�023610� 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.5.3/quodlibet/ext/events/animosd/osdwindow.py�������������������������������������������0000644�0001750�0001750�00000025475�12607265240�024076� 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 set_ctx_source_from_pbosf, get_scale_factor, \ get_pbosf_for_pixbuf, pbosf_get_width, pbosf_get_height 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 = get_scale_factor(self) self.cover_pixbuf = app.cover_manager.get_pixbuf( song, conf.coversize * scale_factor, conf.coversize * scale_factor) coverheight = 0 coverwidth = 0 if self.cover_pixbuf: self.cover_pixbuf = get_pbosf_for_pixbuf(self, self.cover_pixbuf) coverwidth = self.cover_pixbuf.get_width() // scale_factor coverheight = self.cover_pixbuf.get_height() // scale_factor textwidth -= coverwidth + self.BORDER 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_pixbuf is not None: rect = self.cover_rectangle textx += rect.width + self.BORDER pbuf = self.cover_pixbuf 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() set_ctx_source_from_pbosf(cr, pbuf) transmat.scale(pbosf_get_width(pbuf) / float(rect.width), pbosf_get_height(pbuf) / 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.5.3/quodlibet/ext/events/animosd/main.py������������������������������������������������0000644�0001750�0001750�00000005511�12607265240�022772� 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 Gdk, GLib from quodlibet.plugins.events import EventPlugin 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.") __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.5.3/quodlibet/ext/events/rbimport.py����������������������������������������������������0000644�0001750�0001750�00000010201�12607265240�022242� 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 quodlibet import app from quodlibet import util from quodlibet.qltk.msg import WarningMessage, ErrorMessage from quodlibet.util.uri import URI 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: p_uri = URI(uri) except ValueError: return if not p_uri.is_filename: return self._process_song(normalize_path(p_uri.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.") 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.5.3/quodlibet/ext/events/jep118.py������������������������������������������������������0000644�0001750�0001750�00000003023�12646426641�021427� 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 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: f = file(outfile, "w") f.write("") except EnvironmentError: pass else: f.close() else: try: f = file(outfile, "wb") 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 else: f.close() quodlibet-3.5.3/quodlibet/ext/events/mediaserver.py0000644000175000017500000005465012646426641022741 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 import dbus import dbus.service from quodlibet import app from quodlibet.plugins.events import EventPlugin from quodlibet.pattern import Pattern from quodlibet.qltk import Icons from quodlibet.util.uri import URI from quodlibet.util.dbusutils import DBusIntrospectable, DBusProperty from quodlibet.util.dbusutils import dbus_unicode_validate as unival 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 self.__library.itervalues()) self.__reverse = dict((v, k) for k, v in self.__map.iteritems()) self.__song = DummySongObject(self) self.__users = users signals = [ ("changed", self.__songs_changed), ("removed", self.__songs_removed), ("added", self.__songs_added), ] self.__sigs = map(lambda (s, f): self.__library.connect(s, f), 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 self.__library.itervalues()) self.__reverse = dict((v, k) for k, v in self.__map.iteritems()) signals = [ ("changed", self.__albums_changed), ("removed", self.__albums_removed), ("added", self.__albums_added), ] self.__sigs = map(lambda (s, f): self.__library.connect(s, f), 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 [URI.frompath(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.5.3/quodlibet/ext/events/screensaver.py�������������������������������������������������0000644�0001750�0001750�00000005427�12607265240�022742� 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 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.5.3/quodlibet/ext/events/qlscrobbler.py�������������������������������������������������0000644�0001750�0001750�00000050406�12607265240�022731� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # QLScrobbler: an Audioscrobbler client plugin for Quod Libet. # version 0.11 # (C) 2005-2012 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> # Licensed under GPLv2. See Quod Libet's COPYING for more information. from httplib import HTTPException import cPickle as pickle import os import threading import time import urllib import urllib2 from gi.repository import Gtk, GLib try: from hashlib import md5 except ImportError: from md5 import md5 import quodlibet 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, QueryValidator from quodlibet.qltk.msg import Message from quodlibet.qltk import Icons from quodlibet.util.dprint import print_d 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: disk_queue_file = open(self.DUMP, 'r') disk_queue = pickle.load(disk_queue_file) disk_queue_file.close() os.unlink(self.DUMP) self.queue += disk_queue except Exception: pass @classmethod def dump_queue(klass): if klass.queue: try: disk_queue_file = open(klass.DUMP, 'w') pickle.dump(klass.queue, disk_queue_file) disk_queue_file.close() except IOError: pass return 0 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 = urllib2.urlopen(url) except (IOError, HTTPException): 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(status, Gtk.MessageType.ERROR) self.changed() return False def _check_submit(self, url, data): data_str = urllib.urlencode(data) try: resp = urllib2.urlopen(url, data_str) except (IOError, HTTPException): 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.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.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(QueryValidator) 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.5.3/quodlibet/ext/songsmenu/������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020564� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/filterbrowser.py��������������������������������������������0000644�0001750�0001750�00000001710�12607265240�024014� 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 app from quodlibet import browsers 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 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.5.3/quodlibet/ext/songsmenu/wikipedia.py������������������������������������������������0000644�0001750�0001750�00000004210�12607265240�023067� 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 urllib import quote from gi.repository import Gtk 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 WIKI_URL = "http://%s.wikipedia.org/wiki/" def get_lang(): return config.get("plugins", __name__, "en") def set_lang(value): config.set("plugins", __name__, value) class WikiSearch(object): PLUGIN_ICON = Icons.DOCUMENT_OPEN @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": "http://"}), 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.5.3/quodlibet/ext/songsmenu/website_search.py�������������������������������������������0000644�0001750�0001750�00000013366�12607265240�024124� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011, 2012, 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 quodlibet from quodlibet import print_w, print_d, 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 from urllib import quote_plus from gi.repository import Gtk import os from quodlibet.util.uri import URI 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.DOCUMENT_OPEN 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": "http://google.com?q=<~artist~title>"} # Here are some starters... # Sorry, PEP-8 : sometimes you're unrealistic DEFAULT_URL_PATS = [ ("Google song search", "http://google.com/search?q=<artist~title>"), ("Wikipedia (en) artist entry", "http://wikipedia.org/wiki/<albumartist|<albumartist>|<artist>>"), ("Musicbrainz album listing", "http://musicbrainz.org/<musicbrainz_albumid|release/" "<musicbrainz_albumid>|search?query=<album>&type=release>"), ("Discogs album search", "http://www.discogs.com/search?type=release&artist=" "<albumartist|<albumartist>|<artist>>&title=<album>"), ("Youtube video search", "https://www.youtube.com/results?search_query=<artist~title>"), ] 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) u = URI(s) return (p and u.netloc and u.scheme in ["http", "https", "ftp", "file"]) 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, context=self) 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: subs[k] = quote_plus(unicode(vals).encode('utf-8')) # 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.5.3/quodlibet/ext/songsmenu/fingerprint/������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�023113� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/fingerprint/util.py�����������������������������������������0000644�0001750�0001750�00000002217�12607265240�024432� 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.5.3/quodlibet/ext/songsmenu/fingerprint/__init__.py�������������������������������������0000644�0001750�0001750�00000005632�12607265240�025220� 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 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 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 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 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 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.5.3/quodlibet/ext/songsmenu/fingerprint/search.py���������������������������������������0000644�0001750�0001750�00000034635�12607265240�024733� 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.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.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.5.3/quodlibet/ext/songsmenu/fingerprint/submit.py���������������������������������������0000644�0001750�0001750�00000014517�12607265240�024766� 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 from gi.repository import Gtk, Pango, GLib from quodlibet.qltk import Button, Window from quodlibet.util import connect_obj 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(filter(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(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( 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.5.3/quodlibet/ext/songsmenu/fingerprint/analyze.py��������������������������������������0000644�0001750�0001750�00000016220�12607265240�025117� 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 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.5.3/quodlibet/ext/songsmenu/fingerprint/acoustid.py�������������������������������������0000644�0001750�0001750�00000025777�12607265240�025310� 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 urllib import urllib2 import socket import Queue import StringIO import gzip from xml.dom.minidom import parseString from gi.repository import GLib from .util import get_api_key, GateKeeper APP_KEY = "C6IduH7D" gatekeeper = GateKeeper(requests_per_sec=3) class AcoustidSubmissionThread(threading.Thread): URL = "http://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 = urllib.urlencode({ "format": "xml", "client": APP_KEY, "user": get_api_key(), }) urldata = "&".join([basedata] + map(urllib.urlencode, urldata)) obj = StringIO.StringIO() gzip.GzipFile(fileobj=obj, mode="wb").write(urldata) urldata = obj.getvalue() headers = { "Content-Encoding": "gzip", "Content-type": "application/x-www-form-urlencoded" } req = urllib2.Request(self.URL, urldata, headers) error = None try: response = urllib2.urlopen(req, timeout=self.TIMEOUT) except (urllib2.URLError, socket.timeout) 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 track.iteritems(): # 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 = "http://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(urllib.urlencode({ "format": "json", "client": APP_KEY, "batch": "1", })) for i, result in enumerate(results): postfix = ".%d" % i req_data.append(urllib.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 = StringIO.StringIO() gzip.GzipFile(fileobj=obj, mode="wb").write(urldata) urldata = obj.getvalue() headers = { "Content-Encoding": "gzip", "Content-type": "application/x-www-form-urlencoded" } req = urllib2.Request(self.URL, urldata, headers) releases = {} error = "" try: response = urllib2.urlopen(req, timeout=self.TIMEOUT) except (urllib2.URLError, socket.timeout) 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.5.3/quodlibet/ext/songsmenu/ape2id3.py��������������������������������������������������0000644�0001750�0001750�00000002053�12607265240�022353� 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 mutagen.apev2 from quodlibet.formats._apev2 import APEv2File from quodlibet.plugins.songsmenu import SongsMenuPlugin 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.") def plugin_handles(self, songs): for song in songs: if not song.get("~filename", "").lower().endswith(".mp3"): return False return True 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"]) song._song.write() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/bookmarks.py������������������������������������������������0000644�0001750�0001750�00000005066�12607265240�023123� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig, 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 Gtk from quodlibet import app from quodlibet import qltk 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 = _("Lists all bookmarks in the selected files.") PLUGIN_ICON = Icons.GO_JUMP def __init__(self, songs, *args, **kwargs): super(Bookmarks, 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) 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) get_position = lambda *x: 0 def __map(self, menu, songs): 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 __unmap(self, menu): for child in self.__menu.get_children(): self.__menu.remove(child) def plugin_songs(self, songs): pass ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/lyricwiki.py������������������������������������������������0000644�0001750�0001750�00000015035�12607265240�023136� 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 sys import urllib import urllib2 import threading import socket import Queue from xml.dom import minidom from quodlibet.plugins import PluginImportException, \ PluginNotSupportedError if os.name == "nt" or sys.platform == "darwin": raise PluginNotSupportedError import gi try: gi.require_version("WebKit", "3.0") except ValueError as e: raise PluginImportException("GObject Introspection: " + str(e)) from gi.repository import WebKit, Gtk, GLib from quodlibet import app from quodlibet.util import DeferredSignal, escape from quodlibet.qltk.window import Window from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin class SearchThread(threading.Thread): TIMEOUT = 4.0 def __init__(self): super(SearchThread, 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 acitve searchs, 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""" artist, title = song("artist"), song("title") artist = urllib.quote(artist.encode('utf-8')) title = urllib.quote(title.encode('utf-8')) url = ("http://lyrics.wikia.com/api.php?client=QuodLibet&func=getSong" "&artist=%s&song=%s&fmt=xml") fetch_url = url % (artist, title) try: response = urllib2.urlopen(fetch_url, timeout=self.TIMEOUT) except (urllib2.URLError, socket.timeout): 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 LyricWikiWindow(Window): def __init__(self, parent): super(LyricWikiWindow, self).__init__( default_width=500, default_height=500, dialog=False) self.set_transient_for(parent) self._thread = SearchThread() self.connect("destroy", lambda *x: self._thread.stop()) sw = Gtk.ScrolledWindow() self.add(sw) self._view = view = WebKit.WebView() settings = view.get_settings() # for the mobile version settings.set_property("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")) def scroll_tp_lyrics(view, *args): view.execute_script(""" document.addEventListener('DOMContentLoaded', function() { var box = document.getElementsByClassName('lyricbox')[0]; box.scrollIntoView(true); }, false); """) view.connect('load-committed', scroll_tp_lyrics) # block messages view.connect("console-message", lambda *x: True) sw.add(view) sw.show_all() def set_song(self, song): """Display lyrics for the given 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 enable_tracking(self, player): """Follow the active playing song""" # for tracking wait a bit to not produce lots of http requests defer_set = DeferredSignal(self.set_song, owner=self, timeout=50) def next_handler(player, song): defer_set(song) id_ = player.connect("song-started", next_handler) self.connect("destroy", lambda *x: player.disconnect(id_)) 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_string(html, "http://foo.bar") def _callback(self, song, page): if page is None: message = _("No lyrics found") 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) class LyricWiki(SongsMenuPlugin): PLUGIN_ID = 'lyricwiki' PLUGIN_NAME = _('Lyrics Window') PLUGIN_DESC = _("Shows a window containing lyrics of the playing song.") PLUGIN_ICON = Icons.EDIT_FIND _window = None def _destroy(self, *args): type(self)._window = None def plugin_songs(self, songs): if not songs: return song = songs[0] if not self._window: window = LyricWikiWindow(parent=self.plugin_window) window.show() window.connect("destroy", self._destroy) type(self)._window = window window.enable_tracking(app.player) else: window = self._window window.set_song(song) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/duplicates.py�����������������������������������������������0000644�0001750�0001750�00000040777�12607265240�023300� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # # Duplicates songs plugin. # # Copyright (C) 2012, 2011 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 string import unicodedata 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.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 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: # print_w("Couldn't delete song %s" % song) 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 """ #print_d("Trying to add %s to group \"%s\"" % (song("~filename"), key)) 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): #print_d("Duplicates: told to go to %r" % song, context=self) 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", context=self) 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) 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 = ngettext("%d duplicate group", "%d duplicate groups", len(model)) % 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): for row in model: view.collapse_row(row.path) break 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() class Duplicates(SongsMenuPlugin, PluginConfigMixin): PLUGIN_ID = 'Duplicates' PLUGIN_NAME = _('Duplicates Browser') PLUGIN_DESC = _('Finds and displays similarly tagged versions of songs.') PLUGIN_ICON = Icons.MEDIA_PLAYBACK_START 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' # Cached values key_expression = None __cfg_cache = {} # Faster than a speeding bullet __trans = string.maketrans("", "") @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 filter(lambda c: not unicodedata.combining(c), unicodedata.normalize('NFKD', unicode(s))) @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 = str(key).translate(cls.__trans, string.punctuation) 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...", self) groups = {} for song in songs: key = self.get_key(song) if key and key in groups: 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.5.3/quodlibet/ext/songsmenu/filterall.py������������������������������������������������0000644�0001750�0001750�00000006227�12607265240�023111� 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.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_SELECT_ALL def plugin_songs(self, songs): browser = self.plugin_window.browser if not browser.can_filter_text(): return keys = set() for song in songs: keys.update(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.5.3/quodlibet/ext/songsmenu/forcewrite.py�����������������������������������������������0000644�0001750�0001750�00000001232�12607265240�023273� 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.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin class ForceWrite(SongsMenuPlugin): PLUGIN_ID = "Force Write" PLUGIN_NAME = _("Force Write") PLUGIN_DESC = _("Saves the files again. This will make sure play counts " "and ratings are up to date.") PLUGIN_ICON = Icons.DOCUMENT_SAVE def plugin_song(self, song): song._needs_write = True ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/splitting.py������������������������������������������������0000644�0001750�0001750�00000003476�12607265240�023153� 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.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.string.splitters import split_title, split_album from quodlibet.qltk import Icons 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 def plugin_song(self, song): if ("title" in song and song.can_change("title") and song.can_change("version")): title, versions = split_title(song["title"]) if title: song["title"] = title if versions: song["version"] = "\n".join(versions) if ("album" in song and "discnumber" not in song and song.can_change("album") and song.can_change("discnumber")): 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 def plugin_song(self, song): if ("album" in song and "discnumber" not in song and song.can_change("album") and song.can_change("discnumber")): album, disc = split_album(song["album"]) if album: song["album"] = album if disc: song["discnumber"] = disc ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/replaygain.py�����������������������������������������������0000644�0001750�0001750�00000052532�12607265240�023266� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # ReplayGain Album Analysis using gstreamer rganalysis element # Copyright (C) 2005,2007,2009 Michael Urman # 2012,14 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 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.util import cached_property __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) @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 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)d</b> album to update (of %(all)d)", "There are <b>%(to-process)d</b> albums to update (of %(all)d)", num_to_process) info.set_markup(template % { "to-process": num_to_process, "all": 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.MEDIA_PLAYBACK_START CONFIG_SECTION = 'replaygain' 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.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.5.3/quodlibet/ext/songsmenu/brainz.py���������������������������������������������������0000644�0001750�0001750�00000047042�12607265240�022420� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # brainz.py - Quod Libet plugin to tag files from MusicBrainz automatically # 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 os import re import threading import time from gi.repository import Gtk, GObject, Pango, GLib try: from musicbrainz2 import webservice as ws from musicbrainz2.utils import extractUuid except ImportError as e: from quodlibet import plugins raise (plugins.MissingModulePluginException("musicbrainz2") if hasattr(plugins, "MissingModulePluginException") else e) from quodlibet import config, util from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk import Dialog, Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk.views import HintedTreeView, MultiDragTreeView VARIOUS_ARTISTS_ARTISTID = '89ad4ac3-39f7-470e-963a-56509c546377' 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 config_get(key, default=''): return config.getboolean('plugins', 'brainz_' + key, default) class ResultTreeView(HintedTreeView, MultiDragTreeView): """The result treeview. The model only stores local tracks; info about remote results is pulled from self.remote_album.""" def __name_datafunc(self, col, cell, model, itr, data): song = model[itr][0] if song: cell.set_property('text', os.path.basename(song.get("~filename"))) else: cell.set_property('text', '') def __track_datafunc(self, col, cell, model, itr, data): idx = model.get_path(itr)[0] if idx >= len(self.remote_album): cell.set_property('text', '') else: cell.set_property('text', str(idx + 1)) def __title_datafunc(self, col, cell, model, itr, data): idx = model.get_path(itr)[0] if idx >= len(self.remote_album): cell.set_property('text', '') else: cell.set_property('text', self.remote_album[idx].title) def __artist_datafunc(self, col, cell, model, itr, data): idx = model.get_path(itr)[0] if idx >= len(self.remote_album) or not self.remote_album[idx].artist: cell.set_property('text', '') else: cell.set_property('text', self.remote_album[idx].artist.name) def __init__(self, album): self.album = album self.remote_album = [] self.model = Gtk.ListStore(object) for song in album: self.model.append([song]) 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) cols = [ (_('Filename'), self.__name_datafunc, True), (_('Track'), self.__track_datafunc, False), (_('Title'), self.__title_datafunc, True), (_('Artist'), self.__artist_datafunc, True), ] for title, func, resize in cols: render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) 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 update_remote_album(self, remote_album): """Updates the TreeView, handling results with a different number of tracks than the album being tagged.""" for i in range(len(self.model), len(remote_album)): self.model.append((None, )) for i in range(len(self.model), len(remote_album), -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.remote_album = remote_album has_artists = bool(filter(lambda t: t.artist, remote_album)) col = self.get_column(3) # sometimes gets called after the treeview is already gone if not col: return col.set_visible(has_artists) self.columns_autosize() self.queue_draw() 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[iter][0] if not release: return date = release.getEarliestReleaseDate() if date: date = '%s, ' % date else: date = '' markup = "<b>%s</b>\n%s - %s%s tracks" % ( util.escape(release.title), util.escape(release.artist.name), date, release.tracksCount) cell.set_property('markup', markup) self.pack_start(render, True) self.set_cell_data_func(render, celldata, None) class ReleaseEventComboBox(Gtk.HBox): """A ComboBox for picking a release event.""" def __init__(self): super(ReleaseEventComboBox, self).__init__() self.model = Gtk.ListStore(object, str) self.combo = Gtk.ComboBox(model=self.model) render = Gtk.CellRendererText() self.combo.pack_start(render, True) self.combo.add_attribute(render, "markup", 1) self.combo.set_sensitive(False) self.label = Gtk.Label(label=_("_Release:"), use_underline=True) self.label.set_use_underline(True) self.label.set_mnemonic_widget(self.combo) self.pack_start(self.label, False, True, 0) self.pack_start(self.combo, True, True, 0) def update(self, release): self.model.clear() events = release.getReleaseEvents() # The catalog number is the most important of these fields, as it's # the source for the 'labelid' tag, which we'll use until MB NGS is # up and running to deal with multi-disc albums properly. We sort to # find the earliest release with a catalog number. events.sort(key=lambda e: (bool(not e.getCatalogNumber()), e.getDate() or '9999-12-31')) for rel_event in events: text = '%s %s: <b>%s</b> <i>(%s)</i>' % ( rel_event.getDate() or '', rel_event.getLabel() or '', rel_event.getCatalogNumber(), rel_event.getCountry()) self.model.append((rel_event, text)) if len(events) > 0: self.combo.set_active(0) self.combo.set_sensitive((len(events) > 0)) text = ngettext("%d _release:", "%d _releases:", len(events)) self.label.set_text(text % len(events)) self.label.set_use_underline(True) def get_release_event(self): itr = self.combo.get_active_iter() if itr: return self.model[itr][0] else: return None 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: res = None def idle_check(cb, res): if self.running: cb(res) GLib.idle_add(idle_check, callback, res) time.sleep(1) class SearchWindow(Dialog): def __save(self, widget=None, response=None): """Writes values to Song objects.""" self._qthread.stop() if response != Gtk.ResponseType.ACCEPT: self.destroy() return album = self.current_release shared = {} shared['album'] = album.title if config_get('split_disc', True): m = re.match(r'(.*) \(disc (.*?)\)$', album.title) if m: shared['album'] = m.group(1) disc = m.group(2).split(': ', 1) shared['discnumber'] = disc[0] if len(disc) > 1: shared['discsubtitle'] = disc[1] relevt = self.release_combo.get_release_event() shared['date'] = relevt and relevt.getDate() or '' if shared['date'] and config_get('year_only', False): shared['date'] = shared['date'].split('-')[0] if config_get('labelid', True): if relevt and relevt.getCatalogNumber(): shared['labelid'] = relevt.getCatalogNumber() if not album.isSingleArtistRelease(): if (config_get('albumartist', True) and extractUuid(album.artist.id) != VARIOUS_ARTISTS_ARTISTID): shared['albumartist'] = album.artist.name if config_get('artist_sort', False) and \ album.artist.sortName != album.artist.name: shared['albumartistsort'] = album.artist.sortName if config_get('standard', True): shared['musicbrainz_albumartistid'] = extractUuid(album.artist.id) shared['musicbrainz_albumid'] = extractUuid(album.id) for idx, (song, ) in enumerate(self.result_treeview.model): if song is None: continue song.update(shared) if idx >= len(album.tracks): continue track = album.tracks[idx] song['title'] = track.title song['tracknumber'] = '%d/%d' % (idx + 1, max(len(album.tracks), len(self.result_treeview.model))) if config_get('standard', True): song['musicbrainz_trackid'] = extractUuid(track.id) if album.isSingleArtistRelease() or not track.artist: song['artist'] = album.artist.name if config_get('artist_sort', False) and \ album.artist.sortName != album.artist.name: song['artistsort'] = album.artist.sortName else: song['artist'] = track.artist.name if config_get('artist_sort', False) and \ track.artist.sortName != track.artist.name: song['artistsort'] = track.artist.sortName if config_get('standard', True): song['musicbrainz_artistid'] = extractUuid(track.artist.id) if config_get('split_feat', False): feats = re.findall(r' \(feat\. (.*?)\)', track.title) if feats: feat = [] for value in feats: values = value.split(', ') if len(values) > 1: values += values.pop().split(' & ') feat += values song['performer'] = '\n'.join(feat) song['title'] = re.sub(r' \(feat\. .*?\)', '', track.title) self.destroy() def __do_query(self, *args): """Search for album using the query text.""" query = 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…")) filt = ws.ReleaseFilter(query=query) self._qthread.add(self.__process_results, self._query.getReleases, filt) def __process_results(self, results): """Callback for search query completion.""" 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 for release in map(lambda r: r.release, results): self._resultlist.append((release, )) if len(results) > 0 and self.result_combo.get_active() == -1: 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 rel_id = self._resultlist[idx][0].id if rel_id in self._releasecache: self.__update_results(self._releasecache[rel_id]) else: self.result_label.set_markup("<i>%s</i>" % _(u"Loading result…")) inc = ws.ReleaseIncludes( artist=True, releaseEvents=True, tracks=True) self._qthread.add(self.__update_result, self._query.getReleaseById, rel_id, inc) def __update_result(self, release): """Callback for release detail download from result combo.""" num_results = len(self._resultlist) text = ngettext("Found %d result.", "Found %d results.", num_results) self.result_label.set_text(text % num_results) # issue 973: search can return invalid (or removed) ReleaseIDs if release is None: return self._releasecache.setdefault(extractUuid(release.id), release) self.result_treeview.update_remote_album(release.tracks) self.current_release = release self.release_combo.update(release) save_button = self.get_widget_for_response(Gtk.ResponseType.ACCEPT) save_button.set_sensitive(True) def __init__(self, parent, album, cache): self.album = album self._query = ws.Query() self._resultlist = Gtk.ListStore(GObject.TYPE_PYOBJECT) self._releasecache = cache 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) alb = '"%s"' % album[0].comma("album").replace('"', '') art = get_artist(album) if art: alb = '%s AND artist:"%s"' % (alb, art.replace('"', '')) sq.set_text('%s AND tracks:%d' % (alb, get_trackcount(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) hb = Gtk.HBox() hb.set_spacing(8) self.release_combo = ReleaseEventComboBox() vb.pack_start(self.release_combo, False, True, 0) self.get_content_area().pack_start(vb, True, True, 0) self.connect('response', self.__save) stb.emit('clicked') self.get_child().show_all() 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.') cache = {} 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, self.cache) win.connect("destroy", win_finished_cb) win.show() start_processing(albums.pop(0)) @classmethod def PluginPreferences(self, win): items = [ ('split_disc', _('Split _disc from album'), True), ('split_feat', _('Split _featured performers from track'), False), ('year_only', _('Only use year for "date" tag'), False), ('albumartist', _('Write "_albumartist" when needed'), True), ('artist_sort', _('Write sort tags for artist names'), False), ('standard', _('Write _standard MusicBrainz tags'), True), ('labelid', _('Write _labelid tag (fixes multi-disc albums)'), True), ] vb = Gtk.VBox() vb.set_spacing(8) for key, label, default in items: ccb = ConfigCheckButton(label, 'plugins', 'brainz_' + key) ccb.set_active(config_get(key, default)) vb.pack_start(ccb, True, True, 0) return vb ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/albumart.py�������������������������������������������������0000644�0001750�0001750�00000067046�12646426641�022757� 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-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 import time import threading import gzip import urllib import urllib2 from cStringIO import StringIO from xml.dom import minidom from gi.repository import Gtk, Pango, GLib, Gdk, GdkPixbuf from quodlibet.pattern import ArbitraryExtensionFileFromPattern from quodlibet.plugins import PluginConfigMixin from quodlibet.util import format_size, print_exc from quodlibet.util.dprint import print_d from quodlibet import util, qltk, print_w, 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 (set_renderer_from_pbosf, get_scale_factor, get_pbosf_for_pixbuf, set_image_from_pbosf, scale, add_border_widget) from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.path import iscommand 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_' 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={}, get={}): post_params = urllib.urlencode(post) get_params = urllib.urlencode(get) if get: get_params = '?' + get_params # add post, get data and headers url = '%s%s' % (url, get_params) if post_params: request = urllib2.Request(url, post_params) else: request = urllib2.Request(url) # for discogs request.add_header('Accept-Encoding', 'gzip') request.add_header('User-Agent', USER_AGENT) url_sock = urllib2.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=StringIO(data)).read() url_sock.close() return data, enc def get_encoding(url): request = urllib2.Request(url) request.add_header('Accept-Encoding', 'gzip') request.add_header('User-Agent', USER_AGENT) url_sock = urllib2.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 = 0 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 = 'http://webservices.amazon.com/onca/xml' url = 'http://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, enc = 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') 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'] = 'http://www.amazon.com' self.covers.append(cover) def start(self, query, limit=10): """Start the search and returns the covers""" self.page_count = 0 self.covers = [] self.limit = limit self.__parse_page(1, query) if len(self.covers) < limit: for page in xrange(2, self.page_count + 1): self.__parse_page(page, query) if len(self.covers) >= limit: break 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) 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.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.decode("utf-8")) 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]) 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(): set_image_from_pbosf(self.image, pixbuf) GLib.idle_add(idle_set) def __scale_pixbuf(self, *data): if not self.current_pixbuf: return pixbuf = self.current_pixbuf if not self.window_fit.get_active(): pbosf = pixbuf else: alloc = self.scrolled.get_allocation() width = alloc.width height = alloc.height scale_factor = get_scale_factor(self) boundary = (width * scale_factor, height * scale_factor) pixbuf = scale(pixbuf, boundary, scale_up=False) pbosf = get_pbosf_for_pixbuf(self, pixbuf) set_image_from_pbosf(self.image, pbosf) 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 = StringIO() try: request = urllib2.Request(url) request.add_header('User-Agent', USER_AGENT) url_sock = urllib2.urlopen(request) except urllib2.HTTPError: 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): pbosf = model[iter_][0] set_renderer_from_pbosf(cell, pbosf) 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 = get_scale_factor(self) * 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) if songs[0]('albumartist'): text = songs[0]('albumartist') else: text = songs[0]('artist') text += ' - ' + songs[0]('album') 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(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'])[0]) pbloader.close() scale_factor = get_scale_factor(self) 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, None, round=True) thumb = get_pbosf_for_pixbuf(self, pixbuf) except (GLib.GError, IOError): pass else: def append(data): self.liststore.append(data) GLib.idle_add(append, [thumb, 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 self.overall_limit = 7 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, self.overall_limit) 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(lambda x, y: len(y) - len(x)) p_split = p_split[:max(len(p_split) / 4, max(4 - len(p_split), 2))] new_query += ' '.join(p_split) + ' ' return new_query.rstrip() #------------------------------------------------------------------------------ def get_size_of_url(url): request = urllib2.Request(url) request.add_header('Accept-Encoding', 'gzip') request.add_header('User-Agent', USER_AGENT) url_sock = urllib2.urlopen(request) size = url_sock.headers.get('content-length') url_sock.close() return format_size(int(size)) if size else '' #------------------------------------------------------------------------------ engines = [ { 'class': AmazonParser, 'url': 'http://www.amazon.com/', 'replace': ' ', 'config_id': 'amazon', }, ] #------------------------------------------------------------------------------ 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.EDIT_FIND CONFIG_SECTION = PLUGIN_CONFIG_SECTION @classmethod def PluginPreferences(cls, window): table = Gtk.Table(n_rows=len(engines), n_columns=2) 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.5.3/quodlibet/ext/songsmenu/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�022654� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/lastfmsync.py�����������������������������������������������0000644�0001750�0001750�00000024653�12646426641�023330� 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 import os import shelve import urllib import urllib2 import time from datetime import date from threading import Thread from gi.repository import Gtk, GLib import quodlibet from quodlibet import config, util, qltk from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin try: import json except ImportError: import simplejson as json API_KEY = "f536cdadb4c2aec75ae15e2b719cb3a1" def log(msg): 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(["http://ws.audioscrobbler.com/2.0/?", urllib.urlencode(real_args)]) log(url) uobj = urllib2.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.""" def __init__(self, username): self.username = username self.lastupdated = None 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 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')) 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 urllib2.HTTPError, 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.VIEW_REFRESH 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.5.3/quodlibet/ext/songsmenu/html.py�����������������������������������������������������0000644�0001750�0001750�00000004454�12607265240�022077� 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 gi.repository import Gtk from quodlibet.util import tag, escape from quodlibet.qltk.songlist import get_columns from quodlibet.plugins.songsmenu import SongsMenuPlugin 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(unicode(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.") def plugin_songs(self, songs): if not songs: return chooser = Gtk.FileChooserDialog( title="Export to HTML", action=Gtk.FileChooserAction.SAVE) chooser.add_button(_("_Cancel"), Gtk.ResponseType.REJECT) chooser.add_button(_("_OK"), Gtk.ResponseType.ACCEPT) chooser.set_default_response(Gtk.ResponseType.ACCEPT) resp = chooser.run() if resp != Gtk.ResponseType.ACCEPT: chooser.destroy() return fn = chooser.get_filename() chooser.destroy() with open(fn, "wb") as f: f.write(to_html(songs).encode("utf-8")) quodlibet-3.5.3/quodlibet/ext/songsmenu/embedded.py0000644000175000017500000000524012607265240022656 0ustar lazkalazka00000000000000# -*- 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 quodlibet import app from quodlibet.qltk.x import MenuItem from quodlibet.qltk import Icons from quodlibet.qltk.wlw import WritingWindow from quodlibet.formats._image import EmbeddedImage 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.EDIT 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: song.clear_images() 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: song.set_image(image) 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 def plugin_handles(self, songs): # if any song supports editing, we are active for song in songs: if song.can_change_images: return True return False quodlibet-3.5.3/quodlibet/ext/songsmenu/exact_rating.py0000644000175000017500000000320012607265240023567 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2014 Jan Path # 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.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.") 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.5.3/quodlibet/ext/songsmenu/openwith.py0000644000175000017500000000365012607265240022765 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- from gi.repository import Gtk from quodlibet import util from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.path import iscommand from quodlibet.util import connect_obj class Command(object): FILES, URIS, FOLDERS = range(3) def __init__(self, title, command, type): self.title = title self.command = command self.type = type def exists(self): return iscommand(self.command.split()[0]) def run(self, songs): if self.type == self.FOLDERS: files = [song("~dirname") for song in songs] elif self.type == self.FILES: files = [song("~filename") for song in songs] elif self.type == self.URIS: files = [song("~uri") for song in songs] files = dict.fromkeys(files).keys() util.spawn(self.command.split() + files) class SendTo(SongsMenuPlugin): PLUGIN_ID = 'SendTo' PLUGIN_NAME = _(u'Send To…') PLUGIN_DESC = _("Generic file-opening plugin.") PLUGIN_ICON = Icons.SYSTEM_RUN commands = [ Command("K3B", "k3b --audiocd", Command.FILES), Command("Thunar", "thunar", Command.FOLDERS), ] def __init__(self, *args, **kwargs): super(SendTo, self).__init__(*args, **kwargs) self.command = None submenu = Gtk.Menu() for command in self.commands: item = Gtk.MenuItem(label=command.title) if not command.exists(): item.set_sensitive(False) else: connect_obj(item, 'activate', self.__set, command) submenu.append(item) if submenu.get_children(): self.set_submenu(submenu) else: self.set_sensitive(False) def __set(self, command): self.command = command def plugin_songs(self, songs): if self.command: self.command.run(songs) quodlibet-3.5.3/quodlibet/ext/songsmenu/custom_commands.py0000644000175000017500000002102312646426641024324 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2012-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 import os import re import quodlibet from quodlibet import qltk from quodlibet import util from quodlibet.pattern import Pattern from quodlibet.plugins import PluginConfigMixin 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 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")), "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=100): 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): """ Runs this command on `songs`, splitting into multiple calls if necessary """ args = [] if self.parameter: value = GetStringDialog(None, _("Input value"), _("Value for %s?") % self.parameter).run() self.command = self.command.format(**{self.parameter: value}) print_d("Actual command=%s" % self.command) for song in songs: arg = str(self.__pat.format(song)) 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:] def __str__(self): return "Command= {command} {pattern}".format(**dict(self.data)) class CustomCommands(SongsMenuPlugin, PluginConfigMixin): PLUGIN_ICON = Icons.DOCUMENT_OPEN PLUGIN_ID = "CustomCommands" PLUGIN_NAME = _("Custom Commands") PLUGIN_DESC = _("Runs custom commands (in batches if required) on songs " "using any of their tags.") _TUPLE_DEF = "\s*\('([^']*)'%s\)" % ("(?:,\s*'([^']*)')?" * 5) _TUPLE_REGEX = re.compile(_TUPLE_DEF) # Here are some starters... DEFAULT_COMS = [ Command("Compress files", "file-roller -d"), Command("K3B", "k3b --audiocd"), Command("Browse folders (Thunar)", "thunar", "<~dirname>", unique=True, max_args=50, warn_threshold=20), Command(name="Flash notification", command="notify-send" " -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("Fix MP3 VBR with mp3val", "mp3val -f", unique=True, max_args=1), ] COMS_FILE = os.path.join( quodlibet.get_user_dir(), 'lists', 'customcommands.json') def __set_pat(self, name): self.com_index = name def get_data(self, key): """Gets the pattern for a given key""" try: return self.commands[key] except (KeyError, TypeError): print_d("Invalid key %s" % key) return None @classmethod def edit_patterns(cls, button): cls.commands = cls._get_saved_searches() win = JSONBasedEditor(Command, cls.commands, filename=cls.COMS_FILE, title=_("Edit Custom Commands")) 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(util.escape(_("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 _get_saved_searches(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: pass except 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 = dict([(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__(*args, **kwargs) self.com_index = None self.unique_only = False self.commands = {} submenu = Gtk.Menu() self.commands = self._get_saved_searches() for (name, c) in self.commands.items(): item = Gtk.MenuItem(label=name) connect_obj(item, 'activate', self.__set_pat, name) submenu.append(item) # Add link to editor 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): # Check this is a launch, not a configure if self.com_index: com = self.get_data(self.com_index) print_d("Running %s" % com) try: com.run(songs) except Exception, err: print_e("Couldn't run command %s: %s %s at" % (com.name, type(err), err)) ErrorMessage( self.plugin_window, _("Unable to run custom command %s" % util.escape(self.com_index)), util.escape(str(err))).run() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/cddb.py�����������������������������������������������������0000644�0001750�0001750�00000022754�12646426641�022041� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Michael Urman # 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 if os.name == "nt": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError try: import CDDB except ImportError as e: from quodlibet import plugins raise (plugins.MissingModulePluginException("cddb") if hasattr(plugins, "MissingModulePluginException") else e) from os import path from gi.repository import Gtk from quodlibet.qltk import ErrorMessage, Icons from quodlibet.qltk.window import Dialog from quodlibet.const import VERSION from quodlibet.util import tag, escape from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.path import expanduser CDDB.proto = 6 # utf8 instead of latin1 CLIENTINFO = {'client_name': "quodlibet", 'client_version': VERSION} def sumdigits(n): return sum(map(long, str(int(n)))) def calculate_discid(album): lengths = [song.get('~#length', 0) for song in album] total_time = 0 offsets = [] for length in lengths: offsets.append(total_time) total_time += length total_time = int(total_time) checksum = sum(map(sumdigits, offsets)) discid = ((checksum % 0xff) << 24) | (total_time << 8) | len(album) return [discid, len(album)] + [75 * o for o in offsets] + [total_time] def query(category, discid, xcode='utf8:utf8'): discinfo = {} tracktitles = {} dump = path.join(expanduser("~"), '.cddb', category, discid) try: for line in file(dump): if line.startswith("TTITLE"): track, title = line.split("=", 1) try: track = int(track[6:]) except (ValueError): pass else: tracktitles[track] = \ title.decode('utf-8', 'replace').strip() elif line.startswith("DGENRE"): discinfo['genre'] = line.split('=', 1)[1].strip() elif line.startswith("DTITLE"): dtitle = line.split('=', 1)[1].strip().split(' / ', 1) if len(dtitle) == 2: discinfo['artist'], discinfo['title'] = dtitle else: discinfo['title'] = dtitle[0].strip() elif line.startswith("DYEAR"): discinfo['year'] = line.split('=', 1)[1].strip() except EnvironmentError: pass else: return discinfo, tracktitles read, info = CDDB.read(category, discid, **CLIENTINFO) if read != 210: return None try: os.makedirs(path.join(expanduser("~"), '.cddb')) except EnvironmentError: pass try: save = file(dump, 'w') keys = info.keys() keys.sort() for key in keys: print>>save, "%s=%s" % (key, info[key]) save.close() except EnvironmentError: pass xf, xt = xcode.split(':') for key, value in info.iteritems(): try: value = value.decode('utf-8', 'replace').strip().encode( xf, 'replace').decode(xt, 'replace') except AttributeError: pass if key.startswith('TTITLE'): try: tracktitles[int(key[6:])] = value except ValueError: pass elif key == 'DGENRE': discinfo['genre'] = value elif key == 'DTITLE': dtitle = value.strip().split(' / ', 1) if len(dtitle) == 2: discinfo['artist'], discinfo['title'] = dtitle else: discinfo['title'] = dtitle[0].strip() elif key == 'DYEAR': discinfo['year'] = value return discinfo, tracktitles def make_info_label((disc, track), album, discid): message = [] if 'artist' in disc: message.append('%s:\t<b>%s</b>' % ( tag("artist"), escape(disc['artist']))) if 'title' in disc: message.append('%s:\t<b>%s</b>' % ( tag("album"), escape(disc['title']))) if 'year' in disc: message.append('%s:\t<b>%s</b>' % (tag("date"), escape(disc['year']))) if 'genre' in disc: message.append('%s:\t<b>%s</b>' % ( tag("genre"), escape(disc['genre']))) if discid: message.append('%s:\t<b>%s</b>' % (tag("CDDB ID"), escape(discid))) message.append('\n<u>%s</u>' % _('Track List')) keys = track.keys() keys.sort() for key in keys: message.append(' <b>%d.</b> %s' % (key + 1, escape(track[key].encode('utf-8')))) return '\n'.join(message) class CDDBLookup(SongsMenuPlugin): PLUGIN_ID = 'CDDB lookup' PLUGIN_NAME = _('CDDB Lookup') PLUGIN_DESC = _('Looks up album information in FreeDB. Requires CDDB.py.') PLUGIN_ICON = Icons.MEDIA_OPTICAL def plugin_album(self, album): discid = calculate_discid(album) try: stat, discs = CDDB.query(discid, **CLIENTINFO) except IOError: ErrorMessage(None, _("Timeout"), _( "Query could not be executed, connection timed out")).run() return if stat in (200, 211): xcode = 'utf8:utf8' dlg = Dialog(title=_('Select an album')) dlg.set_border_width(6) dlg.set_resizable(False) dlg.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) dlg.add_icon_button(_("_Save"), Icons.DOCUMENT_SAVE, Gtk.ResponseType.OK) dlg.vbox.set_spacing(6) dlg.set_default_response(Gtk.ResponseType.CANCEL) model = Gtk.ListStore(str, str, str, str, str, str) for disc in discs: model.append( [disc[s] for s in ('title', 'category', 'disc_id')] * 2) box = Gtk.ComboBox(model=model) box.set_active(0) for i in range(3): crt = Gtk.CellRendererText() box.pack_start(crt, True) box.add_attribute(crt, "text", i) discinfo = Gtk.Label() crosscode = Gtk.ListStore(str) crosscode.append(['utf8:utf8']) crosscode.append(['latin1:latin2']) crosscode.append(['latin1:cp1251']) crosscode.append(['latin1:sjis']) crosscode.append(['latin1:euc-jp']) cbo = Gtk.ComboBox( model=crosscode, entry_text_column=0, has_entry=True) cbo.set_active(0) def update_discinfo(combo): xcode = cbo.get_child().get_text() model = combo.get_model() t, c, d, title, cat, discid = model[box.get_active()] info = query(cat, discid, xcode=xcode) discinfo.set_markup( make_info_label(info, album, discs[0]['disc_id'])) def crosscode_cddbinfo(combo): try: xf, xt = combo.get_child().get_text().split(':') for row in model: for show, store in zip(range(0, 3), range(3, 6)): row[show] = row[store].encode( xf, 'replace').decode(xt, 'replace') except: for row in model: for show, store in zip(range(0, 3), range(3, 6)): row[show] = row[store] update_discinfo(box) cbo.connect('changed', crosscode_cddbinfo) box.connect('changed', update_discinfo) update_discinfo(box) dlg.vbox.pack_start(Gtk.Label( _("Select the album you wish to retrieve.")), True, True, 0) dlg.vbox.pack_start(box, True, True, 0) dlg.vbox.pack_start(discinfo, True, True, 0) dlg.vbox.pack_start(cbo, True, True, 0) dlg.vbox.show_all() resp = dlg.run() xcode = cbo.get_child().get_text() if resp == Gtk.ResponseType.OK: t, c, d, title, cat, discid = model[box.get_active()] (disc, track) = query(cat, discid, xcode=xcode) keys = track.keys() keys.sort() for key, song in zip(keys, album): if 'artist' in disc: song['artist'] = disc['artist'] if 'title' in disc: song['album'] = disc['title'] if 'year' in disc: song['date'] = disc['year'] if 'genre' in disc: song['genre'] = disc['genre'] s = track[key].split("/") if len(s) == 2: song['artist'] = s[0] song['title'] = s[1] else: song['title'] = track[key] song['tracknumber'] = '%d/%d' % (key + 1, len(album)) dlg.destroy() else: n = len(album) albumname = album[0]('album') if not albumname: albumname = ngettext('%d track', '%d tracks', n) % n ErrorMessage(None, _("CDDB lookup failed (%s)" % stat), ngettext(u"%(title)s and %(count)d more…", u"%(title)s and %(count)d more…", n - 1) % { 'title': album[0]('~basename'), 'count': n - 1}).run() ��������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/refresh.py��������������������������������������������������0000644�0001750�0001750�00000002353�12607265240�022565� 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.qltk.notif import Task from quodlibet.qltk import Icons from quodlibet.util import copool from quodlibet.plugins.songsmenu import SongsMenuPlugin class RefreshSongs(SongsMenuPlugin): PLUGIN_ID = "refresh-songs" # Translators: Plugin name PLUGIN_NAME = _("Refresh 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 = ngettext("%d song", "%d songs", len(songs)) % len(songs) with Task(_("Refresh 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.5.3/quodlibet/ext/songsmenu/editplaycount.py��������������������������������������������0000644�0001750�0001750�00000010756�12607265240�024021� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-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 from gi.repository import Gtk 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 PLUGIN_VERSION = "1.2" 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.5.3/quodlibet/ext/songsmenu/playlist.py�������������������������������������������������0000644�0001750�0001750�00000013641�12607265240�022772� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2009 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 # # The Unofficial M3U and PLS Specification (Winamp): # http://forums.winamp.com/showthread.php?threadid=65772 # # TODO: Support PlaylistPlugin, somehow import os from gi.repository import Gtk from quodlibet import util, qltk from quodlibet.util.path import glib2fsnative, get_home_dir from quodlibet.qltk.msg import ConfirmFileReplace from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin lastfolder = get_home_dir() if hasattr(os.path, 'relpath'): relpath = os.path.relpath else: # relpath taken from posixpath in Python 2.7 def relpath(path, start=os.path.curdir): """Return a relative version of a path""" if not path: raise ValueError("no path specified") start_list = os.path.abspath(start).split(os.path.sep) path_list = os.path.abspath(path).split(os.path.sep) # Work out how much of the filepath is shared by start and path. i = len(os.path.commonprefix([start_list, path_list])) rel_list = [os.path.pardir] * (len(start_list) - i) + path_list[i:] if not rel_list: return os.path.curdir return os.path.join(*rel_list) class PlaylistExport(SongsMenuPlugin): PLUGIN_ID = 'Playlist Export' PLUGIN_NAME = _('Playlist Export') PLUGIN_DESC = _('Exports songs to an M3U or PLS playlist.') PLUGIN_ICON = Icons.DOCUMENT_SAVE 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.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 = glib2fsnative(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.5.3/quodlibet/ext/songsmenu/importexport.py���������������������������������������������0000644�0001750�0001750�00000013057�12607265240�023706� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 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 os.path import splitext, extsep, dirname from quodlibet import app from quodlibet.qltk import ErrorMessage, Icons from quodlibet.util.path import get_home_dir from quodlibet.plugins.songsmenu import SongsMenuPlugin __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 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 # 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 meta.iteritems(): 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.5.3/quodlibet/ext/songsmenu/makesorttags.py���������������������������������������������0000644�0001750�0001750�00000002612�12607265240�023631� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2008 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.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 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.5.3/quodlibet/ext/songsmenu/browsefolders.py��������������������������������������������0000644�0001750�0001750�00000014455�12607265240�024015� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 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 try: import dbus except ImportError: dbus = None from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.uri import URI from quodlibet.qltk.msg import ErrorMessage from quodlibet.qltk import Icons from quodlibet.util.dprint import print_d from quodlibet.util.path import is_fsnative, normalize_path 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( URI.frompath(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" import pywintypes from win32com.shell import shell assert is_fsnative(path) assert all(is_fsnative(f) for f in files) normalized_files = map(normalize_path, files) try: folder_pidl = shell.SHILCreateFromPath(path, 0)[0] desktop = shell.SHGetDesktopFolder() shell_folder = desktop.BindToObject( folder_pidl, None, shell.IID_IShellFolder) items = [] for item in shell_folder: name = desktop.GetDisplayNameOf(item, 0) if normalize_path(name) in normalized_files: items.append(item) shell.SHOpenFolderAndSelectItems(folder_pidl, items, 0) except pywintypes.com_error: return False else: 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() def plugin_handles(self, songs): # By default, any single song being a file is good enough for song in songs: if song.is_file: return True return False 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.5.3/quodlibet/ext/songsmenu/ifp.py������������������������������������������������������0000644�0001750�0001750�00000004025�12607265240�021703� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-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 from quodlibet import util, qltk from quodlibet.plugins.songsmenu import SongsMenuPlugin class IFPUpload(SongsMenuPlugin): PLUGIN_ID = "Send to iFP" PLUGIN_NAME = _("Send to iFP") PLUGIN_DESC = _("Uploads songs to an iRiver iFP device.") 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.5.3/quodlibet/ext/songsmenu/k3b.py������������������������������������������������������0000644�0001750�0001750�00000003312�12607265240�021602� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, # 2009,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 util from quodlibet.plugins.songsmenu import SongsMenuPlugin 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 burn_programs = { 'K3b': ['k3b', '--audiocd'], 'Brasero': ['brasero', '--audio'], 'Xfburn': ['xfburn', '--audio-composition'], } 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]), x) for x in items] progs.sort(reverse=True) submenu = Gtk.Menu() for (is_cmd, (name, (cmd, arg))) 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 cmd, arg = self.burn_programs[self.prog_name] util.spawn([cmd, arg] + [song['~filename'] for song in songs]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/songsmenu/id3tlen.py��������������������������������������������������0000644�0001750�0001750�00000002366�12607265240�022475� 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 quodlibet import app from quodlibet import util from quodlibet.formats._id3 import ID3File, ID3hack from quodlibet.plugins.songsmenu import SongsMenuPlugin 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.") def plugin_songs(self, songs): for song in songs: song = song._song if not isinstance(song, ID3File): continue filename = song["~filename"] try: tag = ID3hack(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.5.3/quodlibet/ext/songsmenu/console.py��������������������������������������������������0000644�0001750�0001750�00000032216�12646426641�022601� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2006 - Steve Frécinaux # # 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # 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 # Copyrignt (C), 2005 Raphaël Slinckx # PythonConsole taken from totem # Plugin parts: # Copyright 2009,2010,2013 Christoph Reiter import sys import re import traceback from gi.repository import Gtk, Pango, Gdk, GLib from quodlibet import const from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin class PyConsole(SongsMenuPlugin): PLUGIN_ID = 'Python Console' PLUGIN_NAME = _('Python Console') PLUGIN_DESC = _('Interactive Python console.') PLUGIN_ICON = Icons.SYSTEM_RUN 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] self.set_size_request(600, 400) from quodlibet import app console = PythonConsole( namespace={ 'songs': songs, 'files': files, 'sdict': song_dicts, 'app': app}) self.add(console) acces_string = _("You can access the following objects by default:") acces_string += ("\\n" " '%s' (SongWrapper objects)\\n" " '%s' (Song dictionaries)\\n" " '%s' (Filename list)\\n" " '%s' (Application instance)") % ( "songs", "sdict", "files", "app") dir_string = _("Your current working directory is:") 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\"" % acces_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={}, 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 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 precendent 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 = 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 = 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 in 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.5.3/quodlibet/ext/editing/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020171� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/editing/resub.py������������������������������������������������������0000644�0001750�0001750�00000002600�12607265240�021647� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import re from gi.repository import Gtk, GObject from quodlibet.plugins.editing import RenameFilesPlugin, TagsFromPathPlugin from quodlibet.util import connect_obj 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 = self._from.get_text().decode('utf-8') to = self._to.get_text().decode('utf-8') try: return re.sub(fr, to, value) except: return value ��������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/editing/titlecase.py��������������������������������������������������0000644�0001750�0001750�00000004413�12607265240�022510� 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 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.5.3/quodlibet/ext/editing/__init__.py���������������������������������������������������0000644�0001750�0001750�00000000030�12607265240�022261� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/ext/editing/iconv.py������������������������������������������������������0000644�0001750�0001750�00000004631�12607265240�021653� 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. import locale from gi.repository import Gtk from quodlibet.util import get_fs_encoding 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() FSCODING = get_fs_encoding() if FSCODING not in ENCODINGS + ["utf-8", "latin1"]: ENCODINGS.append(FSCODING) if locale.getpreferredencoding() not in ENCODINGS + ["utf-8", "latin1"]: ENCODINGS.append(FSCODING) class Iconv(EditTagsPlugin): PLUGIN_ID = "Convert Encodings" PLUGIN_NAME = _("Convert Encodings") PLUGIN_DESC = _("Fixes misinterpreted tag value encodings in the " "tag editor.") 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.5.3/quodlibet/ext/editing/kakasi.py�����������������������������������������������������0000644�0001750�0001750�00000003172�12607265240�021777� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError from gi.repository import Gtk, GObject 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.") __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.5.3/quodlibet/qltk/���������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016721� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/maskedbox.py���������������������������������������������������������0000644�0001750�0001750�00000011241�12607265240�021235� 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 quodlibet import qltk from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk import Icons from quodlibet.util.path import fsdecode 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', fsdecode(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.5.3/quodlibet/qltk/browser.py�����������������������������������������������������������0000644�0001750�0001750�00000027537�12607265240�020762� 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, Pango from quodlibet import config from quodlibet import util from quodlibet import browsers from quodlibet import app 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 = """ <ui> <menubar name='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> </menubar> </ui>""" def __init__(self, library, player, ui=None): self._browser = None self._library = library self._player = player 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", _("Filter on _Genre")), ("artist", _("Filter on _Artist")), ("album", _("Filter on 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) ui = ui or Gtk.UIManager() ui.insert_action_group(ag, -1) ui.add_ui_from_string(self._MENU) self._ui = ui ui.get_widget("/Menu/Filters/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 = ui.get_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("#(lastplayed < 7 days ago)") elif name == "AddedRecently": self._make_query("#(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("#(playcount > %d)" % (songs[0] - 1)) else: self._make_query("#(playcount > %d)" % (songs[-40] - 1)) elif name == "All": self._browser.unfilter() def _make_query(self, query): if self._browser.can_filter_text(): self._browser.filter_text(query.encode('utf-8')) self._browser.activate() def _hide_menus(self): menus = { 'genre': [ "/Menu/Filters/FilterGenre", "/Menu/Filters/RandomGenre", ], 'artist': [ "/Menu/Filters/FilterArtist", "/Menu/Filters/RandomArtist", ], 'album': [ "/Menu/Filters/FilterAlbum", "/Menu/Filters/RandomAlbum", ], None: [ "/Menu/Filters/PlayedRecently", "/Menu/Filters/AddedRecently", "/Menu/Filters/TopRated", "/Menu/Filters/All", ], } for key, widgets in menus.items(): if self._browser: can_filter = self._browser.can_filter(key) else: can_filter = False for widget in widgets: self._ui.get_widget(widget).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._ui.get_widget( '/Menu/Filters/' + wid).set_sensitive(bool(song)) if song: for h in ['genre', 'artist', 'album']: self._ui.get_widget( "/Menu/Filters/Filter%s" % h.capitalize()).set_sensitive( h in song) def get_widget(self): return self._ui.get_widget("/Menu") 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_time) 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_text(_("No time information")) 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 = filter(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_time(self, info, songs): i = len(songs) length = sum(song.get("~#length", 0) for song in songs) t = self.browser.statusbar(i) % { 'count': i, 'time': util.format_time_long(length)} self.__statusbar.set_text(t) �����������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/session.py�����������������������������������������������������������0000644�0001750�0001750�00000002772�12607265240�020754� 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 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.5.3/quodlibet/qltk/completion.py��������������������������������������������������������0000644�0001750�0001750�00000014065�12646426641�021447� 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, 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 = entrytext.decode('utf-8') 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 = text.decode('utf-8') 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 if tag in massagers.tags: values = massagers.tags[tag].options else: values = [] 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.5.3/quodlibet/qltk/renamefiles.py�������������������������������������������������������0000644�0001750�0001750�00000025542�12646426641�021572� 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 import quodlibet from quodlibet import qltk from quodlibet import util 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 from quodlibet.util.path import fsdecode, fsnative from quodlibet.util.path import strip_win32_incompat_from_path 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> /path/<artist>/<album>/<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): filename = fsdecode(filename) return fsnative(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): filename = fsdecode(filename) return fsnative( 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 fsdecode(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(_('File'), render) 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(_('New Name'), render) 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 = new.decode("utf-8") 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 model.itervalues(): song = entry.song new_name = entry.new_name old_name = entry.name if new_name is None: continue try: library.rename(song, fsnative(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 model.itervalues()] pattern_text = self.combo.get_child().get_text().decode("utf-8") 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))).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 = [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 = fsdecode(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.5.3/quodlibet/qltk/debugwindow.py�������������������������������������������������������0000644�0001750�0001750�00000016347�12646426641�021621� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os import sys import time import traceback import platform from gi.repository import Gtk import quodlibet from quodlibet import const from quodlibet import util from quodlibet import qltk from quodlibet.qltk.msg import ErrorMessage from quodlibet.qltk import Icons from quodlibet.qltk import get_top_parent, Align from quodlibet.util.path import unexpand, mkdir from quodlibet.util import connect_obj from quodlibet.util import logging old_hook = sys.excepthook class MinExceptionDialog(ErrorMessage): """A dialog which shows a title, description and an expandable error report. For example decode(traceback.format_exc()) for displaying details about an exception. """ def __init__(self, parent, title, description, traceback): super(MinExceptionDialog, self).__init__( get_top_parent(parent), title, description) assert isinstance(title, unicode) assert isinstance(description, unicode) assert isinstance(traceback, unicode) exp = Gtk.Expander(label=_("Error Details")) lab = Gtk.Label(label=traceback) 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(500, 150) win.show_all() exp.add(win) exp.set_resize_toplevel(True) area = self.get_message_area() exp.show() area.pack_start(exp, False, True, 0) class ExceptionDialog(Gtk.Window): running = False instance = None DUMPDIR = os.path.join(quodlibet.get_user_dir(), "dumps") @classmethod def from_except(Kind, *args): mkdir(Kind.DUMPDIR) dump = os.path.join( Kind.DUMPDIR, time.strftime("Dump_%Y%m%d_%H%M%S.txt")) minidump = os.path.join( Kind.DUMPDIR, time.strftime("MiniDump_%Y%m%d_%H%M%S.txt")) full_args = list(args) + [dump, minidump] Kind.__dump(*full_args) # Don't get in a recursive exception handler loop. if not Kind.running: Kind.running = True Kind.instance = Kind(*full_args) return Kind.instance @classmethod def excepthook(Kind, *args): instance = Kind.from_except(*args) instance.show() old_hook(*args) @classmethod def __dump(self, Kind, value, trace, dump, minidump): import mutagen dumpobj = open(dump, "wb") minidumpobj = open(minidump, "wb") header = "Quod Libet %s\nMutagen %s\nPython %s %s\nPlatform %s" % ( const.VERSION, mutagen.version_string, sys.version, sys.platform, platform.platform()) minidump_data = ("=== SYSTEM INFORMATION:\n%s\n\n" "=== STACK TRACE\n%s\n\n") % ( header, "\n".join(traceback.format_exception(Kind, value, trace))) dumpobj.write(minidump_data) minidumpobj.write(minidump_data) minidumpobj.close() dumpobj.write("=== LOG:\n") for item in logging.get_content(limit=75): dumpobj.write(item.decode("utf-8") + "\n") dumpobj.close() def __init__(self, Kind, value, traceback, dump, minidump): # This is all implemented a bit different than the rest of Quod # Libet's windows since I want it to be as stupid as possible, to # minimize the chances of something going wrong with the thing # that handles things going wrong, i.e. it only uses GTK+ code, # no QLTK wrappers. Gtk.Window.__init__(self) self.set_default_size(400, 400) self.set_border_width(12) self.set_title(_("Error Occurred")) desc = _("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)s" "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>%(mini-dump-path)s</b> instead with a " "description of what " "you were doing.") % { "dump-path": unexpand(dump), "mini-dump-path": unexpand(minidump), "new-issue-url": "https://github.com/quodlibet/quodlibet/issues/new", } suggestion = _("Quod Libet may now be unstable. Closing it and " "restarting is recommended. Your library will be saved.") label = Gtk.Label(label=desc + "\n\n" + suggestion) label.set_selectable(True) label.set_use_markup(True) label.set_line_wrap(True) box = Gtk.VBox(spacing=6) buttons = Gtk.HButtonBox() view = Gtk.TreeView() sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) model = Gtk.ListStore(str, str, int) self.__fill_list(view, model, value, traceback) view.set_model(model) cancel = qltk.Button(_("_Cancel")) close = qltk.Button(_("_Quit"), Icons.APPLICATION_EXIT) buttons.pack_start(close, True, True, 0) buttons.pack_start(cancel, True, True, 0) box.pack_start(label, False, True, 0) box.pack_start(sw, True, True, 0) box.pack_start(buttons, False, True, 0) self.add(box) self.connect('destroy', self.__destroy) connect_obj(cancel, 'clicked', Gtk.Window.destroy, self) close.connect('clicked', lambda *x: Gtk.main_quit()) self.get_child().show_all() def first_draw(*args): filename = unexpand(dump) offset = label.get_text().decode("utf-8").find(filename) label.select_region(offset, offset + len(filename)) self.disconnect(self.__draw_id) self.__draw_id = self.connect("draw", first_draw) def __stack_row_activated(self, view, path, column): model = view.get_model() filename = model[path][0] line = model[path][2] util.spawn(["sensible-editor", "+%d" % line, filename]) def __fill_list(self, view, model, value, trace): for frame in reversed(traceback.extract_tb(trace)): (filename, line, function, text) = frame model.append(row=[filename, function, line]) view.connect('row-activated', self.__stack_row_activated) def cdf(column, cell, model, iter, data): cell.set_property("markup", "<b>%s</b> line %d\n\t%s" % ( util.escape(model[iter][1]), model[iter][2], util.escape(unexpand(model[iter][0])))) render = Gtk.CellRendererText() col = Gtk.TreeViewColumn(str(value).replace("_", "__"), render) col.set_cell_data_func(render, cdf) col.set_visible(True) col.set_expand(True) view.append_column(col) def __destroy(self, window): type(self).running = False type(self).instance = None window.destroy() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/textedit.py����������������������������������������������������������0000644�0001750�0001750�00000014051�12646426641�021123� 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 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 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 self.buffer.get_text(start, end, True).decode('utf-8') @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, unicode) f = AudioFile({"~filename": "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.5.3/quodlibet/qltk/prefs.py�������������������������������������������������������������0000644�0001750�0001750�00000067563�12607265240�020421� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2009 Joe Wreschnig, Michael Urman, Iñigo Serna, # Steven Robertson # 2011-2015 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.config import RATINGS from quodlibet.qltk.ccb import ConfigCheckButton as CCB from quodlibet.qltk.data_editors import TagListEditor from quodlibet.qltk.entry import ValidatingEntry, UndoEntry, QueryValidator 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 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): super(PreferencesWindow.SongList, self).__init__(spacing=12) self.set_border_width(12) self.title = _("Song List") # Behaviour 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) frame = qltk.Frame(_("Behavior"), child=vbox) self.pack_start(frame, False, True, 0) # Columns vbox = Gtk.VBox(spacing=12) buttons = {} 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) frame = qltk.Frame(_("Visible Columns"), child=vbox) self.pack_start(frame, False, True, 0) # Column preferences 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") ] self.__update(buttons, self._toggle_data, get_columns()) 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) frame = qltk.Frame(_("Column Preferences"), child=t) self.pack_start(frame, False, True, 0) # 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")) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(apply, True, True, 0) vbox.pack_start(b, True, True, 0) self.pack_start(vbox, True, True, 0) apply.connect('clicked', self.__apply, buttons) # Apply on destroy, else config gets mangled self.connect('destroy', self.__apply, buttons) 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): super(PreferencesWindow.Browsers, self).__init__(spacing=12) self.set_border_width(12) self.title = _("Browsers") # Search vb = Gtk.VBox(spacing=6) hb = Gtk.HBox(spacing=6) l = Gtk.Label(label=_("_Global filter:")) l.set_use_underline(True) e = ValidatingEntry(QueryValidator) 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 f = qltk.Frame(C_("heading", "Search"), child=vb) self.pack_start(f, 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) # Album Art vb = Gtk.VBox(spacing=6) c = CCB(_("_Use rounded corners on thumbnails"), 'albumart', 'round', populate=True, tooltip=_("Round the corners of album artwork thumbnail " "images.")) c.connect('toggled', self.__toggle_round_corners) vb.pack_start(c, False, True, 0) # 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 __toggle_round_corners(self, *args): qltk.redraw_all_toplevels() 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 list of separators to use when splitting tag values. " "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(_("_Refresh 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(_("Re_fresh 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_load 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(): scan_library(app.library, force=False) ���������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/cbes.py��������������������������������������������������������������0000644�0001750�0001750�00000033534�12646426641�020214� 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 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 = file(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 = file(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: #print_d("None found - using defaults.", context=self) 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)) saved = file(self.filename + ".saved", "w") for row in self.model: saved.write(row[0] + "\n") saved.write(row[1] + "\n") saved.close() except EnvironmentError: pass 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) self.remove(self.get_child()) self.add(entry.ValidatingEntry(validator)) 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"): fileobj = file(filename + ".saved", "rU") 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): for line in file(filename, "rU").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)) saved = file(filename + ".saved", "w") memory = file(filename, "w") 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") saved.close() memory.close() 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.5.3/quodlibet/qltk/image.py�������������������������������������������������������������0000644�0001750�0001750�00000015676�12646426641�020371� 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. A PixbufOrSurface is either a GdkPixbuf.Pixbuf or a cairo.Surface. Gtk+ 3.10 added HiDPI support and added APIs which take cairo surfaces. Since we still want to support older GTK+ we provide some helpers to work on both data types. Rule of thumb: Every pixbuf which ends up in a surface before getting drawn needs to be loaded at original_size * scale_factor. To test HiDPI start QL with GDK_SCALE=2. """ import math from gi.repository import GdkPixbuf, Gtk, Gdk, GLib import cairo def get_scale_factor(widget): """Returns the scale factor for a Gtk.Widget""" if hasattr(widget, "get_scale_factor"): return widget.get_scale_factor() else: return 1 def get_pbosf_for_pixbuf(widget, pixbuf): """Returns a cairo surface or the same pixbuf, let's call it PixbufOrSurface.. """ if hasattr(Gdk, "cairo_surface_create_from_pixbuf"): scale_factor = widget.get_scale_factor() # Don't create a surface if we don't have to if scale_factor == 1: return pixbuf return Gdk.cairo_surface_create_from_pixbuf( pixbuf, scale_factor, widget.get_window()) else: return pixbuf def pbosf_get_width(pbosf): """The scale independent width""" return pbosf_get_rect(pbosf)[2] def pbosf_get_height(pbosf): """The scale independent height""" return pbosf_get_rect(pbosf)[3] def pbosf_get_rect(pbosf): """Gives (x, y, width, height) for a pixbuf or a surface, scale independent """ if isinstance(pbosf, GdkPixbuf.Pixbuf): return (0, 0, pbosf.get_width(), pbosf.get_height()) else: ctx = cairo.Context(pbosf) 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 pbosf_get_property_name(pbosf): """Gives the property name to use for the PixbufOrSurface.""" if pbosf is None or isinstance(pbosf, GdkPixbuf.Pixbuf): return "pixbuf" else: return "surface" def set_renderer_from_pbosf(renderer, pbosf): """Set a Gtk.CellRendererPixbuf given a PixbufOrSurface or None""" name = pbosf_get_property_name(pbosf) renderer.set_property(name, pbosf) def set_image_from_pbosf(image, pbosf): """Sets a Gtk.Image given a PixbufOrSurface""" if isinstance(pbosf, GdkPixbuf.Pixbuf): return image.set_from_pixbuf(pbosf) else: return image.set_from_surface(pbosf) def set_ctx_source_from_pbosf(context, pbosf, x=0.0, y=0.0): """Sets the passed PixbufOrSurface as a source for the given cairo.Context """ if isinstance(pbosf, GdkPixbuf.Pixbuf): Gdk.cairo_set_source_pixbuf(context, pbosf, x, y) else: context.set_source_surface(pbosf, x, y) def pbosf_render(style_context, cairo_context, pbosf, x, y): """Draws the PixbufOrSurface to the cairo context at (x, y)""" if isinstance(pbosf, GdkPixbuf.Pixbuf): Gtk.render_icon(style_context, cairo_context, pbosf, x, y) else: Gtk.render_icon_surface(style_context, cairo_context, pbosf, x, y) def add_border(pixbuf, color, round=False, width=1): """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(w, h) / 10.0 if round else 0 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, cell=None, round=False): """Like add_border() but uses the widget to get a border color and a border width. """ from quodlibet.qltk.image import get_scale_factor context = widget.get_style_context() if cell is not None: state = cell.get_state(widget, 0) else: state = widget.get_state_flags() color = context.get_color(state) scale_factor = get_scale_factor(widget) return add_border(pixbuf, color, round=round, width=scale_factor) 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.5.3/quodlibet/qltk/sliderbutton.py������������������������������������������������������0000644�0001750�0001750�00000016564�12646426641�022022� 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 from quodlibet.qltk import get_top_parent from quodlibet.qltk.x import Align class PrimaryWarpsRange(Gtk.Range): """A GtkRange which behaves as if gtk-primary-button-warps-slider was always True. Adjusts key events depending on the current settings value. """ def __init__(self, *args, **kwargs): super(PrimaryWarpsRange, self).__init__(*args, **kwargs) self.connect("button-press-event", self.__button_event) self.connect("button-release-event", self.__button_event) @property def _warps(self): settings = Gtk.Settings.get_default() if settings: try: return settings.get_property("gtk-primary-button-warps-slider") except TypeError: pass return False def __button_event(self, widget, event): if not self._warps: event.button = event.button % 3 + 1 return False class PrimaryWarpsScale(Gtk.Scale, PrimaryWarpsRange): pass class _PopupSlider(Gtk.Button): # Based on the Rhythmbox volume control button; thanks to Colin Walters, # Richard Hult, Michael Fulbright, Miguel de Icaza, and Federico Mena. def __init__(self, child=None, adj=None): super(_PopupSlider, self).__init__() if child: self.add(child) self.connect('clicked', self.__clicked) self._disable_slider = False window = self.__window = Gtk.Window(type=Gtk.WindowType.POPUP) self.__adj = adj or self._adj frame = Gtk.Frame() frame.set_border_width(0) frame.set_shadow_type(Gtk.ShadowType.OUT) self.add_events(Gdk.EventMask.SCROLL_MASK) hscale = PrimaryWarpsScale(adjustment=self.__adj) hscale.set_orientation(self.ORIENTATION) 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=self.ORIENTATION) 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) 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): if self.ORIENTATION == Gtk.Orientation.HORIZONTAL: self.scale.set_size_request(length, -1) else: self.scale.set_size_request(-1, length) # force a window resize.. self.__window.resize(1, 1) def set_slider_widget(self, widget): self._box.pack_start( Align(widget, left=3, right=3), False, True, 0) def _move_to(self, x, y, w, h, ww, wh, pad=3): raise NotImplementedError def __clicked(self, button): if self.__window.get_property('visible'): return if self._disable_slider: return window = self.__window frame = window.get_child() frame.show_all() window.size_request() dummy, x, y = self.get_window().get_origin() x, y = self.translate_coordinates(self.get_toplevel(), x, y)[:2] button_alloc = self.get_allocation() w, h = button_alloc.width, button_alloc.height ww, wh = window.get_size() sx, sy = self._move_to(x, y, w, h, ww, wh, pad=3) window.set_transient_for(get_top_parent(self)) window.move(sx, sy) window.show() window.grab_focus() window.grab_add() event_time = Gtk.get_current_event_time() pointer = Gdk.pointer_grab( window.get_window(), True, Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_MOTION_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.SCROLL_MASK, None, None, event_time) keyboard = Gdk.keyboard_grab(window.get_window(), True, event_time) grab_sucess = Gdk.GrabStatus.SUCCESS if pointer != grab_sucess or keyboard != grab_sucess: window.grab_remove() window.hide() if pointer == Gdk.GrabStatus.SUCCESS: Gdk.pointer_ungrab(event_time) if keyboard == Gdk.GrabStatus.SUCCESS: Gdk.keyboard_ungrab(event_time) def __scroll(self, widget, ev, hscale): adj = self.__adj v = hscale.get_value() if ev.direction in self.UP: v += adj.props.step_increment elif ev.direction in self.DOWN: 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 = self.__window event_time = Gtk.get_current_event_time() window.grab_remove() Gdk.pointer_ungrab(event_time) Gdk.keyboard_ungrab(event_time) window.hide() #gtk3.8 bug: https://bugzilla.gnome.org/show_bug.cgi?id=700185 window.unrealize() class HSlider(_PopupSlider): ORIENTATION = Gtk.Orientation.HORIZONTAL _adj = Gtk.Adjustment.new(0, 0, 0, 3, 15, 0) UP = [Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.RIGHT] DOWN = [Gdk.ScrollDirection.UP, Gdk.ScrollDirection.LEFT] def _move_to(self, x, y, w, h, ww, wh, pad=3): if Gtk.Widget.get_default_direction() == Gtk.TextDirection.LTR: return ((x + w + pad), (y + (h - wh) // 2)) else: return ((x - (ww + pad)), (y + (h - wh) // 2)) class VSlider(_PopupSlider): ORIENTATION = Gtk.Orientation.VERTICAL _adj = Gtk.Adjustment.new(0, 0, 1, 0.05, 0.1, 0) UP = [Gdk.ScrollDirection.UP, Gdk.ScrollDirection.LEFT] DOWN = [Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.RIGHT] def _move_to(self, x, y, w, h, ww, wh, pad=3): return ((x + (w - ww) // 2), y + h + pad) ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/info.py��������������������������������������������������������������0000644�0001750�0001750�00000012716�12607265240�020223� 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 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, 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") + "\n") except EnvironmentError: pass 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.5.3/quodlibet/qltk/views.py�������������������������������������������������������������0000644�0001750�0001750�00000122232�12646426641�020427� 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 os import contextlib from gi.repository import Gtk, Gdk, GObject, Pango, GLib import cairo from quodlibet import config from quodlibet.qltk import get_top_parent, is_accel, is_wayland, gtk_version, \ menu_popup from quodlibet.qltk.image import pbosf_get_rect 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): super(TreeViewHints, self).__init__(type=Gtk.WindowType.POPUP) 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(""" .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 if event.get_state() & Gtk.accelerator_get_default_mod_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 = filter(lambda ((x, w), r): x < 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 if not is_wayland(): # present duplicates windows in weston 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): def __init__(self, *args, **kwargs): super(BaseView, self).__init__(*args, **kwargs) self.connect("key-press-event", self.__key_pressed) 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""" self.remove_iters(map(self.get_model().get_iter, 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 = 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 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 = [pbosf_get_rect(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: - Selections don't change until button-release-event... - Unless they're a Shift/Ctrl modification, then they happen immediately - Drag icons include 3 rows/2 plus a "and more" count """ 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_event = 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 self.grab_focus() selection = self.get_selection() is_selected = selection.path_is_selected(path) mod_active = event.get_state() & ( Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK) if is_selected and not mod_active: self.__pending_event = [x, y] selection.set_select_function(lambda *args: False, None) elif event.type == Gdk.EventType.BUTTON_PRESS: self.__pending_event = None selection.set_select_function(lambda *args: True, None) def __button_release(self, view, event): if self.__pending_event: selection = self.get_selection() selection.set_select_function(lambda *args: True, None) oldevent = self.__pending_event self.__pending_event = None x, y = map(int, [event.x, event.y]) if oldevent != [x, y]: return True try: path, col, cellx, celly = self.get_path_at_pos(x, y) except TypeError: return True self.set_cursor(path, col, 0) 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 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 os.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): # TODO: doesn't do anything in RTL mode 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() available_width = p2_alloc.width # 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.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 = available_width, alloc.height # 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 = req_height * 0.8 gradient_x0 = w - min(float(gradient_width), w) pat = cairo.LinearGradient(gradient_x0, 0, w, 0) pat.add_color_stop_rgba(0, 1, 1, 1, 1) pat.add_color_stop_rgba(w, 0, 0, 0, 0) # 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): def __init__(self, title="", *args, **kwargs): super(TreeViewColumn, self).__init__(None, *args, **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 label.__realize = label.connect('realize', self.__realized) self._tooltip_text = None def __realized(self, widget): widget.disconnect(widget.__realize) self._button = widget.get_ancestor(Gtk.Button) self.set_tooltip_text(self._tooltip_text) def set_tooltip_text(self, text): if self._button: # gtk3.4: set_tooltip_text didn't allow None 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, title="", *args, **kw): super(TreeViewColumnButton, self).__init__(title, *args, **kw) 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.5.3/quodlibet/qltk/delete.py������������������������������������������������������������0000644�0001750�0001750�00000020671�12607265240�020531� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 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 """ 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 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.path import fsdecode, 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 = [fsdecode(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 = ngettext( "Delete %(file_count)d file permanently?", "Delete %(file_count)d files permanently?", len(paths)) % { "file_count": len(paths), } 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 = ngettext( "Move %(file_count)d file to the trash?", "Move %(file_count)d files to the trash?", len(paths)) % { "file_count": len(paths), } 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: 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.5.3/quodlibet/qltk/_editutils.py��������������������������������������������������������0000644�0001750�0001750�00000014514�12607265240�021433� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2014 Nick Boultbee # 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, GObject from quodlibet import config from quodlibet import util 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.path import fsdecode 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(fsdecode(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(fsdecode(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 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")) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) vbox = Gtk.VBox() plugin_handler.connect( "changed", self.__refresh_plugins, vbox, expander) sw.add_with_viewport(vbox) self.pack_start(sw, False, True, 0) sw.set_no_show_all(True) expander.connect("notify::expanded", self.__notify_expanded, sw) expander.set_expanded(False) for child in self.get_children(): child.show() plugin_handler.changed() sw.hide() 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.5.3/quodlibet/qltk/songsmenu.py���������������������������������������������������������0000644�0001750�0001750�00000035452�12607265240�021310� 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 gi.repository import Gtk from quodlibet import qltk from quodlibet.util import print_exc 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 = max([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 = filter(lambda i: i.initialized, items) 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() 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 = albums.values() 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 max(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 max(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 try: submenu = PlaylistMenu(songs) except AttributeError as e: print_w("Couldn't get Playlists menu: %s" % e) else: b = qltk.MenuItem(_("Play_lists"), Icons.LIST_ADD) 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 = filter(lambda s: s.can_add, songs) 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.EDIT_COPY) b.set_sensitive( can_add and len(submenu) > 0 and bool(songs)) 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)) else: b = TrashMenuItem() 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.DOCUMENT_PROPERTIES) 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.5.3/quodlibet/qltk/ratingsmenu.py�������������������������������������������������������0000644�0001750�0001750�00000006026�12646426641�021630� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011-2013 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 util from quodlibet import config from quodlibet import qltk from quodlibet.config import RATINGS from quodlibet.qltk import SeparatorMenuItem from quodlibet.util import connect_obj 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.MenuItem): __accels = Gtk.AccelGroup() 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) def __init__(self, songs, library, label=_("_Rating")): super(RatingsMenuItem, self).__init__(label=label, use_underline=True) submenu = Gtk.Menu() self.set_submenu(submenu) for i in RATINGS.all: itm = Gtk.MenuItem(label="%0.2f\t%s" % (i, util.format_rating(i))) submenu.append(itm) connect_obj(itm, 'activate', self.set_rating, i, songs, library) reset = Gtk.MenuItem(label=_("_Remove rating"), use_underline=True) connect_obj(reset, 'activate', self.remove_rating, songs, library) submenu.append(SeparatorMenuItem()) submenu.append(reset) submenu.show_all() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/wlw.py���������������������������������������������������������������0000644�0001750�0001750�00000017535�12607265240�020105� 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 import math import time from gi.repository import Gtk, Pango, Gdk from quodlibet.qltk import get_top_parent, Icons, Button, ToggleButton from quodlibet import util 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={}): self.current = 0 self.count = count self._text = text self.paused = False self.quit = False self._start_time = time.time() initial.setdefault("total", self.count) initial.setdefault("current", self.current) initial.setdefault("remaining", _("Unknown")) self._label.set_markup(self._text % initial) 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", self.count) values.setdefault("current", self.current) if self.count: t = (time.time() - self._start_time) / self.current remaining = math.ceil((self.count - self.current) * t) values.setdefault("remaining", util.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.POPUP) 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) self._progress.set_text(_("%(current)d of %(all)d") % { "current": self.current, "all": self.count, }) return ret �������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/information.py�������������������������������������������������������0000644�0001750�0001750�00000053340�12646426641�021622� 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 time from gi.repository import Gtk, Pango 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.tags import readable from quodlibet.util.path import fsdecode, filesize, unexpand def Label(label=None): l = Gtk.Label(label=label) l.set_selectable(True) l.set_alignment(0, 0) return l def Frame(name, widget): f = Gtk.Frame() f.set_shadow_type(Gtk.ShadowType.NONE) l = Gtk.Label() l.set_markup("<u><b>%s</b></u>" % name) f.set_label_widget(l) a = Align(top=3, left=12) f.add(a) a.add(widget) return f 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): 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) sw = SW() sw.title = _("Information") sw.add_with_viewport(vbox) self.append_page(sw) lyrics = LyricsPane(song) lyrics.title = _("Lyrics") self.append_page(lyrics) 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) parent = qltk.get_top_parent(self) if parent: parent.set_title(self.title + " - Quod Libet") vbox.show_all() def _title(self, song, box): l = Label() text = "<big><b>%s</b></big>" % util.escape(song.comma("title")) if "version" in song: text += "\n" + util.escape(song.comma("version")) l.set_markup(text) l.set_ellipsize(Pango.EllipsizeMode.END) box.pack_start(l, False, False, 0) self.title = song.comma("title") def _album(self, song, box): if "album" not in song: return w = Label("") text = [] text.append("<i>%s</i>" % util.escape(song.comma("album"))) if "date" in song: text[-1] += " (%s)" % util.escape(song.comma("date")) 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 "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.set_markup("\n".join(text)) w.set_ellipsize(Pango.EllipsizeMode.END) hb = Gtk.HBox(spacing=12) cover = CoverImage() cover.set_property('no-show-all', True) hb.pack_start(cover, False, True, 0) def show_cover(cover, success): if success: cover.show() cover.disconnect(signal_id) signal_id = cover.connect('cover-visible', show_cover) cover.set_song(song) hb.pack_start(w, True, True, 0) box.pack_start(Frame(tag("album"), hb), False, False, 0) def _people(self, song, box): vb = Gtk.VBox() if "artist" in song: if len(song.list("artist")) == 1: title = _("artist") else: title = _("artists") title = util.capitalize(title) l = Label(song["artist"]) l.set_ellipsize(Pango.EllipsizeMode.END) vb.pack_start(l, False, True, 0) else: title = tag("~people") for tag_ in ["performer", "lyricist", "arranger", "composer", "conductor", "author"]: if tag_ in song: l = Label(song[tag_]) l.set_ellipsize(Pango.EllipsizeMode.END) if len(song.list(tag_)) == 1: name = tag(tag_) else: name = readable(tag_, plural=True) vb.pack_start(Frame(util.capitalize(name), l), False, False, 0) performers = {} for tag_ in song: if "performer:" in tag_: for person in song[tag_].split('\n'): try: performers[str(person)] except: performers[str(person)] = [] performers[str(person)].append( util.title(tag_[tag_.find(":") + 1:])) if len(performers) > 0: performerstr = '' for performer in performers: performerstr += performer + ' (' i = 0 for part in performers[performer]: if i != 0: performerstr += ', ' performerstr += part i += 1 performerstr += ')\n' l = Label(performerstr) l.set_ellipsize(Pango.EllipsizeMode.END) if len(performers) == 1: name = tag("performer") else: name = _("performers") vb.pack_start(Frame(util.capitalize(name), l), False, False, 0) if not vb.get_children(): vb.destroy() else: box.pack_start(Frame(title, vb), False, False, 0) def _library(self, song, box): def counter(i): if i == 0: return _("Never") else: return ngettext("%(n)d time", "%(n)d times", i) % {"n": i} def ftime(t): if t == 0: return _("Unknown") else: timestr = time.strftime("%c", time.localtime(t)) encoding = util.get_locale_encoding() return timestr.decode(encoding) 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 = Gtk.Table(n_rows=5, n_columns=2) t.set_col_spacings(6) t.set_homogeneous(False) 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 = "<b>%s</b>" % util.capitalize(util.escape(l) + ":") lab = Label() lab.set_markup(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: timestr = time.strftime("%c", time.localtime(t)) encoding = util.get_locale_encoding() return timestr.decode(encoding) fn = fsdecode(unexpand(song["~filename"])) length = util.format_time_long(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") t = Gtk.Table(n_rows=4, n_columns=2) t.set_col_spacings(6) t.set_homogeneous(False) table = [(_("length"), length), (_("format"), format_), (_("codec"), codec), (_("encoding"), encoding), (_("bitrate"), bitrate), (_("file size"), size), (_("modified"), mtime)] fnlab = Label(fn) fnlab.set_ellipsize(Pango.EllipsizeMode.MIDDLE) t.attach(fnlab, 0, 2, 0, 1, xoptions=Gtk.AttachOptions.FILL) for i, (l, r) in enumerate(table): l = "<b>%s</b>" % util.capitalize(util.escape(l) + ":") lab = Label() lab.set_markup(l) t.attach(lab, 0, 1, i + 1, i + 2, xoptions=Gtk.AttachOptions.FILL) t.attach(Label(r), 1, 2, i + 1, i + 2) box.pack_start(Frame(_("File"), t), 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] l = Label() l.set_ellipsize(Pango.EllipsizeMode.END) text = "<big><b>%s</b></big>" % util.escape(song["album"]) if "date" in song: text += "\n" + song["date"] l.set_markup(text) box.pack_start(l, False, False, 0) self.title = song["album"] 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(util.format_time_long(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("") w.set_ellipsize(Pango.EllipsizeMode.END) w.set_markup("\n".join(text)) hb = Gtk.HBox(spacing=12) cover = CoverImage() cover.set_property('no-show-all', True) hb.pack_start(cover, False, True, 0) def show_cover(cover, success): if success: cover.show() cover.disconnect(signal_id) signal_id = cover.connect('cover-visible', show_cover) cover.set_song(song) hb.pack_start(w, True, True, 0) box.pack_start(hb, False, False, 0) def _people(self, songs, box): artists = set() performers = set() for song in songs: artists.update(song.list("artist")) performers.update(song.list("performer")) artists = sorted(artists) performers = sorted(performers) if artists: if len(artists) == 1: title = _("artist") else: title = _("artists") title = util.capitalize(title) box.pack_start(Frame(title, Label("\n".join(artists))), False, False, 0) if performers: if len(artists) == 1: title = _("performer") else: title = _("performers") title = util.capitalize(title) box.pack_start(Frame(title, Label("\n".join(performers))), 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("<b>%s</b>" % (_("Disc %s") % disc)) if part != cur_part: ts = " " * bool(disc) cur_part = part if part: text.append("%s<b>%s</b>" % (ts, util.escape(part))) cur_track += 1 ts = " " * (bool(disc) + bool(part)) while cur_track < track: text.append("%s<b>%d.</b> <i>%s</i>" % ( ts, cur_track, _("Track unavailable"))) cur_track += 1 text.append("%s<b>%d.</b> %s" % ( ts, track, util.escape(song.comma("~title~version")))) l = Label() l.set_markup("\n".join(text)) l.set_ellipsize(Pango.EllipsizeMode.END) 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): l = Label() l.set_ellipsize(Pango.EllipsizeMode.END) artist = util.escape(songs[0]("artist")) l.set_markup("<b><big>%s</big></b>" % artist) box.pack_start(l, False, False, 0) self.title = songs[0]["artist"] 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((date, song, album)): if date: return "%s (%s)" % (album, date[:4]) else: return album get_cover = app.cover_manager.get_cover covers = [(a, get_cover(s), s) for d, s, a in albums] albums = map(format, albums) if noalbum: albums.append(ngettext("%d song with no album", "%d songs with no album", noalbum) % noalbum) l = Label("\n".join(albums)) l.set_ellipsize(Pango.EllipsizeMode.END) 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 = CoverImage(song=song) cov.get_child().set_tooltip_text(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): l = Label() t = ngettext("%d song", "%d songs", len(songs)) % len(songs) l.set_markup("<big><b>%s</b></big>" % t) self.title = t box.pack_start(l, 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) box.pack_start(Frame( "%s (%d)" % (util.capitalize(_("artists")), num_artists), Label("\n".join(artists))), 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) if none: albums.append(ngettext("%d song with no album", "%d songs with no album", none) % none) box.pack_start(Frame( "%s (%d)" % (util.capitalize(_("albums")), num_albums), Label("\n".join(albums))), 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 = Gtk.Table(n_rows=2, n_columns=2) table.set_col_spacings(6) table.attach(Label(_("Total length:")), 0, 1, 0, 1, xoptions=Gtk.AttachOptions.FILL) table.attach( Label(util.format_time_long(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"), s.get("album")) 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.5.3/quodlibet/qltk/bookmarks.py���������������������������������������������������������0000644�0001750�0001750�00000017521�12607265240�021257� 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 # FIXME: Only allow one bookmark window per song. from gi.repository import Gtk, Pango from quodlibet import qltk from quodlibet import util 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) m = Gtk.Label(label=mark) m.set_alignment(0.0, 0.5) hbox.pack_start(m, 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.5.3/quodlibet/qltk/dbus_.py�������������������������������������������������������������0000644�0001750�0001750�00000007452�12607265240�020365� 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.util.path import fsdecode 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(): if not isinstance(value, basestring): value = unicode(value) elif isinstance(value, str): value = fsdecode(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 self.library.itervalues() if results(s)] return None ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/quodlibetwindow.py���������������������������������������������������0000644�0001750�0001750�00000135755�12646426641�022530� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 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 gi.repository import Gtk, Gdk, GLib, Gio 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.formats.remote import RemoteFile from quodlibet.qltk.browser import LibraryBrowser, FilterMenu from quodlibet.qltk.chooser import FolderChooser, FileChooser 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.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 PlayOrder 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 ConfigRVPaned, Align, ScrolledWindow, Action from quodlibet.qltk.x import SymbolicIconImage, CellRendererPixbuf, \ ToggleAction, RadioAction from quodlibet.qltk import Icons from quodlibet.qltk.about import AboutQuodLibet from quodlibet.util import copool, connect_destroy, connect_after_destroy from quodlibet.util.library import get_scan_dirs, set_scan_dirs from quodlibet.util.uri import URI from quodlibet.util import connect_obj from quodlibet.util.path import glib2fsnative, get_home_dir from quodlibet.util.library import background_filter, scan_library from quodlibet.qltk.window import PersistentWindowMixin, Window, on_first_map from quodlibet.qltk.songlistcolumns import SongListColumn 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): # The SongList that represents the current playlist. _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 SongListScroller(ScrolledWindow): def __init__(self, menu): super(SongListScroller, self).__init__() self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.set_shadow_type(Gtk.ShadowType.IN) self.connect('notify::visible', self.__visibility, menu) def __visibility(self, widget, event, menu): value = self.get_property('visible') menu.set_active(value) config.set("memory", "songlist", str(value)) 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;}") # song text info_pattern_path = os.path.join(quodlibet.get_user_dir(), "songinfo") text = SongInfo(library.librarian, player, info_pattern_path) box.pack_start(Align(text, border=3), 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 _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() refresh_albums = [] for song in songs: # Album browser only (currently): album = library.albums.get(song.album_key, None) if album: album.scan_cover(force=True) refresh_albums.append(album) if refresh_albums: library.albums.refresh(refresh_albums) class ReapeatButton(Gtk.ToggleButton): def __init__(self): super(ReapeatButton, self).__init__( image=SymbolicIconImage( "media-playlist-repeat", Gtk.IconSize.SMALL_TOOLBAR)) self.set_name("ql-repeat-button") qltk.add_css(self, """ #ql-repeat-button { padding: 0px; } """) self.set_size_request(26, 26) self.set_tooltip_text(_("Restart the playlist when finished")) self.bind_config("settings", "repeat") def bind_config(self, section, option): self.set_active(config.getboolean(section, option)) def toggled_cb(*args): config.set(section, option, self.get_active()) self.connect('toggled', toggled_cb) class StatusBarBox(Gtk.HBox): def __init__(self, model, player): super(StatusBarBox, self).__init__(spacing=6) self.order = order = PlayOrder(model, player) self.pack_start(order, False, True, 0) self.repeat = repeat = ReapeatButton() self.pack_start(repeat, False, True, 0) repeat.connect('toggled', self.__repeat, model) model.repeat = repeat.get_active() self.statusbar = StatusBar(TaskController.default_instance) self.pack_start(self.statusbar, True, True, 0) def __repeat(self, button, model): model.repeat = button.get_active() 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) MAIN_MENU = """ <ui> <menubar name='Menu'> <menu action='Music'> <menuitem action='AddFolders' always-show-image='true'/> <menuitem action='AddFiles' always-show-image='true'/> <menuitem action='AddLocation' always-show-image='true'/> <separator/> <menu action='BrowseLibrary' always-show-image='true'> %(browsers)s </menu> <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> </menubar> </ui> """ MENU = """ <ui> <menubar name='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'/> <separator/> <menuitem action='AddBookmark' always-show-image='true'/> <menuitem action='EditBookmarks' always-show-image='true'/> <separator/> <menuitem action='EditTags' always-show-image='true'/> <menuitem action='Information' always-show-image='true'/> <separator/> <menuitem action='Jump' always-show-image='true'/> </menu> <menu action='View'> <menuitem action='SongList' always-show-image='true'/> <menuitem action='Queue' always-show-image='true'/> <separator/> %(views)s </menu> <menu action='Help'> <menuitem action='OnlineHelp' always-show-image='true'/> <menuitem action='SearchHelp' always-show-image='true'/> <menuitem action='About' always-show-image='true'/> </menu> </menubar> </ui> """ def BrowseLibrary(): items = [] for Kind in browsers.browsers: if not Kind.is_empty: item = "Browser" + Kind.__name__ items.append("<menuitem action='%s'/>" % item) return "\n".join(items) def ViewBrowser(): items = [] for Kind in browsers.browsers: item = "View" + Kind.__name__ items.append("<menuitem action='%s'/>" % item) return "\n".join(items) DND_URI_LIST, = range(1) class QuodLibetWindow(Window, PersistentWindowMixin): def __init__(self, library, player, headless=False, restore_cb=None): super(QuodLibetWindow, self).__init__(dialog=False) self.last_dir = get_home_dir() self.__destroyed = False self.__update_title(player) self.set_default_size(550, 450) main_box = Gtk.VBox() self.add(main_box) # 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.show_all() 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 = SongListScroller( ui.get_widget("/Menu/View/SongList")) self.song_scroller.add(self.songlist) self.qexpander = QueueExpander( ui.get_widget("/Menu/View/Queue"), library, player) 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) statusbox = StatusBarBox(self.songlist.model, player) self.order = statusbox.order self.repeat = statusbox.repeat self.statusbar = statusbox.statusbar main_box.pack_start( Align(statusbox, border=3, top=-3, right=3), False, True, 0) self.songpane = ConfigRVPaned("memory", "queue_position", 0.75) self.songpane.pack1(self.song_scroller, resize=True, shrink=False) self.songpane.pack2(self.qexpander, resize=True, shrink=False) self.__handle_position = self.songpane.get_property("position") def songpane_button_press_cb(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.qexpander.get_expanded(): self.qexpander.set_expanded(True) pane.set_relative(1.0) return False self.songpane.connect("button-press-event", songpane_button_press_cb) self.song_scroller.connect('notify::visible', self.__show_or) self.qexpander.connect('notify::visible', self.__show_or) self.qexpander.connect('notify::expanded', self.__expand_or) self.qexpander.connect('draw', self.__qex_size_allocate) self.songpane.connect('notify', self.__moved_pane_handle) 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.showhide_playlist(ui.get_widget("/Menu/View/SongList")) self.showhide_playqueue(ui.get_widget("/Menu/View/Queue")) 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_time) 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_as_osx_window(self, osx_app): assert osx_app 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/Music/Preferences') osx_app.insert_app_menu_item(item, 2) quit_item = self.ui.get_widget('/Menu/Music/Quit') quit_item.hide() def get_osx_is_persistent(self): return True 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 __add_bookmark(self, librarian, player): if player.song: position = player.get_position() // 1000 bookmarks = player.song.bookmarks new_mark = (position, _("Bookmark Name")) if new_mark not in bookmarks: bookmarks.append(new_mark) player.song.bookmarks = bookmarks 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: uri = URI(uri) except ValueError: continue if uri.is_filename: loc = os.path.normpath(uri.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 __show_or(self, widget, prop): ssv = self.song_scroller.get_property('visible') qxv = self.qexpander.get_property('visible') self.songpane.set_property('visible', ssv or qxv) if not ssv: self.qexpander.set_expanded(True) self.__expand_or(widget, prop) def __expand_or(self, widget, prop): if self.qexpander.get_property('expanded'): self.songpane.set_property("position", self.__handle_position) def __moved_pane_handle(self, widget, prop): if self.qexpander.get_property('expanded'): self.__handle_position = self.songpane.get_property("position") def __qex_size_allocate(self, event, param=None): if not self.qexpander.get_property('expanded'): p_max = self.songpane.get_property("max-position") p_cur = self.songpane.get_property("position") if p_max != p_cur: self.songpane.set_property("position", p_max) def __create_menu(self, player, library): ag = Gtk.ActionGroup.new('QuodLibetWindowActions') act = Action(name="Music", label=_("_Music")) ag.add_action(act) 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="Control", label=_('_Control')) ag.add_action(act) 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="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") act = Action(name="View", label=_('_View')) ag.add_action(act) act = Action(name="Help", label=_('_Help')) ag.add_action(act) 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="AddBookmark", label=_("Add Bookmark"), icon_name=Icons.LIST_ADD) connect_obj(act, 'activate', self.__add_bookmark, library.librarian, player) ag.add_action_with_accel(act, "<Primary>D") 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="About", label=_("_About"), icon_name=Icons.HELP_ABOUT) connect_obj(act, 'activate', self.__show_about, player) 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="RefreshLibrary", label=_("Re_fresh Library"), icon_name=Icons.VIEW_REFRESH) act.connect('activate', self.__rebuild, False) ag.add_action(act) act = ToggleAction(name="SongList", label=_("Song _List")) act.set_active(config.getboolean("memory", "songlist")) act.connect('activate', self.showhide_playlist) ag.add_action(act) act = ToggleAction(name="Queue", label=_("_Queue")) act.set_active(config.getboolean("memory", "queue")) act.connect('activate', self.showhide_playqueue) 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__ label = Kind.accelerated_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(act) assert 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: if Kind.is_empty: continue action = "Browser" + Kind.__name__ label = Kind.accelerated_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, None) ui = Gtk.UIManager() ui.insert_action_group(ag, -1) ui.add_ui_from_string( MAIN_MENU % {"browsers": BrowseLibrary()}) self._filter_menu = FilterMenu(library, player, ui) menustr = MENU % { "views": ViewBrowser(), } ui.add_ui_from_string(menustr) # 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/Music/RefreshLibrary").set_tooltip_text( _("Check for changes in your library")) return ui def __show_about(self, player): about = AboutQuodLibet(self, player) about.run() about.destroy() 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() self.__refresh_size() 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 base 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: title = song.comma("~title~version~~people") + " - " + title self.set_title(title) def __song_started(self, player, song): self.__update_title(player) for wid in ["Jump", "Next", "EditTags", "Information", "EditBookmarks", "AddBookmark", "StopAfter"]: self.ui.get_widget( '/Menu/Control/' + wid).set_sensitive(bool(song)) # don't jump on stream changes (player.info != player.song) if song and player.song is song and not self.songlist._activated and \ config.getboolean("settings", "jump") and self.songlist.sourced: self.__jump_to_current(False) def __refresh_size(self): ssv = self.song_scroller.get_property('visible') qex = self.qexpander.get_property('visible') if ssv or qex: return # Handle more later if needed.. if not isinstance(self.browser, Gtk.Box): return # If a child expands the browser will take the new space for child in self.browser.get_children(): if self.browser.query_child_packing(child)[0]: break else: # no expanding child, make the window smaller instead width, height = self.get_size() height = self.size_request().height self.resize(width, height) def showhide_playlist(self, toggle): self.song_scroller.set_property('visible', toggle.get_active()) self.__refresh_size() def showhide_playqueue(self, toggle): self.qexpander.set_property('visible', toggle.get_active()) self.__refresh_size() 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 util.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): last_dir = self.last_dir if not os.path.exists(last_dir): last_dir = get_home_dir() class MusicFolderChooser(FolderChooser): def __init__(self, parent, init_dir): super(MusicFolderChooser, self).__init__( parent, _("Add Music"), init_dir) cb = Gtk.CheckButton(_("Watch this folder for new songs")) # enable if no folders are being watched cb.set_active(not get_scan_dirs()) cb.show() self.set_extra_widget(cb) def run(self): fns = super(MusicFolderChooser, self).run() cb = self.get_extra_widget() return fns, cb.get_active() class MusicFileChooser(FileChooser): def __init__(self, parent, init_dir): super(MusicFileChooser, self).__init__( parent, _("Add Music"), formats.filter, init_dir) if action.get_name() == "AddFolders": dialog = MusicFolderChooser(self, last_dir) fns, do_watch = dialog.run() dialog.destroy() if fns: fns = map(glib2fsnative, fns) # scan them self.last_dir = fns[0] copool.add(self.__library.scan, fns, cofuncid="library", funcid="library") # add them as library scan directory if do_watch: dirs = get_scan_dirs() for fn in fns: if fn not in dirs: dirs.append(fn) set_scan_dirs(dirs) else: dialog = MusicFileChooser(self, last_dir) fns = dialog.run() dialog.destroy() if fns: fns = map(glib2fsnative, fns) self.last_dir = os.path.dirname(fns[0]) for filename in map(os.path.realpath, 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 = filter(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_time(self, info, songs): i = len(songs) length = sum(song.get("~#length", 0) for song in songs) t = self.browser.statusbar(i) % { 'count': i, 'time': util.format_time_long(length)} self.statusbar.set_default_text(t) �������������������quodlibet-3.5.3/quodlibet/qltk/downloader.py��������������������������������������������������������0000644�0001750�0001750�00000013343�12646426641�021432� 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 import urllib from gi.repository import Gtk, Pango, GLib from quodlibet import qltk from quodlibet import util from quodlibet.util import connect_obj from quodlibet.qltk.views import AllTreeView from quodlibet.qltk.x import MenuItem from quodlibet.qltk import Icons 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(filter(lambda row: row[2] != 0, self.downloads)) iter = self.downloads.get_iter_first() while iter is not None: if started >= 2: break if self.downloads[iter][2] == 0: url = urllib.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): fileobj = file(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.5.3/quodlibet/qltk/tracknumbers.py������������������������������������������������������0000644�0001750�0001750�00000016713�12646426641�022000� 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 quodlibet import qltk from quodlibet import util 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 from quodlibet.qltk.models import ObjectStore from quodlibet.qltk import Icons from quodlibet.util.path import fsdecode from quodlibet.util import connect_obj class Entry(object): def __init__(self, song): self.song = song self.tracknumber = song("tracknumber") @property def name(self): return fsdecode(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) hbox2 = Gtk.HBox(spacing=12) hbox_start = Gtk.HBox(spacing=3) label_start = Gtk.Label(label=_("Start fro_m:")) 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) hbox_start.pack_start(label_start, True, True, 0) hbox_start.pack_start(spin_start, True, True, 0) hbox_total = Gtk.HBox(spacing=3) label_total = Gtk.Label(label=_("_Total tracks:")) 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) hbox_total.pack_start(label_total, True, True, 0) hbox_total.pack_start(spin_total, True, True, 0) preview = qltk.Button(_("_Preview"), Icons.VIEW_REFRESH) hbox2.pack_start(hbox_start, True, False, 0) hbox2.pack_start(hbox_total, True, False, 0) hbox2.pack_start(preview, False, True, 0) model = ObjectStore() view = HintedTreeView(model=model) self.pack_start(hbox2, False, True, 0) render = Gtk.CellRendererText() column = TreeViewColumn(_('File'), render) 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(_('Track'), render) 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 = new.decode("utf-8") 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 model.itervalues(): 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: 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 = unicode(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 model.itervalues()] else: songs = list(songs) songs.sort( key=lambda song: (song("~#track"), song("~basename"), song)) 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.5.3/quodlibet/qltk/controls.py����������������������������������������������������������0000644�0001750�0001750�00000037756�12646426641�021155� 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, Gdk, GObject from quodlibet import config from quodlibet import qltk from quodlibet.qltk import bookmarks from quodlibet.qltk import Icons from quodlibet import util from quodlibet.util import connect_obj, connect_destroy from quodlibet.qltk.ccb import ConfigCheckMenuItem from quodlibet.qltk.sliderbutton import HSlider from quodlibet.qltk.tracker import TimeTracker from quodlibet.qltk.x import (RadioMenuItem, SeparatorMenuItem, SymbolicIconImage) 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(self.get_text().decode("utf-8")) 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 SeekBar(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(SeekBar, 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) return True else: time = Gtk.get_current_event_time() return qltk.popup_menu_under_widget(menu, self, 3, time) 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') class Volume(Gtk.VolumeButton): def __init__(self, player): super(Volume, self).__init__(size=Gtk.IconSize.MENU, use_symbolic=True) self.set_relief(Gtk.ReliefStyle.NORMAL) self.set_adjustment(Gtk.Adjustment.new(0, 0, 1, 0.05, 0.1, 0)) 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 return qltk.popup_menu_under_widget(menu, widget, button, time) 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() 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, profile) if player.replaygain_profiles[0] == profile: item.set_active(True) item.show() def __changed(self, item, player, profile): if item.get_active(): player.replaygain_profiles[0] = profile player.reset_replaygain() 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 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 = Gtk.ToggleButton(relief=Gtk.ReliefStyle.NONE) play.add(SymbolicIconImage("media-playback-start", Gtk.IconSize.LARGE_TOOLBAR)) 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; } """) seekbar = SeekBar(player, library) seekbar.set_relief(Gtk.ReliefStyle.NONE) lower.attach(seekbar, 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.5.3/quodlibet/qltk/menubutton.py��������������������������������������������������������0000644�0001750�0001750�00000004552�12607363242�021470� 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, Gdk from quodlibet import qltk class MenuButton(Gtk.ToggleButton): __menu = None __menu_sig = None 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._down = down self.add(bbox) self.connect("toggled", self.__toggled_cb) self.connect("button-press-event", self.__press_cb) self.connect("destroy", self.__destroy) def get_menu(self): return self.__menu def set_menu(self, menu): if self.__menu: self.__menu.detach() self.__menu.disconnect(self.__menu_sig) self.__menu = menu menu.attach_to_widget(self, None) self.__menu_sig = menu.connect("deactivate", self.__menu_deactivate_cb, self) def __destroy(self, *args): if self.__menu: self.__menu.detach() self.__menu.disconnect(self.__menu_sig) self.__menu = None def __menu_deactivate_cb(self, menu, button): button.set_active(False) def __press_cb(self, widget, event): if self.__menu and event.button == Gdk.BUTTON_PRIMARY: widget.set_active(True) return True return False def _popup(self): event = Gtk.get_current_event() ok, button = event.get_button() if not ok: button = Gdk.BUTTON_PRIMARY time = event.get_time() if self._down: qltk.popup_menu_under_widget(self.__menu, self, button, time) else: qltk.popup_menu_above_widget(self.__menu, self, button, time) def __toggled_cb(self, widget): menu = self.__menu if widget.get_active() and menu: self._popup() elif menu: menu.popdown() ������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/__init__.py����������������������������������������������������������0000644�0001750�0001750�00000026467�12646426641�021046� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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 import os import sys 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 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): if isinstance(filename, unicode): # win32 filename = filename.encode("utf-8") filenames.append(filename) type_ = Gdk.atom_intern("text/x-quodlibet-songs", True) selection_data.set(type_, 8, "\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("\x00") if sys.platform == "win32": return [item.decode("utf-8") for item in items] else: return 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(container, type_): """Given a container, find all children that are a subclass of type_ (including itself) """ assert isinstance(container, Gtk.Container) found = [] if isinstance(container, type_): found.append(container) for child in container.get_children(): if isinstance(child, Gtk.Container): 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) return True 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) return _popup_menu_at_widget(menu, widget, button, time, True) def popup_menu_above_widget(menu, widget, button, time): _ensure_menu_attached(menu, widget) return _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") """ 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() for accel in accels: accel_keyval, accel_mod = Gtk.accelerator_parse(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 "")) # 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 """ provider = Gtk.CssProvider() provider.load_from_data(css) context = widget.get_style_context() context.add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) def is_wayland(): # FIXME: Is there no better way? display = Gdk.Display.get_default() if display: return display.get_name() == "Wayland" return False 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 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) # Legacy plugin/code support. from quodlibet.qltk.msg import * from quodlibet.qltk.x import * from quodlibet.qltk.icons import Icons from quodlibet.qltk.window import Window, UniqueWindow Window UniqueWindow Icons ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/songlistcolumns.py���������������������������������������������������0000644�0001750�0001750�00000025211�12607265240�022525� 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 quodlibet import util from quodlibet import config from quodlibet.pattern import Pattern from quodlibet.qltk.views import TreeViewColumnButton from quodlibet.util.path import fsdecode, unexpand, fsnative from quodlibet.formats._audio import FILESYSTEM_TAGS 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 t.startswith("<"): return PatternColumn(t) elif "~" not in t and t != "title": return NonSynthTextColumn(t) else: return WideTextColumn(t) class SongListColumn(TreeViewColumnButton): __last_rendered = None def __init__(self, tag): """tag e.g. 'artist'""" title = self._format_title(tag) super(SongListColumn, self).__init__(title) self.set_tooltip_text(title) self.header_name = tag self.set_sizing(Gtk.TreeViewColumnSizing.FIXED) self.set_visible(True) self.set_sort_indicator(False) 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 formating 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) @util.cached_property def _layout(self): return Gtk.Label().create_pango_layout("") def _cell_width(self, text, pad=8): """Returns the column width needed for the passed text""" cell_pad = self._render.get_property('xpad') return self._text_width(text) + pad + cell_pad def _text_width(self, text): self._layout.set_text(text, -1) return self._layout.get_pixel_size()[0] def _cdf(self, column, cell, model, iter_, user_data): """CellRenderer cell_data_func""" 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) width = self._cell_width(util.format_rating(1.0)) self.set_fixed_width(width) self.set_min_width(width) def _cdf(self, column, cell, model, iter_, user_data): song = model.get_value(iter_) rating = song.get("~#rating") default = config.RATINGS.default if not self._needs_update((rating, default)): return 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) self.set_min_width(self._cell_width("000")) def _cdf(self, column, cell, model, iter_, user_data): text = model.get_value(iter_).comma(self.header_name) if not self._needs_update(text): return cell.set_property('text', text) class DateColumn(WideTextColumn): """The '~#' keys that are dates.""" def _cdf(self, column, cell, model, iter_, user_data): stamp = model.get_value(iter_)(self.header_name) if not self._needs_update(stamp): return 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) encoding = util.get_locale_encoding() text = time.strftime(format_, stamp).decode(encoding) 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 _cdf(self, column, cell, model, iter_, user_data): value = model.get_value(iter_).get(self.header_name, "") if not self._needs_update(value): return 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 _cdf(self, column, cell, model, iter_, user_data): values = model.get_value(iter_).list(self.header_name) value = values[0] if values else fsnative(u"") if not self._needs_update(value): return cell.set_property('text', fsdecode(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 _cdf(self, column, cell, model, iter_, user_data): song = model.get_value(iter_) if not self._pattern: return value = self._pattern % song if not self._needs_update(value): return 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.__min_width = self._get_min_width() self.set_fixed_width(self.__min_width) self.set_expand(False) self.set_resizable(False) self._single_char_width = self._text_width("0") self._texts = {} self._timeout = None 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 _cdf(self, column, cell, model, iter_, user_data): value = model.get_value(iter_).comma(self.header_name) if not self._needs_update(value): return if isinstance(value, float): text = u"%.2f" % round(value, 2) else: text = unicode(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() if not tv: return 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 self._texts.items(): if not (start - 3) <= key <= (end + 3): del self._texts[key] elif isinstance(value, basestring): 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.__min_width] + self._texts.values()) if width < needed_width: self.set_fixed_width(needed_width) self.set_min_width(needed_width) elif width - needed_width >= self._single_char_width: self.set_fixed_width(needed_width) self.set_max_width(needed_width) 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 _cdf(self, column, cell, model, iter_, user_data): value = model.get_value(iter_).get("~#length", 0) if not self._needs_update(value): return 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 _cdf(self, column, cell, model, iter_, user_data): value = model.get_value(iter_).get("~#filesize", 0) if not self._needs_update(value): return text = util.format_size(value) cell.set_property('text', text) self._recalc_width(model.get_path(iter_), text) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/models.py������������������������������������������������������������0000644�0001750�0001750�00000020366�12646426641�020562� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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 from gi.repository import Gtk, GObject from quodlibet.qltk import pygobject_version def _gets_marshaled_to_pyobject(obj, _types=(long, float, int, basestring, bool, GObject.Object)): """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, _value_type=GObject.Value, _base=Gtk.TreeModel.get_value): res = _base(self, iter_, column) # PyGObject 3.4 doesn't unbox in some cases... if isinstance(res, _value_type): res = res.get_boxed() return res 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 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() if pygobject_version >= (3, 12): _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 else: # https://bugzilla.gnome.org/show_bug.cgi?id=703662 def _get_marshalable(self, obj): if _gets_marshaled_to_pyobject(obj): return obj value = GObject.Value() value.init(GObject.TYPE_PYOBJECT) value.set_boxed(obj) return 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() """ 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.5.3/quodlibet/qltk/msg.py���������������������������������������������������������������0000644�0001750�0001750�00000006532�12607265240�020055� 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 quodlibet import util from quodlibet.qltk.icons import Icons from quodlibet.qltk import get_top_parent from quodlibet.qltk.window import Dialog from quodlibet.util.path import fsdecode 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(fsdecode(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.5.3/quodlibet/qltk/queue.py�������������������������������������������������������������0000644�0001750�0001750�00000023043�12646426641�020416� 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, Gdk import quodlibet from quodlibet import config from quodlibet import util from quodlibet import qltk from quodlibet.util import connect_obj, connect_destroy from quodlibet.qltk import Icons from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk.songlist import SongList, DND_QL, DND_URI_LIST from quodlibet.qltk.songsmenu import SongsMenu 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 QueueExpander(Gtk.Expander): def __init__(self, menu, 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) sw.add(self.queue) outer = Gtk.HBox(spacing=12) 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) hb2.pack_start(name_label, True, True, 0) left.pack_start(hb2, False, True, 0) b = SmallImageButton( image=Gtk.Image.new_from_icon_name(Icons.EDIT_CLEAR, Gtk.IconSize.MENU)) b.set_tooltip_text(_("Remove all songs from the queue")) b.connect('clicked', self.__clear_queue) b.hide() b.set_relief(Gtk.ReliefStyle.NONE) left.pack_start(b, False, False, 0) count_label = Gtk.Label() left.pack_start(count_label, False, True, 0) outer.pack_start(left, True, True, 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_fill(True) cb = ConfigCheckButton( _("_Random"), "memory", "shufflequeue") cb.connect('toggled', self.__queue_shuffle, self.queue.model) cb.set_active(config.getboolean("memory", "shufflequeue")) left.pack_start(cb, False, True, 0) self.set_label_widget(outer) self.add(sw) connect_obj(self, 'notify::expanded', self.__expand, cb, b) 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.show_all() 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) cb.hide() connect_obj(self, 'notify::visible', self.__visible, cb, menu, b) 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) # 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) @property def model(self): return self.queue.model 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() 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": util.format_time_display(time)} lab.set_text(text) def __check_expand(self, model, path, iter, lab): if not self.get_property('visible'): self.set_expanded(False) 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, model): if not button.get_active(): model.order = OrderInOrder(model) else: model.order = OrderShuffle(model) def __expand(self, cb, prop, clear): cb.set_property('visible', self.get_expanded()) clear.set_property('visible', self.get_expanded()) def __visible(self, cb, prop, menu, clear): value = self.get_property('visible') config.set("memory", "queue", str(value)) menu.set_active(value) self.set_expanded(not self.model.is_empty()) cb.set_property('visible', self.get_expanded()) clear.set_property('visible', self.get_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) connect_obj(self, 'popup-menu', self.__popup, library) self.enable_drop() connect_obj(self, '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: filenames = file(QUEUE, "rU").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, model): filenames = "\n".join([row[0]["~filename"] for row in model]) f = file(QUEUE, "w") f.write(filenames) f.close() def __popup(self, 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.5.3/quodlibet/qltk/edittags.py����������������������������������������������������������0000644�0001750�0001750�00000107463�12646426641�021107� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2012 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 sys from gi.repository import Gtk, Pango, Gdk from quodlibet import qltk from quodlibet import config from quodlibet import util from quodlibet.util import massagers 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 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) 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 ngettext('missing from %d song', 'missing from %d songs', self.missing) % self.missing elif self.complete: return ngettext('different across %d song', 'different across %d songs', self.total) % self.total else: d = ngettext('different across %d song', 'different across %d songs', self.have) % self.have m = ngettext('missing from %d song', 'missing from %d songs', self.missing) % 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.iteritems 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 keys.iteritems(): first_value = first[tag] if not isinstance(first_value, basestring): first_value = unicode(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.get("editing", "split_on").decode( 'utf-8', 'replace').split() self.set_sensitive(len(split_value(value, spls)) > 1) def activated(self, tag, value): spls = config.get("editing", "split_on").decode( 'utf-8', 'replace').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.get("editing", "split_on").decode( 'utf-8', 'replace').split() self.set_sensitive(bool(split_title(value, spls)[1])) def activated(self, tag, value): spls = config.get("editing", "split_on").decode( 'utf-8', 'replace').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.get("editing", "split_on").decode( 'utf-8', 'replace').split() self.set_sensitive(bool(split_people(value, spls)[1])) def activated(self, tag, value): spls = config.get("editing", "split_on").decode( 'utf-8', 'replace').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 self.__val.get_text().decode("utf-8") def __validate(self, editable, add, invalid, box): tag = self.get_tag() value = self.get_value() fmt = massagers.tags.get(tag) if fmt: valid = fmt.is_valid(value) else: valid = True add.set_sensitive(valid) if valid: invalid.hide() box.set_tooltip_text("") else: invalid.show() box.set_tooltip_text(fmt.error) 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(_("Write"), render) def cdf_write(col, rend, model, iter_, *args): entry = model.get_value(iter_) if entry.canedit or entry.deleted: rend.set_property('sensitive', entry.edited 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.DIALOG_PASSWORD) column.set_cell_data_func(render, cdf_write) view.append_column(column) render = Gtk.CellRendererText() column = TreeViewColumn(_('Tag'), render) 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(_('Value'), render) 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, (rend, path)): 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(map(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, unicode) 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, unicode) if tag in massagers.tags: value = massagers.tags[tag].validate(value) value = unicode(value) assert isinstance(value, unicode) 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 model.itervalues(): 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 updated.iteritems(): 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 added.iteritems(): for value in values: if song.can_change(key): song.add(key, value.text) changed = True for key, values in deleted.iteritems(): 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 renamed.iteritems(): 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: 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 = new_value.decode("utf-8") new_value = ', '.join(new_value.splitlines()) path = Gtk.TreePath.new_from_string(path) entry = model[path][0] error_dialog = None if entry.tag in massagers.tags: fmt = massagers.tags[entry.tag] if not fmt.is_valid(new_value): error_dialog = qltk.WarningMessage( self, _("Invalid value"), _("Invalid value: <b>%(value)s</b>\n\n%(error)s") % { "value": new_value, "error": fmt.error}) else: new_value = fmt.validate(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 new_tag in massagers.tags: fmt = massagers.tags[new_tag] if not fmt.is_valid(text): qltk.WarningMessage( self, _("Invalid value"), _("Invalid value: <b>%(value)s</b>\n\n%(error)s") % { "value": text, "error": fmt.error}).run() return text = fmt.validate(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_PRIMARY and col is view.get_columns()[0]: model = view.get_model() row = model[path] entry = row[0] # In case we have a (partially) shared value, write it # to all songs. For unshared/incomplete do nothing if entry.value.shared: entry.edited = not entry.edited if entry.edited: entry.value.complete = True model.row_changed(row.path, row.iter) return Gdk.EVENT_STOP elif 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 = songinfo.keys() 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.5.3/quodlibet/qltk/window.py������������������������������������������������������������0000644�0001750�0001750�00000032252�12646426641�020603� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2014 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 import sys import os from gi.repository import Gtk, GObject, Gdk from quodlibet import config from quodlibet.qltk import get_top_parent, is_wayland, gtk_version from quodlibet.qltk.x import Button from quodlibet.util import DeferredSignal 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") 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 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 __gsignals__ = { "close-accel": (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, GObject.TYPE_NONE, ()) } 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) self.__accels = Gtk.AccelGroup() if dialog: self.set_type_hint(Gdk.WindowTypeHint.DIALOG) self.set_destroy_with_parent(True) self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.add_accel_group(self.__accels) if not dialog: esc, mod = Gtk.accelerator_parse("<Primary>w") else: esc, mod = Gtk.accelerator_parse("Escape") self.add_accelerator('close-accel', self.__accels, esc, mod, 0) connect_obj(self, 'destroy', type(self).windows.remove, self) def set_default_size(self, width, height): # https://bugzilla.gnome.org/show_bug.cgi?id=740922 if self._header_bar: if width != -1: width += min((width - 174), 56) if height != -1: height += 84 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) def do_close_accel(self): #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 if not self.emit('delete-event', Gdk.Event.new(Gdk.EventType.DELETE)): self.destroy() @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 # WARNING: we can't keep the event, because PyGObject doesn't # keep it alive; so extract width/height before returning here. self.__save_size_pos_deferred(event.width, event.height) return False def __do_save_size_pos(self, width, height): if self.__state & Gdk.WindowState.MAXIMIZED: return value = "%d %d" % (width, height) config.set("memory", self.__conf("size"), value) self.__do_save_pos() def __do_save_pos(self): if self.__state & Gdk.WindowState.MAXIMIZED: return if not self.get_property("visible"): 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 the window class to get a one instance per class window. The is_not_unique method will return True if the window is already there. """ __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, reparent and reposition the window. widgets = filter(lambda x: isinstance(x, Gtk.Widget), args) 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): 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.5.3/quodlibet/qltk/scanbox.py�����������������������������������������������������������0000644�0001750�0001750�00000007454�12607265240�020730� 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 import os from gi.repository import Gtk from gi.repository import Pango from quodlibet.qltk.chooser import FolderChooser from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk.x import MenuItem, Button from quodlibet.qltk import Icons from quodlibet.util.path import fsdecode, unexpand, get_home_dir from quodlibet.util.library import get_scan_dirs, set_scan_dirs from quodlibet.util import connect_obj def get_init_select_dir(): scandirs = get_scan_dirs() if scandirs and os.path.isdir(scandirs[-1]): # start with last added directory return scandirs[-1] else: return get_home_dir() 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 = Gtk.ListStore(str) view = RCMHintedTreeView(model=model) view.set_fixed_height_mode(True) view.set_headers_visible(False) view.set_tooltip_text(_("Songs in the listed folders will be added " "to the library during a library refresh")) 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)) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) def cdf(column, cell, model, iter, data): row = model[iter] cell.set_property('text', unexpand(row[0])) 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) paths = map(fsdecode, get_scan_dirs()) for path in paths: 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([r[0] for r in self.model]) def __remove(self, view): view.remove_selection() self.__save() def __add(self, *args): initial = get_init_select_dir() chooser = FolderChooser(self, _("Select Directories"), initial) fns = chooser.run() chooser.destroy() for fn in fns: self.model.append(row=[fn]) self.__save() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/cover.py�������������������������������������������������������������0000644�0001750�0001750�00000022533�12646426641�020413� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2013 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 quodlibet import qltk from quodlibet import config from quodlibet import app from quodlibet.util import thumbnails from quodlibet.util.path import is_fsnative from quodlibet.qltk.image import (get_scale_factor, pixbuf_from_file, set_image_from_pbosf, get_pbosf_for_pixbuf, pbosf_render, calc_scale_size, scale, add_border_widget) # 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) 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 = get_scale_factor(self) 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() set_image_from_pbosf(image, get_pbosf_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 pixbux at max 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 is_fsnative(path) # 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 * get_scale_factor(self) 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 = get_scale_factor(self) width *= scale_factor height *= scale_factor if self._path: if width < (2 * scale_factor) or height < (2 * scale_factor): return round_thumbs = config.getboolean("albumart", "round") pixbuf = scale( pixbuf, (width - 2 * scale_factor, height - 2 * scale_factor)) pixbuf = add_border_widget(pixbuf, self, None, round_thumbs) else: pixbuf = scale(pixbuf, (width, height)) style_context = self.get_style_context() pbosf = get_pbosf_for_pixbuf(self, pixbuf) pbosf_render(style_context, cairo_context, pbosf, 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.5.3/quodlibet/qltk/tracker.py�����������������������������������������������������������0000644�0001750�0001750�00000012323�12646426641�020724� 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.__player = player self.__id = None self.__sigs = [ player.connect("paused", self.__paused), player.connect("unpaused", self.__unpaused), ] 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 self.emit("tick") return True def __paused(self, *args): # By removing the timeout only in the callback we are safe from # huge deviation caused by lots of pause/unpause actions. self.__stop = True def __unpaused(self, *args): self.__stop = False if self.__id is None: self.__id = GLib.timeout_add_seconds(1, 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: f = file(self.path, "w") except EnvironmentError: pass else: f.write(song.to_dump()) f.close() def __ended(self, player, song, stopped): try: os.unlink(self.path) except EnvironmentError: pass �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/pluginwin.py���������������������������������������������������������0000644�0001750�0001750�00000034525�12646426641�021315� 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, Pango, GObject from quodlibet import config from quodlibet import const from quodlibet import qltk from quodlibet import util from quodlibet.plugins import PluginManager from quodlibet.qltk.views import HintedTreeView from quodlibet.qltk.window import UniqueWindow from quodlibet.qltk.entry import ClearEntry from quodlibet.qltk.x import Align, Paned, Button from quodlibet.qltk.models import ObjectStore, ObjectModelFilter from quodlibet.qltk import Icons from quodlibet.util import connect_obj 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 ComboType(object): TAG, ALL, NO, DIS, EN, SEP = range(6) class PluginFilterCombo(Gtk.ComboBox): def __init__(self): combo_store = Gtk.ListStore(str, int) super(PluginFilterCombo, self).__init__(model=combo_store) cell = Gtk.CellRendererText() self.pack_start(cell, True) self.add_attribute(cell, "text", 0) def combo_sep(model, iter_, data): return model[iter_][1] == ComboType.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 cetegory for it. """ active = max(self.get_active(), 0) combo_store = self.get_model() combo_store.clear() combo_store.append([_("All"), ComboType.ALL]) combo_store.append(["", ComboType.SEP]) combo_store.append([_("Enabled"), ComboType.EN]) combo_store.append([_("Disabled"), ComboType.DIS]) if tags: combo_store.append(["", ComboType.SEP]) for tag in sorted(tags): combo_store.append([tag, ComboType.TAG]) if no_tags: combo_store.append([_("No category"), ComboType.NO]) self.set_active(active) def get_active_tag(self): iter_ = self.get_active_iter() if iter_: model = self.get_model() return list(model[iter_]) 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() def cell_data(col, render, model, iter_, data): plugin = model.get_value(iter_) pm = PluginManager.instance render.set_activatable(plugin.can_enable) render.set_active(pm.enabled(plugin)) 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() 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) column = Gtk.TreeViewColumn("image", render) 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) 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 __toggled(self, render, path): render.set_active(not render.get_active()) model = self.get_model() iter_ = model.get_iter(path) self.emit("plugin-toggled", model, iter_, render.get_active()) 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 += util.escape(plugin.description) label.set_markup(text) 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): def __init__(self, parent=None): if self.is_not_unique(): return super(PluginWindow, self).__init__() self.set_title(_("Plugins")) self.set_border_width(12) self.set_default_size(655, 404) self.set_transient_for(parent) paned = Paned() vbox = Gtk.VBox(spacing=6) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS) model = ObjectStore() filter_model = ObjectModelFilter(child_model=model) tv = PluginListView() tv.set_model(filter_model) tv.set_rules_hint(True) tv.connect("plugin-toggled", self.__plugin_toggled) fb = Gtk.HBox(spacing=6) filter_combo = PluginFilterCombo() filter_combo.connect("changed", lambda s: filter_model.refilter()) fb.pack_start(filter_combo, False, True, 0) filter_entry = ClearEntry() filter_entry.connect("changed", lambda s: filter_model.refilter()) filter_entry.enable_clear_button() fb.pack_start(filter_entry, True, True, 0) sw.add(tv) sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_size_request(200, -1) bbox = Gtk.HBox(homogeneous=True, spacing=12) errors = qltk.Button(_("Show _Errors"), Icons.DIALOG_WARNING) errors.set_focus_on_click(False) errors.connect('clicked', self.__show_errors) 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, filter_combo) bbox.pack_start(refresh, True, True, 0) vbox.pack_start(fb, False, True, 0) vbox.pack_start(sw, True, True, 0) vbox.pack_start(bbox, False, True, 0) paned.pack1(vbox, True, 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, left=6), True, False) paned.set_position(250) self.add(paned) self.__refill(tv, pref_box, errors, filter_combo) self.connect('destroy', self.__destroy) filter_model.set_visible_func( self.__filter, (filter_entry, filter_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): plugin = model.get_value(iter_) if not plugin: return False entry, combo = data tag = combo.get_active_tag() if tag: plugin_tags = plugin.tags tag, flag = tag pm = PluginManager.instance enabled = pm.enabled(plugin) if flag == ComboType.NO and plugin_tags or \ flag == ComboType.TAG and not tag in plugin_tags or \ flag == ComboType.EN and not enabled or \ flag == ComboType.DIS and enabled: return False filter_ = entry.get_text().lower() if not filter_ or filter_ in plugin.name.lower() or \ filter_ in (plugin.description or "").lower(): return True return False 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 __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, combo): pm = PluginManager.instance # refill plugin list view.refill(pm.plugins) # get all tags and refill combobox tags = set() no_tags = False for plugin in pm.plugins: if not plugin.tags: no_tags = True tags.update(plugin.tags) 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, combo): pm = PluginManager.instance pm.rescan() self.__refill(view, prefs, errors, combo) def __show_errors(self, activator): pm = PluginManager.instance window = PluginErrorWindow(self, pm.failures) window.show() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/x.py�����������������������������������������������������������������0000644�0001750�0001750�00000036460�12646426641�017550� 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 from quodlibet import util from quodlibet import config from quodlibet.qltk import add_css, is_accel, gtk_version 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(self.get_state_flags()) # 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_bar.get_state_flags()) 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 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() 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(self.get_state_flags()) 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 Paned(Gtk.Paned): def __init__(self, *args, **kwargs): super(Paned, self).__init__(*args, **kwargs) self.ensure_wide_handle() def ensure_wide_handle(self): if hasattr(self.props, "wide_handle"): # gtk 3.16 self.props.wide_handle = True add_css(self, """ GtkPaned { border-width: 0; } """) 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 set_relative(self, v): """Set the relative position of the separator, [0..1].""" if self.__alloced: max_pos = self.get_property('max-position') if not max_pos: # no children self.__relative = v return self.set_position(int(v * max_pos)) else: self.__relative = v def get_relative(self): """Return the relative position of the separator, [0..1].""" if self.__alloced: max_pos = self.get_property('max-position') if not max_pos: # no children return self.__relative return (float(self.get_position()) / max_pos) elif self.__relative is not None: return self.__relative else: # 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 _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) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/unity.py�������������������������������������������������������������0000644�0001750�0001750�00000004330�12607265240�020431� 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.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.5.3/quodlibet/qltk/tagscombobox.py������������������������������������������������������0000644�0001750�0001750�00000004545�12646426641�021767� 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 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): super(TagsComboBoxEntry, self).__init__( model=Gtk.ListStore(str, str), entry_text_column=0, has_entry=True) self._fill_model(can_change) 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.5.3/quodlibet/qltk/chooser.py�����������������������������������������������������������0000644�0001750�0001750�00000003447�12607265240�020733� 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 quodlibet.qltk import get_top_parent from quodlibet.qltk import Icons from quodlibet.qltk.window import Dialog # Choose folders and return them when run. class FolderChooser(Gtk.FileChooserDialog, Dialog): def __init__(self, parent, title, initial_dir=None, action=Gtk.FileChooserAction.SELECT_FOLDER): super(FolderChooser, self).__init__( title=title, transient_for=get_top_parent(parent), action=action) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Open"), Icons.DOCUMENT_OPEN, Gtk.ResponseType.OK) if initial_dir: self.set_current_folder(initial_dir) self.set_local_only(True) self.set_select_multiple(True) def run(self): resp = super(FolderChooser, self).run() fns = self.get_filenames() if resp == Gtk.ResponseType.OK: return fns else: return [] # Choose files and return them when run. class FileChooser(FolderChooser): def __init__(self, parent, title, filter=None, initial_dir=None): super(FileChooser, self).__init__( parent, title, initial_dir, Gtk.FileChooserAction.OPEN) if filter: def new_filter(args, realfilter): return realfilter(args.filename) f = Gtk.FileFilter() f.set_name(_("Songs")) f.add_custom(Gtk.FileFilterFlags.FILENAME, new_filter, filter) self.add_filter(f) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/about.py�������������������������������������������������������������0000644�0001750�0001750�00000005330�12646426641�020403� 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 platform from gi.repository import Gtk, GLib, GdkPixbuf import mutagen from quodlibet.qltk import gtk_version, pygobject_version from quodlibet import const from quodlibet import formats from quodlibet.util import fver def _set_about_image(dialog, icon_name): # win32 workaround: https://bugzilla.gnome.org/show_bug.cgi?id=721062 if os.name == "nt": size = 96 theme = Gtk.IconTheme.get_default() icon_info = theme.lookup_icon(icon_name, size, 0) if icon_info is None: return filename = icon_info.get_filename() try: pb = GdkPixbuf.Pixbuf.new_from_file_at_size(filename, size, size) except GLib.GError: return else: dialog.set_logo(pb) else: dialog.set_logo_icon_name(icon_name) class AboutDialog(Gtk.AboutDialog): def __init__(self, parent, player, name, icon): super(AboutDialog, self).__init__() self.set_transient_for(parent) self.set_program_name(name) self.set_version(const.VERSION) self.set_authors(const.AUTHORS) self.set_artists(const.ARTISTS) _set_about_image(self, icon) def chunks(l, n): return [l[i:i + n] for i in range(0, len(l), n)] fmts = ",\n".join(", ".join(c) for c in chunks(formats.names, 4)) text = [] text.append(_("Supported formats: %s") % fmts) text.append("") if player: text.append(_("Audio device: %s") % player.name) text.append("Python: %s" % platform.python_version()) text.append("Mutagen: %s" % fver(mutagen.version)) text.append("GTK+: %s" % fver(gtk_version)) text.append("PyGObject: %s" % fver(pygobject_version)) if player: text.append(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) class AboutQuodLibet(AboutDialog): def __init__(self, parent, player): super(AboutQuodLibet, self).__init__( parent, player, "Quod Libet", "quodlibet") class AboutExFalso(AboutDialog): def __init__(self, parent, player=None): super(AboutExFalso, self).__init__( parent, player, "Ex Falso", "exfalso") ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/notif.py�������������������������������������������������������������0000644�0001750�0001750�00000024760�12607265240�020411� 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.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 = 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_text(_("No time information")) 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.5.3/quodlibet/qltk/filesel.py�����������������������������������������������������������0000644�0001750�0001750�00000051103�12646426641�020713� 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 urlparse import errno from gi.repository import Gtk, GObject, Gdk, Gio, Pango from quodlibet import formats from quodlibet import qltk from quodlibet 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.util.path import fsdecode, listdir, is_fsnative, \ glib2fsnative, fsnative, xdg_get_user_dirs, get_home_dir from quodlibet.util.uri import URI 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: for entry in os.listdir(links): if entry.endswith(".lnk"): target = windows.get_link_target(os.path.join(links, entry)) if target is not None: 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(glib2fsnative(path)) paths.append("/") return paths def get_gtk_bookmarks(): """A list of paths from the GTK+ bookmarks. The paths don't have to exist. """ if os.name == "nt": return [] path = os.path.join(get_home_dir(), ".gtk-bookmarks") folders = [] try: with open(path, "rb") as f: for line in f.readlines(): parts = line.split() if not parts: continue folder_url = parts[0] folders.append(urlparse.urlsplit(folder_url)[2]) except EnvironmentError: 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 is_fsnative(initial) column = TreeViewColumn(_("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 = fsdecode(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 is_fsnative(path) 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 Subfolders"), 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 is_fsnative(path_to_go) # 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 = URI(uris[0]).filename 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, 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_ = glib2fsnative(dir_) fullpath = os.path.realpath(os.path.join(directory, dir_)) try: os.makedirs(fullpath) except EnvironmentError, 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, 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 is_fsnative(initial) 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(_("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', fsdecode(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.5.3/quodlibet/qltk/icons.py�������������������������������������������������������������0000644�0001750�0001750�00000005673�12646426641�020416� 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 """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" AUDIO_X_GENERIC = "audio-x-generic" 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" EDIT_CLEAR = "edit-clear" # "_Clear" EDIT_COPY = "edit-copy" # "_Copy" 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_SYSTEM = "emblem-system" FOLDER = "folder" GO_JUMP = "go-jump" # "_Jump to" HELP_ABOUT = "help-about" # "_About" HELP_BROWSER = "help-browser" # "_Help" IMAGE_X_GENERIC = "image-x-generic" 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_SKIP_BACKWARD = "media-skip-backward" # "Pre_vious" MEDIA_SKIP_FORWARD = "media-skip-forward" # "_Next" NETWORK_WORKGROUP = "network-workgroup" # "_Network" PREFERENCES_SYSTEM = "preferences-system" # "_Preferences" PROCESS_STOP = "process-stop" # "_Stop" SYSTEM_RUN = "system-run" # "_Execute" TOOLS_CHECK_SPELLING = "tools-check-spelling" # "_Spell Check" USER_TRASH = "user-trash" # "Trash" VIEW_REFRESH = "view-refresh" # "_Refresh" WINDOW_CLOSE = "window-close" # "_Close" AUDIO_CARD = "audio-card" ���������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/exfalsowindow.py�����������������������������������������������������0000644�0001750�0001750�00000023110�12646426641�022156� 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 quodlibet import config from quodlibet import formats from quodlibet import qltk 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 AboutExFalso 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 import Icons from quodlibet.util.path import mtime, normalize_path from quodlibet.util import connect_obj, connect_destroy class ExFalsoWindow(Window, PersistentWindowMixin): __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) about = Gtk.Button() about.add(Gtk.Image.new_from_icon_name( Icons.HELP_ABOUT, Gtk.IconSize.BUTTON)) connect_obj(about, 'clicked', self.__show_about, self) bbox.pack_start(about, False, True, 0) def prefs_cb(*args): window = PreferencesWindow(self) window.show() def plugin_window_cb(*args): window = PluginWindow(self) window.show() menu = Gtk.Menu() 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) 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_osx_is_persistent(self): return False def __show_about(self, window): about = AboutExFalso(self) about.run() about.destroy() def set_pending(self, button, *excess): self.__save = button def __pre_selection_changed(self, view, event, fs, nb): if self.__save: resp = qltk.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(ngettext("%d song", "%d songs", count) % count) for row in rows: filename = model[row][0] if not os.path.exists(filename): pass elif filename in self.__library: file = self.__library[filename] if file("~#mtime") + 1. < mtime(filename): try: file.reload() except StandardError: pass files.append(file) else: files.append(formats.MusicFile(filename)) files = filter(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: self.set_title( "%s - Ex Falso" % (ngettext("%(title)s and %(count)d more", "%(title)s and %(count)d more", len(files) - 1) % ( {'title': files[0].comma("title"), 'count': len(files) - 1}))) 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.5.3/quodlibet/qltk/songmodel.py���������������������������������������������������������0000644�0001750�0001750�00000021244�12607265240�021253� 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 itertools from gi.repository import Gtk from quodlibet.qltk.playorder import ORDERS from quodlibet.qltk.models import ObjectStore 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("Clearing model.") self.clear() self.__iter = None print_d("Setting %d songs." % len(songs)) oldsong = self.last_current for iter_, song in itertools.izip(self.iter_append_many(songs), songs): if song is oldsong: self.__iter = iter_ print_d("Done filling model.") 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 play order""" repeat = False """If the playlist should be repeated after it ended""" sourced = False """True in case this model is the source of the currently playing song""" def __init__(self): super(PlaylistModel, self).__init__(object) self.order = ORDERS[0](self) # 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 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 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.5.3/quodlibet/qltk/properties.py��������������������������������������������������������0000644�0001750�0001750�00000015303�12607265240�021457� 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 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.util.path import fsdecode from quodlibet.util import connect_destroy class _ListEntry(object): def __init__(self, song): self.song = song @property def name(self): return fsdecode(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 = qltk.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.5.3/quodlibet/qltk/playorder.py���������������������������������������������������������0000644�0001750�0001750�00000030355�12646426641�021277� 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 random from gi.repository import Gtk, GObject from quodlibet import config from quodlibet import qltk from quodlibet.qltk.x import SymbolicIconImage, RadioMenuItem from quodlibet.plugins import PluginManager, PluginHandler class Order(object): name = "unknown_order" display_name = _("Unknown") accelerated_name = _("_Unknown") replaygain_profiles = ["track"] is_shuffle = False priority = 100 def __init__(self, playlist): self.playlist = playlist # Not called directly, but the default implementation of # next_explicit and next_implicit both just call this. def next(self, playlist, iter): raise NotImplementedError # Not called directly, but the default implementation of # previous_explicit calls this. Right now there is no such thing # as previous_implicit. def previous(self, playlist, iter): raise NotImplementedError # Not called directly, but the default implementations of # set_explicit and set_implicit call this. def set(self, playlist, iter): return iter # Called when the user presses a "Next" button. def next_explicit(self, playlist, iter): return self.next(playlist, iter) # Called when a song ends passively, e.g. it plays through. def next_implicit(self, playlist, iter): return self.next(playlist, iter) # Called when the user presses a "Previous" button. def previous_explicit(self, playlist, iter): return self.previous(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. If the play order returns # None, no action will be taken by the player. def set_explicit(self, playlist, iter): return self.set(playlist, iter) # Called when the song is set by a means other than the UI. def set_implicit(self, playlist, iter): return self.set(playlist, iter) def reset(self, playlist): pass class OrderInOrder(Order): name = "inorder" 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: next = playlist.iter_next(iter) if next is None and playlist.repeat: next = playlist.get_iter_first() return next 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: if playlist.repeat: return playlist[(len(playlist) - 1,)].iter return None class OrderRemembered(Order): # Shared class for all the shuffle modes that keep a memory # of their previously played songs. def __init__(self, playlist): super(OrderRemembered, self).__init__(playlist) 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[:]) class OrderShuffle(OrderRemembered): name = "shuffle" display_name = _("Shuffle") accelerated_name = _("_Shuffle") is_shuffle = True priority = 1 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)),)) elif playlist.repeat and not playlist.is_empty(): del(self._played[:]) return playlist.get_iter((random.choice(list(songs)),)) else: del(self._played[:]) return None class OrderWeighted(OrderRemembered): name = "weighted" display_name = _("Weighted") accelerated_name = _("_Weighted") is_shuffle = True priority = 2 def next(self, playlist, iter): super(OrderWeighted, self).next(playlist, iter) songs = playlist.get() max_score = sum([song('~#rating') for song in songs]) choice = random.random() * max_score current = 0.0 for i, song in enumerate(songs): current += song("~#rating") if current >= choice: return playlist.get_iter((i,)) else: return playlist.get_iter_first() class OrderOneSong(OrderInOrder): name = "onesong" display_name = _("One Song") accelerated_name = _("_One Song") priority = 3 def next_implicit(self, playlist, iter): if playlist.repeat: return iter else: return None ORDERS = [] def set_orders(orders): ORDERS[:] = [OrderInOrder, OrderShuffle, OrderWeighted, OrderOneSong] ORDERS.extend(orders) ORDERS.sort(lambda K1, K2: cmp(K1.priority, K2.priority) or cmp(K1.name, K2.name)) set_orders([]) class ShuffleButton(Gtk.Box): """A shuffle toggle button + a menu button. In case the shuffle button gets toggled, 'toggled' gets emitted. """ __gsignals__ = { 'toggled': (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self, arrow_down=False): """arrow_down -- the direction of the menu and arrow icon""" super(ShuffleButton, self).__init__() context = self.get_style_context() context.add_class(Gtk.STYLE_CLASS_LINKED) # shuffle button b = Gtk.ToggleButton(image=SymbolicIconImage( "media-playlist-shuffle", Gtk.IconSize.SMALL_TOOLBAR)) b.show_all() qltk.add_css(b, """ * { padding: 0px; } """) b.set_size_request(26, 26) self.pack_start(b, True, True, 0) def forward_signal(*args): self.emit("toggled") b.connect("toggled", forward_signal) self._toggle_button = b # arrow from quodlibet.qltk.menubutton import MenuButton b = MenuButton(arrow=True, down=arrow_down) b.show_all() b.set_size_request(20, 26) qltk.add_css(b, """ * { padding: 0px; } """) self.pack_start(b, True, True, 0) self._menu_button = b def set_active(self, value): """Set if shuffle is active""" self._toggle_button.set_active(value) def get_active(self): """Get if shuffle is active""" return self._toggle_button.get_active() def set_menu(self, menu): """Replace the current menu with a new one""" self._menu_button.set_menu(menu) class PlayOrder(Gtk.Box, PluginHandler): """A play order selection widget. Whenever something changes the 'changed' signal gets emitted. TODO: split up in UI and management part """ __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self, model, player): super(PlayOrder, self).__init__() self._model = model self._player = player self._plugins = [] self._inhibit_save = False self._shuffle = shuffle = ShuffleButton() self.pack_start(shuffle, True, True, 0) if PluginManager.instance: PluginManager.instance.register_handler(self) self._set_order( self._get_order(config.getboolean("memory", "shuffle"))) shuffle.connect("toggled", self._random_toggle) def set_shuffle(self, value): """Set shuffle, will change the order accordingly""" self._shuffle.set_active(value) def get_shuffle(self): """If the active order is a shuffle based one""" return self._shuffle.get_active() def set_active_by_name(self, name): """Set the active play order via the order name. Raises ValueError if not found. """ for order in ORDERS: if order.name == name: self._set_order(order) return raise ValueError("order %r not available" % name) def set_active_by_index(self, index): """Set by index number in global order list. Raises IndexError """ self._set_order(ORDERS[index]) def get_active(self): """Get the active order""" return self._get_order(self.get_shuffle()) def get_active_name(self): """Get the identifier name for the active play order""" return self.get_active().name def _get_order(self, shuffle): """Get the active order for shuffle/inorder mode""" first_matching = None if shuffle: name = config.get("memory", "order_shuffle") else: name = config.get("memory", "order") for order in ORDERS: if order.is_shuffle == shuffle: first_matching = first_matching or order if order.name == name: return order return first_matching def _set_order(self, order_cls): """Set shuffle and order based on the passed class""" self._model.order = order_cls(self._model) is_shuffle = order_cls.is_shuffle if not self._inhibit_save: config.set("memory", "shuffle", is_shuffle) if is_shuffle: config.set("memory", "order_shuffle", order_cls.name) else: config.set("memory", "order", order_cls.name) self.set_shuffle(is_shuffle) self._refresh_menu() self._player.replaygain_profiles[2] = order_cls.replaygain_profiles self._player.reset_replaygain() self.emit("changed") def _refresh_menu(self): is_shuffle = self._shuffle.get_active() def toggled_cb(item, order): if item.get_active(): self._set_order(order) active_order = self._get_order(is_shuffle) menu = Gtk.Menu() group = None for order in ORDERS: if order.is_shuffle == is_shuffle: group = RadioMenuItem( label=order.accelerated_name, use_underline=True, group=group) group.set_active(order == active_order) group.connect("toggled", toggled_cb, order) menu.append(group) menu.show_all() self._shuffle.set_menu(menu) def _random_toggle(self, button): self._set_order(self._get_order(button.get_active())) def plugin_handle(self, plugin): from quodlibet.plugins.playorder import PlayOrderPlugin return issubclass(plugin.cls, PlayOrderPlugin) 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 = plugin.name if plugin_cls.accelerated_name is None: plugin_cls.accelerated_name = plugin_cls.display_name self._plugins.append(plugin_cls) set_orders(self._plugins) self._refresh_menu() def plugin_disable(self, plugin): order = plugin.cls self._plugins.remove(order) set_orders(self._plugins) # Don't safe changes from plugin changes # so that disables on shutdown don't change the config. self._inhibit_save = True self._set_order(self._get_order(self.get_shuffle())) self._inhibit_save = False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/entry.py�������������������������������������������������������������0000644�0001750�0001750�00000020520�12646426641�020430� 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.qltk import is_accel, add_fake_accel from quodlibet.qltk.x import SeparatorMenuItem, MenuItem from quodlibet.qltk import Icons from quodlibet.query import Query, QueryType 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 = self.get_chars(0, -1).decode("utf-8") 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() border = style_context.get_border(Gtk.StateFlags.NORMAL) padding = style_context.get_padding(Gtk.StateFlags.NORMAL) 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, button, *args): # 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(self.get_text().decode("utf-8")) if value is True: color = self.VALID elif value is False: color = self.INVALID elif value and isinstance(value, basestring): 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) def QueryValidator(string): """Returns True/False for a query, None for a text only query""" type_ = Query.get_type(string) if type_ == QueryType.VALID: # in case of an empty but valid query we say it's "text" if Query.match_all(string): return None return True elif type_ == QueryType.INVALID: return False return None class ValidatingEntry(ClearEntry, ValidatingEntryMixin): def __init__(self, validator=None, *args): super(ValidatingEntry, self).__init__(*args) self.set_validate(validator) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/getstring.py���������������������������������������������������������0000644�0001750�0001750�00000005333�12607265240�021273� 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.qltk.entry import UndoEntry from quodlibet.qltk.window import Dialog from quodlibet.qltk import Icons class GetStringDialog(Dialog): """Simple dialog to return a string from the user""" _WIDTH = 300 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_default_size(width=self._WIDTH, height=0) 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) 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.5.3/quodlibet/qltk/songlist.py����������������������������������������������������������0000644�0001750�0001750�00000115663�12646426641�021146� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2012 Christoph Reiter # 2014 Jan Path # 2011-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, GLib, Gdk, GObject from quodlibet import app from quodlibet import config from quodlibet import const from quodlibet import qltk from quodlibet import util 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.util.uri import URI 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 DND_QL, DND_URI_LIST = range(2) class SongInfoSelection(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(SongInfoSelection, self).__init__() self.__idle = None self.__songlist = songlist self.__selection = sel = songlist.get_selection() self.__count = sel.count_selected_rows() self.__sel_id = sel.connect('changed', self.__selection_changed_cb) def destroy(self): self.__selection.disconnect(self.__sel_id) if self.__idle: GLib.source_remove(self.__idle) 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, 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 tag.startswith("<"): for key, value in replace_order.iteritems(): tag = tag.replace("<%s>" % key, "<%s>" % 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-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 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 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: 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 = 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 = (Gtk.drag_get_source_widget(ctx) == view) elif info == DND_URI_LIST: def to_filename(s): try: return URI(s).filename except ValueError: return None filenames = filter(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 = filter(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_SELECT_ALL) 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 = SongInfoSelection(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) 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, basestring): 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): rating_accels = [ "<Primary>%d" % i for i in range( min(10, config.RATINGS.number + 1))] if (qltk.is_accel(event, *rating_accels) and config.getboolean("browsers", "rating_hotkeys")): rating = int(chr(event.keyval)) * config.RATINGS.precision self.__set_rating(rating, self.get_selected_songs(), librarian) return True elif 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, "<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 return False def __enqueue(self, songs): songs = filter(lambda s: s.can_add, songs) 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(filter(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 & Gdk.ModifierType.CONTROL_MASK: 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.columns_autosize() self.set_sort_orders(old_sort) 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 tag.startswith("<"): return util.pattern(tag) return util.tag(tag) current = zip(map(tag_title, current), current) def add_header_toggle(menu, (header, tag), active, column=column): 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""".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 ~#laststarted ~#lastplayed ~#added ~#mtime""".split() fileinfo = """~format ~#bitrate ~#filesize ~filename ~basename ~dirname ~uri ~codec ~encoding""".split() copyinfo = """copyright organization location isrc contact website""".split() all_headers = reduce(lambda x, y: x + y, [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() return qltk.popup_menu_under_widget(menu, widget, 3, time) @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.5.3/quodlibet/qltk/ccb.py���������������������������������������������������������������0000644�0001750�0001750�00000003565�12607265240�020021� 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=True): super(ConfigCheckButton, self).__init__(label=label, use_underline=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.5.3/quodlibet/qltk/lyrics.py������������������������������������������������������������0000644�0001750�0001750�00000011626�12646426641�020603� 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 import urllib from gi.repository import Gtk, GLib from quodlibet import qltk from quodlibet.qltk import Icons from quodlibet import util from quodlibet.util import connect_obj 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) lyricname = song.lyric_filename buffer = view.get_buffer() refresh.connect('clicked', self.__refresh, add, buffer, song) save.connect('clicked', self.__save, lyricname, buffer, delete) delete.connect('clicked', self.__delete, lyricname, 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) if os.path.exists(lyricname): buffer.set_text(file(lyricname).read()) 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" % (urllib.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 = urllib.urlopen( "http://lyricwiki.org/api.php?" "client=QuodLibet&func=getSong&artist=%s&song=%s&fmt=text" % ( urllib.quote(artist.encode('utf-8')), urllib.quote(title.encode('utf-8')))) text = sock.read() except Exception, err: encoding = util.get_locale_encoding() try: err = err.strerror.decode(encoding, 'replace') except: err = _("Unable to download lyrics.") GLib.idle_add(buffer.set_text, 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, lyricname, buffer, delete): try: os.makedirs(os.path.dirname(lyricname)) except EnvironmentError, err: pass try: f = file(lyricname, "w") except EnvironmentError as err: encoding = util.get_locale_encoding() print_w(err.strerror.decode(encoding, "replace")) else: start, end = buffer.get_bounds() f.write(buffer.get_text(start, end, True)) f.close() delete.set_sensitive(True) save.set_sensitive(False) def __delete(self, delete, lyricname, save): 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.5.3/quodlibet/qltk/searchbar.py���������������������������������������������������������0000644�0001750�0001750�00000016573�12646426641�021236� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010-2011 Christoph Reiter, 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, GObject, GLib import quodlibet from quodlibet import config from quodlibet.query import Query from quodlibet.qltk.cbes import ComboBoxEntrySave from quodlibet.qltk.entry import QueryValidator from quodlibet.qltk.ccb import ConfigCheckMenuItem from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.util import limit_songs, DeferredSignal 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, ()), } timeout = 400 def __init__(self, filename=None, completion=None, accel_group=None): 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=QueryValidator, title=_("Saved Searches"), edit_title=_(u"Edit saved searches…")) self.__deferred_changed = DeferredSignal( self.__filter_changed, timeout=self.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_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 self.__entry.get_text().decode("utf-8") 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.5.3/quodlibet/qltk/tagsfrompath.py������������������������������������������������������0000644�0001750�0001750�00000026073�12646426641�021777� 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 import quodlibet from quodlibet import config from quodlibet import qltk from quodlibet import util 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.path import fsdecode from quodlibet.util.tagsfrompath import TagsFromPattern from quodlibet.util.string.splitters import split_value from quodlibet.util import connect_obj 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.get("editing", "split_on").decode('utf-8', 'replace') 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 fsdecode(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 = self.combo.get_child().get_text().decode("utf-8") 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(_('File'), render) 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 = self.combo.get_child().get_text().decode('utf-8') 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 model.itervalues()) 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: 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 = new.decode("utf-8") if entry.get_match(header) != new: entry.replace_match(header, new) self.preview.set_sensitive(True) self.save.set_sensitive(True) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/qltk/data_editors.py������������������������������������������������������0000644�0001750�0001750�00000033000�12607265240�021717� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-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 gi.repository import Pango import re from quodlibet import qltk, util from quodlibet.util.dprint import print_d from quodlibet.qltk.entry import UndoEntry, ValidatingEntry from quodlibet.qltk.views import RCMHintedTreeView, HintedTreeView from quodlibet.qltk.x import MenuItem, Button from quodlibet.qltk import Icons 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 class JSONBasedEditor(qltk.UniqueWindow): """ Flexible editor for objects extending `JSONObject` (held in a `JSONObjectDict`) TODO: validation, especially for name. """ _WIDTH = 600 _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): 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, 10000, 1, 10, 0) entry = Gtk.SpinButton(adjustment=adj) entry.set_numeric(True) callback = self.__changed_numeric_widget elif key.find("pattern") >= 0: print_d("Found Pattern type: %s" % key) entry = ValidatingEntry() 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, basestring): 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) t.attach(l, 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) t.attach(entry, 1, 2, i, i + 1) 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.5.3/quodlibet/__init__.py���������������������������������������������������������������0000644�0001750�0001750�00000050713�12646426641�020062� 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 gettext import locale import os import sys import warnings from quodlibet.compat import builtins, PY2 if PY2: # some code depends on utf-8 default encoding (pygtk used to set it) reload(sys) sys.setdefaultencoding("utf-8") from quodlibet.util import set_process_title, environ, cached_func from quodlibet.util import windows, is_osx from quodlibet.util.path import mkdir, unexpand from quodlibet.util.i18n import GlibTranslations, set_i18n_envvars, \ fixup_i18n_envvars from quodlibet.util.dprint import print_, print_d, print_w, print_e from quodlibet import const from quodlibet.const import MinVersions, Version PLUGIN_DIRS = ["editing", "events", "playorder", "songsmenu", "playlist", "gstreamer", "covers"] GlibTranslations().install(unicode=True) _cli_initialized = False _initialized = False 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 cover_manager = None name = None """The application name e.g. 'Quod Libet'""" id = None """The application ID e.g. 'quodlibet'""" @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() def is_release(): """Returns whether the running version is a stable release or under development. """ return const.VERSION_TUPLE[-1] != -1 @cached_func def get_base_dir(): """The path to the quodlibet package""" file_path = __file__ if os.name == "nt": file_path = file_path.decode(sys.getfilesystemencoding()) return os.path.dirname(os.path.realpath(file_path)) @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'] # XXX: Exec conf.py in this directory, used to override const globals # e.g. for setting USERDIR for the Windows portable version # Note: execfile doesn't handle unicode paths on windows, so encode. # (this doesn't use the old win api in case of str compared to os.*) _CONF_PATH = os.path.join( os.path.dirname(os.path.realpath(__file__)), "conf.py") try: execfile(_CONF_PATH) except IOError: pass # XXX: users shouldn't assume the dir is there, but we currently do in # some places mkdir(USERDIR, 0o750) return USERDIR 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_gtk(): """Call before using Gtk/Gdk""" import gi # disable for consistency and trigger events seem a bit flaky here if is_osx(): os.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("GLib", "2.0") gi.require_version("Gtk", "3.0") gi.require_version("Gdk", "3.0") gi.require_version("GObject", "2.0") gi.require_version("Pango", "1.0") gi.require_version("GdkPixbuf", "2.0") gi.require_version("Gio", "2.0") from gi.repository import Gtk, GObject, Gdk, GdkPixbuf # PyGObject doesn't fail anymore when init fails, so do it ourself initialized, argv = Gtk.init_check(sys.argv) if not initialized: raise SystemExit("Gtk.init failed") sys.argv = list(argv) # add Gtk.TreePath.__getitem__/__len__ for PyGObject 3.2 try: Gtk.TreePath()[0] except TypeError: Gtk.TreePath.__getitem__ = lambda self, index: list(self)[index] Gtk.TreePath.__len__ = lambda self: self.get_depth() # GTK+ 3.4+ constants if not hasattr(Gdk, "BUTTON_PRIMARY"): Gdk.BUTTON_PRIMARY = 1 Gdk.BUTTON_MIDDLE = 2 Gdk.BUTTON_SECONDARY = 3 if not hasattr(Gdk, "EVENT_PROPAGATE"): Gdk.EVENT_PROPAGATE = 0 Gdk.EVENT_STOP = 1 # 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) # 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", name)) # https://bugzilla.gnome.org/show_bug.cgi?id=670372 if not hasattr(GdkPixbuf.Pixbuf, "savev"): GdkPixbuf.Pixbuf.savev = GdkPixbuf.Pixbuf.save # 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) # 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) 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"): 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 overrides if os.name == "nt": # somehow borders are missing under Windows & Gtk+3.14 style_provider = Gtk.CssProvider() style_provider.load_from_data(""" .menu { border: 1px solid @borders; } """) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) if sys.platform == "darwin": # fix duplicated shadows for popups with Gtk+3.14 style_provider = Gtk.CssProvider() style_provider.load_from_data(""" GtkWindow { box-shadow: none; } .tooltip { border-radius: 0; padding: 0; } .tooltip.background { background-clip: border-box; } """) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) # 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["glib"] = None sys.modules["gobject"] = None sys.modules["gnome"] = None from quodlibet.qltk import pygobject_version if pygobject_version < (3, 9): GObject.threads_init() 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(sys.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: sys.argv = argv # monkey patching ahead _fix_gst_leaks() # https://bugzilla.gnome.org/show_bug.cgi?id=710447 import threading threading.Thread(target=lambda: None).start() 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 _init_gettext(): """Call before using gettext helpers""" 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 # 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") if os.path.isdir(localedir): print_d("Using local localedir: %r" % unexpand(localedir)) else: localedir = gettext.bindtextdomain("quodlibet") try: t = gettext.translation("quodlibet", 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)) debug_text = environ.get("QUODLIBET_TEST_TRANS") t.install(unicode=True, debug_text=debug_text) def _init_python(): if sys.version_info < MinVersions.PYTHON: actual = Version(sys.version_info[:3]) raise ImportError("Python %s required. %s found." % (MinVersions.PYTHON, actual)) builtins.__dict__["print_"] = print_ builtins.__dict__["print_d"] = print_d builtins.__dict__["print_e"] = print_e builtins.__dict__["print_w"] = print_w def _init_formats(): from quodlibet.formats import init init() def init_cli(no_translations=False): """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 from quodlibet import config _init_python() config.init_defaults() if not no_translations and "QUODLIBET_NO_TRANS" not in environ: _init_gettext() _init_formats() _cli_initialized = True def init(**kwargs): """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(**kwargs) _init_gtk() _init_gtk_debug() _init_gst() _init_dbus() _initialized = True 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 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) def _init_gtk_debug(): from gi.repository import GLib from quodlibet.qltk.debugwindow import ExceptionDialog print_d("Initializing debugging extensions") def _override_exceptions(): print_d("Enabling custom exception handler.") sys.excepthook = ExceptionDialog.excepthook GLib.idle_add(_override_exceptions) # faulthandler gives a python stacktrace on segfaults.. try: import faulthandler except ImportError: pass else: faulthandler.enable() def _init_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() # 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 shared_app = NSApplication.sharedApplication() delegate = Delegate.alloc().init() delegate.retain() shared_app.setDelegate_(delegate) # QL shouldn't exit on window close, EF should if window.get_osx_is_persistent(): window.connect( "delete-event", lambda window, event: window.hide() or True) 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. """ assert _initialized 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(window, before_quit=None): print_d("Entering quodlibet.main") from gi.repository import Gtk, Gdk assert _initialized 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": _init_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() # set QUODLIBET_START_PERF to measure startup time until the # windows is first shown. if "QUODLIBET_START_PERF" in os.environ: window.connect("draw", Gtk.main_quit) Gtk.main() sys.exit() else: Gtk.main() print_d("Gtk.main() done.") �����������������������������������������������������quodlibet-3.5.3/quodlibet/formats/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017421� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/monkeysaudio.py���������������������������������������������������0000644�0001750�0001750�00000001252�12607265240�022470� 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 ._apev2 import APEv2File class MonkeysAudioFile(APEv2File): format = "Monkey's Audio" def __init__(self, filename): audio = MonkeysAudio(filename) super(MonkeysAudioFile, self).__init__(filename, audio) self["~#length"] = int(audio.info.length) self.sanitize(filename) info = MonkeysAudioFile types = [MonkeysAudioFile] extensions = [".ape"] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/_id3.py�����������������������������������������������������������0000644�0001750�0001750�00000041543�12646426641�020615� 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.config import RATINGS from quodlibet.util.massagers import LanguageMassager from quodlibet.util.path import get_temp_cover_file from quodlibet.util.string import isascii from ._audio import AudioFile from ._image import EmbeddedImage, APICType def encoding_for(s): """Returns ID3 encoding ID best for string `s`""" return 3 if isascii(s) else 1 class ID3hack(mutagen.id3.ID3): """Override 'correct' behavior with desired behavior""" def add(self, tag): if len(type(tag).__name__) == 3: tag = type(tag).__base__(tag) if tag.HashKey in self and tag.FrameID[0] == "T": self[tag.HashKey].extend(tag[:]) else: self[tag.HashKey] = tag 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 IDS.iteritems()]) # 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 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 TXXX_MAP.iteritems()]) Kind = None def __init__(self, filename): audio = self.Kind(filename, ID3=ID3hack) tag = audio.tags or mutagen.id3.ID3() 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 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 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(unicode, frame.text)) elif id3id == "COMM": text = "\n".join(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(unicode, 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)] = "\n".join(map(unicode, 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 isinstance(k, unicode): k = k.encode("utf-8") if not (k and "=" not in k and "~" not in k and k.encode("ascii", "replace") == k): return 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, unicode) if encoding == 0: text = text.encode('iso-8859-1') for codec in self.CODECS: try: text = text.decode(codec) except (UnicodeError, LookupError): pass else: break else: return None return text def write(self): try: tag = mutagen.id3.ID3(self['~filename']) except mutagen.id3.error: tag = mutagen.id3.ID3() # 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"] \ + RG_KEYS + self.TXXX_MAP.values() if "musicbrainz_trackid" in self.realkeys(): f = mutagen.id3.UFID(owner="http://musicbrainz.org", data=self["musicbrainz_trackid"]) 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 LanguageMassager.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")) # 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("~#rating") != RATINGS.default 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) tag.save(self["~filename"]) self.sanitize() can_change_images = True def clear_images(self): """Delete all embedded images""" try: tag = mutagen.id3.ID3(self["~filename"]) except Exception: return tag.delall("APIC") tag.save() self.has_images = False def get_images(self): """Returns a list of embedded images""" images = [] try: tag = mutagen.id3.ID3(self["~filename"]) except Exception: 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: tag = mutagen.id3.ID3(self["~filename"]) except Exception: 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""" try: tag = mutagen.id3.ID3(self["~filename"]) except Exception: tag = mutagen.id3.ID3() try: data = image.file.read() except EnvironmentError: return tag.delall("APIC") frame = mutagen.id3.APIC( encoding=3, mime=image.mime_type, type=APICType.COVER_FRONT, desc=u"", data=data) tag.add(frame) tag.save(self["~filename"]) self.has_images = True �������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/trueaudio.py������������������������������������������������������0000644�0001750�0001750�00000001120�12607265240�021754� 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 info = TrueAudioFile types = [TrueAudioFile] extensions = [".tta"] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/_image.py���������������������������������������������������������0000644�0001750�0001750�00000013616�12615137640�021212� 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 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.""" return def get_images(self): """Returns a list of embedded images, primary first""" # 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""" raise NotImplementedError 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. """ raise NotImplementedError 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) @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.5.3/quodlibet/formats/mp4.py������������������������������������������������������������0000644�0001750�0001750�00000014673�12646426641�020503� 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 ._audio import AudioFile 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:MusicBrainz Artist Id": "musicbrainz_artistid", "----:com.apple.iTunes:MusicBrainz Track Id": "musicbrainz_trackid", "----: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", } __rtranslate = dict([(v, k) for k, v in __translate.iteritems()]) __tupletranslate = { "disk": "discnumber", "trkn": "tracknumber", } __rtupletranslate = dict([(v, k) for k, v in __tupletranslate.iteritems()]) def __init__(self, filename): audio = MP4(filename) self["~codec"] = getattr(audio.info, "codec_description", u"AAC") self["~#length"] = audio.info.length self["~#bitrate"] = int(audio.info.bitrate / 1000) for key, values in audio.items(): if key in self.__tupletranslate: name = self.__tupletranslate[key] cur, total = values[0] if total: self[name] = u"%d/%d" % (cur, total) else: self[name] = unicode(cur) elif key in self.__translate: name = self.__translate[key] if key == "tmpo": self[name] = "\n".join(map(unicode, 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): audio = MP4(self["~filename"]) for key in self.__translate.keys() + self.__tupletranslate.keys(): 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 = map(int, values) elif name.startswith("----"): values = 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)] 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 = self.__rtranslate.keys() + self.__rtupletranslate.keys() 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""" try: tag = MP4(self["~filename"]) except Exception: return 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: return try: tag = MP4(self["~filename"]) except Exception: return try: data = image.file.read() except EnvironmentError: return cover = MP4Cover(data, image_format) tag["covr"] = [cover] tag.save() self.has_images = True info = MP4File types = [MP4File] extensions = ['.mp4', '.m4a', '.m4v', '.3gp', '.3g2', '.3gp2'] ���������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/_apev2.py���������������������������������������������������������0000644�0001750�0001750�00000014075�12646426641�021153� 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 ._audio import AudioFile from ._image import APICType, EmbeddedImage 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 or None""" if image.type == APICType.COVER_FRONT: key = "Cover Art (Front)" else: key = "Cover Art (Back)" try: data = image.file.read() except EnvironmentError: return ext = (image.extensions and image.extensions[0]) or "jpg" data = ("hello.%s\x00" % (ext)) + 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 TRANS.iteritems()]) can_change_images = True def __init__(self, filename, audio=None): if audio: tag = audio.tags or {} else: 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): 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 tag.iterkeys(): 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) tag.save(self["~filename"]) self.sanitize() def get_primary_image(self): try: tag = mutagen.apev2.APEv2(self['~filename']) except mutagen.apev2.APENoHeaderError: return primary = None for key, value in tag.iteritems(): cover_type = get_cover_type(key, value) if cover_type is not None: primary = primary or (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 mutagen.apev2.APENoHeaderError: return [] images = [] for key, value in tag.iteritems(): 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): 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): 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] to_write = write_cover(image) if to_write is None: return key, value = to_write tag[key] = value tag.save(self['~filename']) self.has_images = True �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/wma.py������������������������������������������������������������0000644�0001750�0001750�00000020117�12646426641�020555� 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 ._audio import AudioFile from ._image import EmbeddedImage, APICType 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/Album Id": "musicbrainz_albumid", "MusicBrainz/Artist Id": "musicbrainz_artistid", "MusicBrainz/Album Artist Id": "musicbrainz_albumartistid", "MusicBrainz/TRM Id": "musicbrainz_trmid", "MusicIP/PUID": "musicip_puid", "WM/Year": "date", "WM/OriginalArtist": "originalartist", "WM/OriginalAlbumTitle": "originalalbum", "WM/AlbumSortOrder": "albumsort", "WM/ArtistSortOrder": "artistsort", "WM/Genre": "genre", "WM/Publisher": "publisher", "WM/AuthorURL": "website", "Description": "comment" } __rtranslate = dict([(v, k) for k, v in __translate.iteritems()]) # 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 __translate.iteritems(): if k in __multi_value_attr: __multi_value_keys.add(v) def __init__(self, filename, audio=None): if audio is None: audio = mutagen.asf.ASF(filename) info = audio.info self["~#length"] = info.length self["~#bitrate"] = int(info.bitrate / 1000) try: # mutagen 1.31+ type_, name, desc = info.codec_type, info.codec_name, \ info.codec_description except AttributeError: pass else: 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] = "\n".join(map(unicode, values)) self.sanitize(filename) def write(self): 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) 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""" try: tag = mutagen.asf.ASF(self["~filename"]) except Exception: return tag.pop("WM/Picture", None) tag.save() self.has_images = False def set_image(self, image): """Replaces all embedded images by the passed image""" try: tag = mutagen.asf.ASF(self["~filename"]) except Exception: return try: imagedata = image.file.read() except EnvironmentError: return # 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] 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 = "" while data: char, data = data[:2], data[2:] if char == "\x00\x00": break mime += char else: raise ValueError("mime: missing data") mime = mime.decode("utf-16-le") description = "" while data: char, data = data[:2], data[2:] if char == "\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") + "\x00\x00" data += description.encode("utf-16-le") + "\x00\x00" data += imagedata return data info = WMAFile types = [WMAFile] extensions = [".wma", ".asf", ".wmv"] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/mod.py������������������������������������������������������������0000644�0001750�0001750�00000004102�12607265240�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 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): 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" info = ModFile types = [ModFile] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000005432�12646426641�021533� 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 import os import sys from quodlibet.util.importhelper import load_dir_modules from quodlibet import util from quodlibet import const from quodlibet.util.dprint import print_w from quodlibet.const import MinVersions mimes = set() _infos = {} modules = [] names = [] types = [] _extensions = () def init(): global mimes, _infos, modules, names, _extensions import mutagen if mutagen.version < MinVersions.MUTAGEN: raise ImportError( "Mutagen %s required. %s found." % (MinVersions.MUTAGEN, mutagen.version_string)) base = os.path.dirname(__file__) load_pyc = util.is_windows() or util.is_osx() formats = load_dir_modules(base, package=__package__, load_compiled=load_pyc) for format in formats: name = format.__name__ for ext in format.extensions: _infos[ext] = format.info types.extend(format.types) if format.extensions: for type_ in format.types: mimes.update(type_.mimes) names.append(type_.format) modules.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 modules.sort() names.sort() # 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) if not _infos: raise SystemExit("No formats found!") _extensions = tuple(_infos.keys()) def MusicFile(filename): """Returns a AudioFile instance or None""" lower = filename.lower() for ext in _extensions: if lower.endswith(ext): try: return _infos[ext](filename) except: print_w("Error loading %r" % filename) if const.DEBUG: util.print_exc() return else: print_w("Unknown file extension %r" % filename) return def filter(filename): """Returns true if the file extension is supported""" return filename.lower().endswith(_extensions) from ._audio import PEOPLE, AudioFile, DUMMY_SONG, decode_value from ._image import EmbeddedImage, APICType AudioFile EmbeddedImage DUMMY_SONG PEOPLE decode_value APICType ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/xiph.py�����������������������������������������������������������0000644�0001750�0001750�00000033255�12646426641�020750� 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.config import RATINGS from quodlibet.util.path import get_temp_cover_file from ._audio import AudioFile 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: audio = self.MutagenType(filename) self["~#length"] = audio.info.length try: self["~#bitrate"] = int(audio.info.bitrate / 1000) 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 EnvironmentError: 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 EnvironmentError: return None pictures = [] for data in audio.get("metadata_block_picture", []): try: pictures.append(Picture(base64.b64decode(data))) except (TypeError, FLACError): 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: 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""" if not self.has_images: return try: audio = self.MutagenType(self["~filename"]) except EnvironmentError: return 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""" try: audio = self.MutagenType(self["~filename"]) data = image.file.read() except EnvironmentError: return 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()) 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 rating = self("~#rating") if rating != RATINGS.default: comments["rating:" + email] = str(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): 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") 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: 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 EnvironmentError: 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 EnvironmentError: 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""" try: tag = FLAC(self["~filename"]) except EnvironmentError: return 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""" try: tag = FLAC(self["~filename"]) data = image.file.read() except EnvironmentError: return 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) tag.save() # clear vcomment tags super(FLACFile, self).clear_images() self.has_images = True def write(self): if ID3 is not None: ID3().delete(filename=self["~filename"]) super(FLACFile, self).write() types = [] for var in globals().values(): if getattr(var, 'MutagenType', None): types.append(var) def info(filename): try: audio = mutagen.File(filename, options=ogg_formats) except AttributeError: audio = OggVorbis(filename) if audio is None and FLAC is not None: # FLAC with ID3 try: audio = FLAC(filename) except FLACNoHeaderError: pass if audio is None: raise IOError("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 IOError("file type could not be determined") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/_audio.py���������������������������������������������������������0000644�0001750�0001750�00000076544�12646426641�021250� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2012-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 # 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 quodlibet import util from quodlibet import config from quodlibet.util.path import mkdir, fsdecode, mtime, expanduser, is_fsnative from quodlibet.util.path import normalize_path, fsnative, escape_filename from quodlibet.util.string import encode, decode, isascii from quodlibet.util.uri import URI from quodlibet.util import human_sort_key as human, capitalize from quodlibet.util.tags import TAG_ROLES, TAG_TO_SORT from ._image import ImageContainer 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""" INTERN_NUM_DEFAULT = {"~#lastplayed", "~#laststarted", "~#playcount", "~#skipcount", "~#length", "~#bitrate", "~#filesize"} """Default to 0""" FILESYSTEM_TAGS = {"~filename", "~basename", "~dirname"} """Values are bytes in Linux instead of unicode""" SORT_TO_TAG = dict([(v, k) for (k, v) in TAG_TO_SORT.iteritems()]) """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 isinstance(value, unicode): return value elif isinstance(value, float): return u"%.2f" % value elif tag in FILESYSTEM_TAGS: return fsdecode(value) return unicode(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. """ # New tags received from the backend will update the song fill_metadata = False # New song duration from the backend will update the song fill_length = False # Container for multiple songs, while played new songs can start/end multisong = False # Part of a multisong streamsong = False # Can be added to the queue, playlists can_add = True # Is a real file is_file = True format = "Unknown Audio File" mimes = [] def __song_key(self): return (self("~#disc"), self("~#track"), 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: fsdecode(song(tag), note=False) 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): dict.__setitem__(self, key, value) if not self.__dict__: return pop = self.__dict__.pop pop("album_key", None) pop("sort_key", None) def __delitem__(self, key): dict.__delitem__(self, key) if not self.__dict__: return 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 __cmp__(self, other): if not other: return -1 try: return cmp(self.sort_key, other.sort_key) except AttributeError: return -1 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 __ne__(self, other): return self is not other def reload(self): """Reload an audio file from disk. The caller is responsible for handling any errors.""" fn = self["~filename"] saved = {} for key in self: if key in MIGRATE: saved[key] = self[key] self.clear() self["~filename"] = fn self.__init__(fn) self.update(saved) def realkeys(self): """Returns a list of keys that are not internal, i.e. they don't have '~' in them.""" return filter(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 self.iteritems() if k[:1] != "~") def __call__(self, key, default=u"", connector=" - "): """Return a key, synthesizing it if necessary. 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. For details on tied tags, see the documentation for util.tagsplit. """ if key[:1] == "~": key = key[1:] if "~" in key: real_key = "~" + key values = [] for v in map(self.__call__, util.tagsplit(real_key)): v = decode_value(real_key, v) 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 URI.frompath(self["~filename"]) elif key == "format": return self.get("~format", 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 == "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": try: fileobj = file(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 INTERN_NUM_DEFAULT: return dict.get(self, key, 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 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": v = self(key, u"") if key in FILESYSTEM_TAGS: v = fsdecode(v) else: v = self.get(key, u"") if isinstance(v, (int, long, float)): 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 are not supported. 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, connector="\n") if v == "": return [] else: return v.split("\n") else: v = self.get(key) return [] if v is None else v.split("\n") def list_separate(self, key, connector=" - "): """Similar to list, but will return a list of all combinations for tied tags instead of one comma separated string. In case of tied tags the result will be unicode, otherwise it returns the same as list() """ if key[:1] == "~" and "~" in key[1:]: vals = [] for v in map(self.__call__, util.tagsplit(key)): v = decode_value(key, v) if v: vals.append(v.split("\n")) r = [[]] for x in vals: r = [i + [y] for y in x for i in r] return map(connector.join, r) else: return self.list(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 self.iteritems(): 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 os.path.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 website(self): """Look for a URL in the audio metadata, or a Google search if no URL can be found.""" if "website" in self: return self.list("website")[0] for cont in self.list("contact") + self.list("comment"): c = cont.lower() if (c.startswith("http://") or c.startswith("https://") or c.startswith("www.")): return cont elif c.startswith("//www."): return "http:" + cont else: text = "http://www.google.com/search?q=" esc = lambda c: ord(c) > 127 and '%%%x' % ord(c) or c if "labelid" in self: text += ''.join(map(esc, self["labelid"])) else: artist = util.escape("+".join(self("artist").split())) album = util.escape("+".join(self("album").split())) artist = encode(artist) album = encode(album) artist = "%22" + ''.join(map(esc, artist)) + "%22" album = "%22" + ''.join(map(esc, album)) + "%22" text += artist + "+" + album text += "&ie=UTF8" return text def sanitize(self, filename=None): """Fill in metadata defaults. Find ~mountpoint, ~#mtime, ~#filesize and ~#added. Check for null bytes in tags.""" # Replace nulls with newlines, trimming zero-length segments for key, val in self.items(): if isinstance(val, basestring) and '\0' in val: self[key] = '\n'.join(filter(lambda s: s, val.split('\0'))) # Remove unnecessary defaults if key in INTERN_NUM_DEFAULT and val == 0: del self[key] if filename: self["~filename"] = filename elif "~filename" not in self: raise ValueError("Unknown filename!") assert is_fsnative(self["~filename"]) 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 "/" if os.path.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.""" def encode_key(k): return encode(k) if isinstance(k, unicode) else k s = [] for k in self.keys(): enc_key = encode_key(k) if isinstance(self[k], int) or isinstance(self[k], long): s.append("%s=%d" % (enc_key, self[k])) elif isinstance(self[k], float): s.append("%s=%f" % (enc_key, self[k])) else: for v2 in self.list(k): if isinstance(v2, str): s.append("%s=%s" % (enc_key, v2)) else: s.append("%s=%s" % (enc_key, encode(v2))) for k in (INTERN_NUM_DEFAULT - set(self.keys())): enc_key = encode_key(k) s.append("%s=%d" % (enc_key, self.get(k, 0))) if "~#rating" not in self: s.append("~#rating=%f" % self("~#rating")) s.append("~format=%s" % self.format) s.append("") return "\n".join(s) def from_dump(self, text): """Parses the text created with to_dump and adds the found tags.""" def decode_key(key): """str if ascii, otherwise decode using utf-8""" try: key.decode("ascii") except ValueError: return decode(key) return key for line in text.split("\n"): if not line: continue parts = line.split("=") key = parts[0] val = "=".join(parts[1:]) if key == "~format": pass elif key.startswith("~#"): try: self.add(key, int(val)) except ValueError: try: self.add(key, float(val)) except ValueError: pass else: self.add(decode_key(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.""" 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': '/dev/null', 'artist': 'The Artist', 'album': 'An Example Album', 'title': 'First Track', 'tracknumber': 1, 'date': '2010-12-31', }) ������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/wav.py������������������������������������������������������������0000644�0001750�0001750�00000002042�12607265240�020554� 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 quodlibet.util.path import fsdecode from ._audio import AudioFile extensions = [".wav"] class WAVEFile(AudioFile): format = "WAVE" mimes = ["audio/wav", "audio/x-wav", "audio/wave"] def __init__(self, filename): with open(filename, "rb") as h: f = wave.open(h) self["~#length"] = f.getnframes() / f.getframerate() self.sanitize(filename) def sanitize(self, filename): super(WAVEFile, self).sanitize(filename) self["title"] = fsdecode(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" info = WAVEFile types = [WAVEFile] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/mpc.py������������������������������������������������������������0000644�0001750�0001750�00000003055�12607265240�020543� 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 ._apev2 import APEv2File class MPCFile(APEv2File): format = "Musepack" mimes = ["audio/x-musepack", "audio/x-mpc"] def __init__(self, filename): audio = Musepack(filename) super(MPCFile, self).__init__(filename, audio) self["~#length"] = audio.info.length self["~#bitrate"] = int(audio.info.bitrate / 1000) 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 = unicode(audio.info.title_peak * 2) self.setdefault("replaygain_track_peak", track_p) if audio.info.album_peak: album_p = unicode(audio.info.album_peak * 2) self.setdefault("replaygain_album_peak", album_p) except AttributeError: pass self.sanitize(filename) info = MPCFile types = [MPCFile] extensions = [".mpc", ".mp+"] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/mp3.py������������������������������������������������������������0000644�0001750�0001750�00000002145�12607265240�020462� 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 try: # mutagen 1.30+ encoder, brm = info.encoder_info, info.bitrate_mode except AttributeError: pass else: brm = {1: u"CBR", 2: u"VBR", 3: u"ABR"}.get(brm, u"") encoding = u"\n".join(filter(None, [encoder, brm])) if encoding: self["~encoding"] = encoding info = MP3File types = [MP3File] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/remote.py���������������������������������������������������������0000644�0001750�0001750�00000002764�12607265240�021265� 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 from quodlibet.util.path import fsnative, is_fsnative from quodlibet.util.uri import URI from ._audio import AudioFile extensions = [] class RemoteFile(AudioFile): is_file = False fill_metadata = True format = "Remote File" def __init__(self, uri): self["~uri"] = str(URI(uri)) self.sanitize(fsnative(unicode(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 is_fsnative(value): if os.name == "nt": value = unicode(value) else: value = value.encode("utf-8") 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): raise TypeError("RemoteFiles do not support writing!") def can_change(self, k=None): if k is None: return [] else: return False @property def key(self): return self["~uri"] info = RemoteFile types = [RemoteFile] ������������quodlibet-3.5.3/quodlibet/formats/wavpack.py��������������������������������������������������������0000644�0001750�0001750�00000001253�12607265240�021416� 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 ._apev2 import APEv2File class WavpackFile(APEv2File): format = "WavPack" mimes = ["audio/x-wavpack"] def __init__(self, filename): audio = WavPack(filename) super(WavpackFile, self).__init__(filename, audio) self["~#length"] = audio.info.length self.sanitize(filename) info = WavpackFile types = [WavpackFile] extensions = [".wv"] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/midi.py�����������������������������������������������������������0000644�0001750�0001750�00000011677�12607265240�020717� 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 struct from ._audio import AudioFile class MidiError(Exception): pass class MidiFile(AudioFile): format = "MIDI" mimes = ["audio/midi", "audio/x-midi"] def __init__(self, filename): h = open(filename, "rb") try: if h.read(4) != "MThd": raise MidiError("Not a Midi file") h.seek(0, 0) try: self["~#length"] = read_midi_length(h) except Exception: pass finally: h.close() 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" info = MidiFile types = [MidiFile] extensions = [".mid"] TEMPO, MIDI = range(2) def var_int(string): val = 0 i = 0 while 1: x = ord(string[i]) i += 1 val = (val << 7) + (x & 0x7F) if not (x & 0x80): return val, i def read_track(chunk): """Retuns a list of midi events and tempo change events""" # Deviations: The running status should be reset on non midi events, but # some files contain meta events inbetween. # Offset and time signature are not used. tempos = [] events = [] deltasum = 0 status = "" while chunk: delta, i = var_int(chunk) deltasum += delta chunk = chunk[i:] event_type = chunk[0] if event_type == "\xFF": num, i = var_int(chunk[2:]) size = 2 + i + num data = chunk[size - num:size] # TODO: support offset/time signature if chunk[1] == "\x51": tempo = struct.unpack(">I", "\x00" + data)[0] tempos.append((deltasum, TEMPO, tempo)) chunk = chunk[size:] elif event_type in ("\xF0", "\xF7"): chunk = chunk[1 + sum(var_int(chunk[1:])):] else: # if < 0x80 take the type from the previous midi event event_num = ord(event_type) if event_num < 0x80: offset = -1 event_num = ord(status) elif event_num >= 0xF0: # garbage... better stop break else: offset = 0 status = event_type events.append((deltasum, MIDI, delta)) if event_num >> 4 in (0xD, 0xC): chunk = chunk[2 + offset:] else: chunk = chunk[3 + offset:] return events, tempos def read_midi_length(fileobj): """Returns the duration in seconds. Can raise all kind of errors...""" def read_chunk(fileobj): info = fileobj.read(8) chunklen = struct.unpack(">I", info[4:])[0] return info[:4], fileobj.read(chunklen) identifier, chunk = read_chunk(fileobj) if identifier != "MThd": raise MidiError("Not a MIDI file") format_ = struct.unpack(">H", chunk[:2])[0] if format_ > 1: raise MidiError("Not supported format %d" % format_) ntracks = struct.unpack(">H", chunk[2:4])[0] tickdiv = struct.unpack(">H", chunk[4:6])[0] if tickdiv >> 15: # fps = (-(tickdiv >> 8)) & 0xFF # subres = tickdiv & 0xFF # never saw one of those raise MidiError("Not supported timing interval") # get a list of events and tempo changes for each track tracks = [] first_tempos = None for tracknum in xrange(ntracks): identifier, chunk = read_chunk(fileobj) if identifier != "MTrk": break events, tempos = read_track(chunk) # In case of format == 1, copy the first tempo list to all tracks first_tempos = first_tempos or tempos if format_ == 1: tempos = list(first_tempos) events += tempos events.sort() tracks.append(events) # calculate the duration of each track durations = [] for events in tracks: tempo = 500000 parts = [] deltasum = 0 for (dummy, type_, data) in events: if type_ == TEMPO: parts.append((deltasum, tempo)) tempo = data deltasum = 0 else: deltasum += data parts.append((deltasum, tempo)) duration = 0 for (deltasum, tempo) in parts: quarter, tpq = deltasum / float(tickdiv), tempo duration += (quarter * tpq) duration /= 10 ** 6 durations.append(duration) # return the longest one return max(durations) �����������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/aac.py������������������������������������������������������������0000644�0001750�0001750�00000002146�12607265240�020510� 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 ._audio import AudioFile extensions = [".aac", ".adif", ".adts"] try: # since mutagen 1.27 from mutagen.aac import AAC except ImportError: extensions = [] class AACFile(AudioFile): """ADTS/ADIF files""" format = "AAC" mimes = ["audio/x-aac"] fill_length = True def __init__(self, filename): audio = AAC(filename) self["~#length"] = audio.info.length self["~#bitrate"] = int(audio.info.bitrate / 1000) 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" info = AACFile types = [AACFile] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/vgm.py������������������������������������������������������������0000644�0001750�0001750�00000003104�12607265240�020550� 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 class VgmFile(AudioFile): format = "VGM" mimes = [] def __init__(self, filename): with open(filename, "rb") as h: header = h.read(64) if len(header) != 64 or header[:4] != "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" info = VgmFile types = [VgmFile] extensions = [".vgm"] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/formats/spc.py������������������������������������������������������������0000644�0001750�0001750�00000004041�12607265240�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 ._audio import AudioFile extensions = [".spc"] class SPCFile(AudioFile): format = "SPC700" def __init__(self, filename): h = open(filename, "rb") try: head = h.read(46) if len(head) != 46 or head[:27] != 'SNES-SPC700 Sound File Data': raise IOError("Not a valid SNES-SPC700 file") if head[35] == '\x1a': data = h.read(210) if len(data) == 210: self.update(parse_id666(data)) finally: h.close() self.setdefault("title", 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 data[130] < 'A': try: tags["~#length"] = int(data[123:126].strip("\x00")) except ValueError: pass tags["artist"] = data[131:163] else: tags["artist"] = data[130:162] for k in tags.keys(): if k[:2] == "~#": continue tags[k] = tags[k].replace("\x00", "").decode("ascii", "ignore") if not tags[k]: del tags[k] return tags info = SPCFile types = [SPCFile] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/���������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�016723� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/i18n.py��������������������������������������������������������������0000644�0001750�0001750�00000013513�12646426641�020054� 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 quodlibet.compat import builtins 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": import ctypes k32 = ctypes.windll.kernel32 langs = filter(None, map(locale.windows_locale.get, [k32.GetUserDefaultUILanguage(), k32.GetSystemDefaultUILanguage()])) if langs: os.environ.setdefault('LANG', langs[0]) os.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) os.environ.setdefault('LANG', lang) preferred_langs = NSLocale.preferredLanguages() if preferred_langs: languages = map(bcp47_to_language, preferred_langs) os.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 = os.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") os.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) 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 = unicode(message) return unicode(gettext.GNUTranslations.ugettext(self, message)) def ungettext(self, msgid1, msgid2, n): # see ugettext msgid1 = unicode(msgid1) msgid2 = unicode(msgid2) return unicode( gettext.GNUTranslations.ungettext(self, msgid1, msgid2, n)) def unpgettext(self, context, msgid, msgidplural, n): context = unicode(context) msgid = unicode(msgid) msgidplural = unicode(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 = unicode(context) msgid = unicode(msgid) real_msgid = u"%s\x04%s" % (context, msgid) result = self.ugettext(real_msgid) if result == real_msgid: return msgid return result def install(self, unicode=False, debug_text=None): if not unicode: raise NotImplementedError if debug_text is not None: def wrap(f): def g(*args, **kwargs): return debug_text + f(*args, **kwargs) + debug_text return g else: def wrap(f): return f builtins.__dict__["_"] = wrap(self.ugettext) builtins.__dict__["N_"] = wrap(type(u"")) builtins.__dict__["C_"] = wrap(self.upgettext) builtins.__dict__["ngettext"] = wrap(self.ungettext) builtins.__dict__["npgettext"] = wrap(self.unpgettext) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/config.py������������������������������������������������������������0000644�0001750�0001750�00000031375�12646426641�020550� 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.""" import os import csv try: # Python 2 from ConfigParser import RawConfigParser as ConfigParser, Error, \ NoSectionError except ImportError: # Python 3 from configparser import RawConfigParser as ConfigParser, Error, \ NoSectionError from quodlibet.compat import cBytesIO from quodlibet.util import atomic_save, list_unique from quodlibet.util.string import join_escape, split_escape from quodlibet.util.path import is_fsnative, 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(dict): 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.set(section, option, self.defaults.get(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 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: vals = [v.decode('utf-8') for v in parser.next()] 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""" sw = cBytesIO() values = [unicode(v).encode('utf-8') 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 = map(str, 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. """ # 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 write(self, filename): """Write config to filename. Can raise EnvironmentError """ assert is_fsnative(filename) 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, ".tmp", "wb") as fileobj: self._config.write(fileobj) 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. """ parsed_filenames = self._config.read(filename) # don't upgrade if we just created a new config if parsed_filenames and 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"]: setattr(cls, name, get_func(name)) ConfigProxy._init_wrappers() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/logging.py�����������������������������������������������������������0000644�0001750�0001750�00000004017�12607265240�020713� 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 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, str): 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.5.3/quodlibet/util/library.py�����������������������������������������������������������0000644�0001750�0001750�00000005313�12607265240�020731� 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 import sys 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 from quodlibet.query import Query from quodlibet.qltk.songlist import SongList from quodlibet.util.string import split_escape, join_escape from quodlibet.util.path import bytes2fsnative, fsnative2bytes, fsnative def background_filter(): bg = config.get("browsers", "background").decode('utf-8') if not bg: return try: return Query(bg, SongList.star).search except Query.error: pass def split_scan_dirs(s): """Split the value of the "scan" setting, accounting for drive letters on win32.""" if sys.platform == "win32": return filter(None, re.findall(r"[a-zA-Z]:[\\/][^:]*", s)) else: # See Issue 1413 - allow escaped colons return filter(None, split_escape(s, ":")) def get_scan_dirs(): dirs = split_scan_dirs(config.get("settings", "scan")) return [bytes2fsnative(d) for d in dirs if d] def set_scan_dirs(dirs): if sys.platform == "win32": joined = fsnative(u":").join(dirs) else: joined = join_escape(dirs, fsnative(u":")) config.set("settings", "scan", fsnative2bytes(joined)) def scan_library(library, force): """Start the global library re-scan If `force` is True, reload all existing valid items. """ paths = get_scan_dirs() exclude = split_scan_dirs(config.get("library", "exclude")) exclude = [bytes2fsnative(e) for e in exclude] 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.5.3/quodlibet/util/collections.py�������������������������������������������������������0000644�0001750�0001750�00000012005�12614375164�021604� 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 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 iterkeys = lambda self: iter(self.keys()) def values(self): return map(self.__getitem__, self.keys()) itervalues = lambda self: iter(self.values()) def items(self): return zip(self.keys(), self.values()) iteritems = lambda s: iter(s.items()) def clear(self): for key in self.keys(): 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 = self.keys()[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 __cmp__(self, other): if other is None: return 1 else: return cmp(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 then once""" return len(self._map) != len(self) def __repr__(self): return repr(self._data) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/path.py��������������������������������������������������������������0000644�0001750�0001750�00000032606�12646426641�020235� 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 import urllib from quodlibet.compat import pathname2url, text_type, PY2 from quodlibet.util.string import decode from . import windows from .misc import environ, get_fs_encoding if sys.platform == "darwin": from Foundation import NSString _FSCODING = get_fs_encoding() """ Path related functions like open, os.listdir have different behavior on win32 - Passing a string calls the old non unicode win API. In case of listdir this leads to "?" for >1byte chars and to 1 byte chars encoded using the fs encoding. -> DO NOT USE! - Passing a unicode object internally calls the windows unicode functions. This will mostly lead to proper unicode paths (except expanduser). And that's why QL is using unicode paths on win and encoded paths everywhere else. """ 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 fsdecode(s, note=True): """Takes a native path and returns unicode for displaying it. Can not fail and can't be reversed. """ if isinstance(s, unicode): return s elif note: return decode(s, _FSCODING) else: return s.decode(_FSCODING, 'replace') """ There exist 3 types of paths: * Python: bytes on Linux, unicode on Windows * GLib: bytes on Linux, utf-8 bytes on Windows * Serialized for the config: same as GLib """ if sys.platform == "win32": # We use FSCODING to save paths in files for example, # so this should never change on Windows (like in glib) assert _FSCODING == "utf-8" def is_fsnative(path): """If path is a native path""" return isinstance(path, text_type) def fsnative(path=u""): """unicode -> native path""" assert isinstance(path, text_type) return path def glib2fsnative(path): """glib path -> native path""" assert isinstance(path, bytes) return path.decode("utf-8") def fsnative2glib(path): """native path -> glib path""" assert isinstance(path, text_type) return path.encode("utf-8") fsnative2bytes = fsnative2glib """native path -> bytes Can never fail. """ bytes2fsnative = glib2fsnative """bytes -> native path Warning: This can fail (raise ValueError) only on Windows, if the input wasn't produced by fsnative2bytes. """ else: if PY2: def is_fsnative(path): return isinstance(path, bytes) def fsnative(path=u""): assert isinstance(path, text_type) return path.encode(_FSCODING, 'replace') def glib2fsnative(path): assert isinstance(path, bytes) return path def fsnative2glib(path): assert isinstance(path, bytes) return path fsnative2bytes = fsnative2glib bytes2fsnative = glib2fsnative else: def is_fsnative(path): return isinstance(path, text_type) def fsnative(path=u""): assert isinstance(path, text_type) return path def glib2fsnative(path): assert isinstance(path, text_type) return path def fsnative2glib(path): assert isinstance(path, text_type) return path def fsnative2bytes(path): assert isinstance(path, text_type) return path.encode(_FSCODING, "surrogateescape") def bytes2fsnative(path): assert isinstance(path, bytes) return path.decode(_FSCODING, "surrogateescape") 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 is_fsnative(path) 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)] if os.name == "nt": getcwd = os.getcwdu sep = os.sep.decode("ascii") pathsep = os.pathsep.decode("ascii") else: getcwd = os.getcwd sep = os.sep pathsep = os.pathsep 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. Takes unicode or str and returns a fsnative path. """ if isinstance(s, unicode): s = s.encode("utf-8") return fsnative(urllib.quote(s, safe="").decode("utf-8")) def unescape_filename(s): """Unescape a string in a manner suitable for a filename.""" if isinstance(s, unicode): s = s.encode("utf-8") return urllib.unquote(s).decode("utf-8") def expanduser(filename): """needed because expanduser does not return wide character paths on windows even if a unicode path gets passed. """ if os.name == "nt": profile = windows.get_profile_dir() or u"" if filename == "~": return profile if filename.startswith(u"~" + os.path.sep): return os.path.join(profile, filename[2:]) return os.path.expanduser(filename) def unexpand(filename, HOME=expanduser("~")): """Replace the user's home directory with ~/, if it appears at the start of the path name.""" sub = (os.name == "nt" and "%USERPROFILE%") or "~" if filename == HOME: return sub elif filename.startswith(HOME + os.path.sep): filename = filename.replace(HOME, sub, 1) return filename def find_mount_point(path): while not os.path.ismount(path): path = os.path.dirname(path) return path def pathname2url_win32(path): # stdlib version raises IOError for more than one ':' which can appear # using a virtual box shared folder and it inserts /// at the beginning # but it should be /. # windows paths should be unicode if isinstance(path, unicode): path = path.encode("utf-8") quote = urllib.quote if ":" not in path: return quote("/".join(path.split("\\"))) drive, remain = path.split(":", 1) return "/%s:%s" % (quote(drive), quote("/".join(remain.split("\\")))) if os.name == "nt": pathname2url pathname2url = pathname2url_win32 else: pathname2url 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(glib2fsnative(dir_)) return dirs data_dirs = os.getenv("XDG_DATA_DIRS") if data_dirs: return 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 glib2fsnative(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 glib2fsnative(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 glib2fsnative(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 os.environ while calling this function. See http://www.freedesktop.org/wiki/Software/xdg-user-dirs/ Can't fail (but might return garbage). """ paths = {} for line in data.splitlines(): if line.startswith("#"): continue parts = line.split("=", 1) if len(parts) <= 1: continue key = parts[0] try: values = shlex.split(parts[1]) except ValueError: continue if len(values) != 1: continue paths[key] = os.path.normpath( os.path.expandvars(bytes2fsnative(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 is_fsnative(path) 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("~") ��������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/fifo.py��������������������������������������������������������������0000644�0001750�0001750�00000014335�12646426641�020223� 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 errno import signal import stat import tempfile try: import fcntl fcntl except ImportError: fcntl = None from gi.repository import GLib from quodlibet.util.path import mkdir 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""" # 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 seperated commands without a return fifo path. and "NULL<command>NULL<fifo-path>NULL" Raises ValueError """ arg = 0 args = [] while data: if arg == 0: index = data.find("\x00") if index == 0: arg = 1 data = data[1:] continue if index == -1: elm = data data = "" else: elm, data = data[:index], data[index:] for l in elm.splitlines(): yield (l, None) elif arg == 1: elm, data = data.split("\x00", 1) args.append(elm) arg = 2 elif arg == 2: elm, data = data.split("\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 or raises EnvironmentError. """ fd, filename = tempfile.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, "\x00" + data + "\x00" + filename + "\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): # 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): self._callback = callback self._path = path def open(self): """Create the fifo and listen to it. Might raise FIFOError in case another process is already using it. """ self._open(False, None) def destroy(self): 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, 0600) 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, "r", 4096) except OSError: pass 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.5.3/quodlibet/util/misc.py��������������������������������������������������������������0000644�0001750�0001750�00000003710�12607265240�020217� 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 . import windows if os.name == "nt": environ = windows.WindowsEnviron() else: environ = os.environ """ An environ dict which contains unicode under Windows and str everywhere else """ if os.name == "nt": argv = windows.get_win32_unicode_argv() else: argv = sys.argv """ An argv list which contains unicode under Windows and str everywhere else """ def cached_func(f): """Decorateor 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() except locale.Error: encoding = "utf-8" else: # python on macports can return a bugs result (empty string) encoding = _verify_encoding(encoding) return encoding @cached_func def get_fs_encoding(): """Returns the encoding used for paths by glib.""" if os.name == "nt": return "utf-8" # https://developer.gnome.org/glib/stable/glib-running.html if "G_FILENAME_ENCODING" in os.environ: fscoding = os.environ["G_FILENAME_ENCODING"].split(",")[0] if fscoding == "@locale": fscoding = get_locale_encoding() return _verify_encoding(fscoding) elif "G_BROKEN_FILENAMES" in os.environ: return get_locale_encoding() else: return "utf-8" ��������������������������������������������������������quodlibet-3.5.3/quodlibet/util/songwrapper.py�������������������������������������������������������0000644�0001750�0001750�00000006775�12501341560�021642� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 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 import util from quodlibet import qltk from quodlibet.qltk.wlw import WritingWindow 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 __cmp__(self, other): try: return cmp(self._song, other._song) except: return cmp(self._song, other) 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 map(wrap, songs) def check_wrapper_changed(library, parent, songs): needs_write = filter(lambda s: s._needs_write, songs) if needs_write: win = WritingWindow(parent, len(needs_write)) win.show() for song in needs_write: try: song._song.write() except Exception: 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() 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.5.3/quodlibet/util/importhelper.py������������������������������������������������������0000644�0001750�0001750�00000006333�12501341560�021773� 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: 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, 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.5.3/quodlibet/util/trash.py�������������������������������������������������������������0000644�0001750�0001750�00000007401�12646426641�020415� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011 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 sys import errno import urllib import time 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 class TrashError(EnvironmentError): pass def is_sticky(path): return bool(os.stat(path).st_mode & stat.S_ISVTX) def get_fd_trash_dir(path): """Returns the right trash directory for the given path.""" path = abspath(path) mount = find_mount_point(path) xdg_data_home = xdg_get_data_home() xdg_mount = find_mount_point(xdg_data_home) if mount == xdg_mount: trash_home = join(xdg_data_home, "Trash") return trash_home else: root = join(mount, ".Trash") uid = str(os.getuid()) if isdir(root) and not islink(root) and is_sticky(root): root = join(root, uid) else: root = join(mount, ".Trash-" + uid) return root def trash_free_desktop(path): """Partial implementation of http://www.freedesktop.org/wiki/Specifications/trash-spec No copy fallback, either it can be moved on the same FS or it failes. Also 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 = abspath(get_fd_trash_dir(path)) # to make things easier if path.startswith(join(trash_dir, "")) or path == trash_dir: raise TrashError("Can't move files to the trash from within the" "trash directory.") files = join(trash_dir, "files") info = join(trash_dir, "info") for d in (files, info): if not isdir(d): os.makedirs(d, 0700) info_ext = ".trashinfo" name = basename(path) flags = os.O_EXCL | os.O_CREAT | os.O_WRONLY mode = 0644 try: info_path = join(info, name + info_ext) info_fd = os.open(info_path, flags, mode) except OSError, 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, 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 Info]\n" data += "Path=%s\n" % urllib.pathname2url(norm_path) data += "DeletionDate=%s\n" % del_date os.write(info_fd, data) os.close(info_fd) try: # We only move to the same file system.. so this is ok. os.rename(path, join(files, name)) except OSError: # In case something failes, remove the info file and raise again 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.5.3/quodlibet/util/massagers.py���������������������������������������������������������0000644�0001750�0001750�00000017757�12646426641�021300� 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 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 = [] def validate(self, value): """Returns a validated value, or False if invalid""" raise NotImplementedError def is_valid(self, value): """Returns True if a field is valid, False if not""" return bool(self.validate(value)) 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("/", "-") return self.__match(value) and value 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): return False else: return ("%+f" % f).rstrip("0") + " dB" 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): return False else: return (f >= 0) and (f < 2) and str(f) 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') value = filter(str.isalnum, value.strip().lower()) try: int(value, 16) except ValueError: return False else: if len(value) != 32: return False else: return "-".join([value[:8], value[8:12], value[12:16], value[16:20], value[20:]]) 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): return value in self.options and value class LanguageMassager(Massager): tags = ["language"] error = _("Language must be an ISO 639-2 three-letter code") # Lovingly adapted from http://www.loc.gov/standards/iso639-2/ ISO_639_2 = [ 'aar', 'abk', 'ace', 'ach', 'ada', 'ady', 'afa', 'afh', 'afr', 'ain', 'aka', 'akk', 'alb', 'sqi', 'ale', 'alg', 'alt', 'amh', 'ang', 'anp', 'apa', 'ara', 'arc', 'arg', 'arm', 'hye', 'arn', 'arp', 'art', 'arw', 'asm', 'ast', 'ath', 'aus', 'ava', 'ave', 'awa', 'aym', 'aze', 'bad', 'bai', 'bak', 'bal', 'bam', 'ban', 'baq', 'eus', 'bas', 'bat', 'bej', 'bel', 'bem', 'ben', 'ber', 'bho', 'bih', 'bik', 'bin', 'bis', 'bla', 'bnt', 'bos', 'bra', 'bre', 'btk', 'bua', 'bug', 'bul', 'bur', 'mya', 'byn', 'cad', 'cai', 'car', 'cat', 'cau', 'ceb', 'cel', 'cha', 'chb', 'che', 'chg', 'chi', 'zho', 'chk', 'chm', 'chn', 'cho', 'chp', 'chr', 'chu', 'chv', 'chy', 'cmc', 'cop', 'cor', 'cos', 'cpe', 'cpf', 'cpp', 'cre', 'crh', 'crp', 'csb', 'cus', 'cze', 'ces', 'dak', 'dan', 'dar', 'day', 'del', 'den', 'dgr', 'din', 'div', 'doi', 'dra', 'dsb', 'dua', 'dum', 'dut', 'nld', 'dyu', 'dzo', 'efi', 'egy', 'eka', 'elx', 'eng', 'enm', 'epo', 'est', 'ewe', 'ewo', 'fan', 'fao', 'fat', 'fij', 'fil', 'fin', 'fiu', 'fon', 'fre', 'fra', 'frm', 'fro', 'frr', 'frs', 'fry', 'ful', 'fur', 'gaa', 'gay', 'gba', 'gem', 'geo', 'kat', 'ger', 'deu', 'gez', 'gil', 'gla', 'gle', 'glg', 'glv', 'gmh', 'goh', 'gon', 'gor', 'got', 'grb', 'grc', 'gre', 'ell', 'grn', 'gsw', 'guj', 'gwi', 'hai', 'hat', 'hau', 'haw', 'heb', 'her', 'hil', 'him', 'hin', 'hit', 'hmn', 'hmo', 'hrv', 'hsb', 'hun', 'hup', 'iba', 'ibo', 'ice', 'isl', 'ido', 'iii', 'ijo', 'iku', 'ile', 'ilo', 'ina', 'inc', 'ind', 'ine', 'inh', 'ipk', 'ira', 'iro', 'ita', 'jav', 'jbo', 'jpn', 'jpr', 'jrb', 'kaa', 'kab', 'kac', 'kal', 'kam', 'kan', 'kar', 'kas', 'kau', 'kaw', 'kaz', 'kbd', 'kha', 'khi', 'khm', 'kho', 'kik', 'kin', 'kir', 'kmb', 'kok', 'kom', 'kon', 'kor', 'kos', 'kpe', 'krc', 'krl', 'kro', 'kru', 'kua', 'kum', 'kur', 'kut', 'lad', 'lah', 'lam', 'lao', 'lat', 'lav', 'lez', 'lim', 'lin', 'lit', 'lol', 'loz', 'ltz', 'lua', 'lub', 'lug', 'lui', 'lun', 'luo', 'lus', 'mac', 'mkd', 'mad', 'mag', 'mah', 'mai', 'mak', 'mal', 'man', 'mao', 'mri', 'map', 'mar', 'mas', 'may', 'msa', 'mdf', 'mdr', 'men', 'mga', 'mic', 'min', 'mis', 'mkh', 'mlg', 'mlt', 'mnc', 'mni', 'mno', 'moh', 'mon', 'mos', 'mul', 'mun', 'mus', 'mwl', 'mwr', 'myn', 'myv', 'nah', 'nai', 'nap', 'nau', 'nav', 'nbl', 'nde', 'ndo', 'nds', 'nep', 'new', 'nia', 'nic', 'niu', 'nno', 'nob', 'nog', 'non', 'nor', 'nqo', 'nso', 'nub', 'nwc', 'nya', 'nym', 'nyn', 'nyo', 'nzi', 'oci', 'oji', 'ori', 'orm', 'osa', 'oss', 'ota', 'oto', 'paa', 'pag', 'pal', 'pam', 'pan', 'pap', 'pau', 'peo', 'per', 'fas', 'phi', 'phn', 'pli', 'pol', 'pon', 'por', 'pra', 'pro', 'pus', 'que', 'raj', 'rap', 'rar', 'roa', 'roh', 'rom', 'rum', 'ron', 'run', 'rup', 'rus', 'sad', 'sag', 'sah', 'sai', 'sal', 'sam', 'san', 'sas', 'sat', 'scn', 'sco', 'sel', 'sem', 'sga', 'sgn', 'shn', 'sid', 'sin', 'sio', 'sit', 'sla', 'slo', 'slk', 'slv', 'sma', 'sme', 'smi', 'smj', 'smn', 'smo', 'sms', 'sna', 'snd', 'snk', 'sog', 'som', 'son', 'sot', 'spa', 'srd', 'srn', 'srp', 'srr', 'ssa', 'ssw', 'suk', 'sun', 'sus', 'sux', 'swa', 'swe', 'syc', 'syr', 'tah', 'tai', 'tam', 'tat', 'tel', 'tem', 'ter', 'tet', 'tgk', 'tgl', 'tha', 'tib', 'bod', 'tig', 'tir', 'tiv', 'tkl', 'tlh', 'tli', 'tmh', 'tog', 'ton', 'tpi', 'tsi', 'tsn', 'tso', 'tuk', 'tum', 'tup', 'tur', 'tut', 'tvl', 'twi', 'tyv', 'udm', 'uga', 'uig', 'ukr', 'umb', 'und', 'urd', 'uzb', 'vai', 'ven', 'vie', 'vol', 'vot', 'wak', 'wal', 'war', 'was', 'wel', 'cym', 'wen', 'wln', 'wol', 'xal', 'xho', 'yao', 'yap', 'yid', 'yor', 'ypk', 'zap', 'zbl', 'zen', 'zha', 'znd', 'zul', 'zun', 'zxx', 'zza', ] 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 tags = {} for f in globals().values(): if isinstance(f, type) and issubclass(f, Massager): for t in f.tags: tags[t] = f() del(f) del(t) �����������������quodlibet-3.5.3/quodlibet/util/compat.py������������������������������������������������������������0000644�0001750�0001750�00000000563�12614366323�020554� 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 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: text_type = unicode else: text_type = str ���������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/thread.py������������������������������������������������������������0000644�0001750�0001750�00000007120�12607265240�020532� 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.pool import ThreadPool 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: _pools[priority] = ThreadPool() 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(result): global _prio_mapping 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) pool.apply_async(wrapped_func, 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 _pools.items(): del _pools[key] pool.terminate() 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.5.3/quodlibet/util/string/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020231� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/string/splitters.py��������������������������������������������������0000644�0001750�0001750�00000006652�12604031045�022622� 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=["/", "&", ","]): """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 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, str): 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.5.3/quodlibet/util/string/titlecase.py��������������������������������������������������0000644�0001750�0001750�00000006624�12646426641�022565� 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 # 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, unicode): 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.5.3/quodlibet/util/string/__init__.py���������������������������������������������������0000644�0001750�0001750�00000005706�12607265240�022340� 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 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, str): 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: 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: return (s + " " + _("[Invalid Encoding]")).encode(charset, "replace") def split_escape(string, sep, maxsplit=None, escape_char="\\"): """Like unicode/str.split but allows for the separator to be escaped If passed unicode/str will only return list of unicode/str. Borrowed from Mutagen's mid3v2 """ assert len(sep) == 1 assert len(escape_char) == 1 # don't allow auto decoding of 'string' if isinstance(string, bytes): assert not isinstance(sep, unicode) if maxsplit is None: maxsplit = len(string) empty = type(string)("") result = [] current = empty escaped = False for char in 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 str/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): assert not isinstance(sep, unicode) 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.5.3/quodlibet/util/thumbnails.py��������������������������������������������������������0000644�0001750�0001750�00000011732�12646426641�021444� 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 import quodlibet from quodlibet.util.path import mtime, mkdir, pathname2url, \ xdg_get_cache_home, is_fsnative 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 is_fsnative(path) 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 = "file://" + pathname2url(path) thumb_name = hashlib.md5(uri).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 is_fsnative(path), 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. """ 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, 0700) 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 = "file://" + pathname2url(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", options.keys(), options.values()) try: os.chmod(thumb_path, 0600) except OSError: pass return scale(thumb_pb, boundary) ��������������������������������������quodlibet-3.5.3/quodlibet/util/json_data.py���������������������������������������������������������0000644�0001750�0001750�00000011033�12607265240�021223� 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 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 __cmp__(self, other): return cmp(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 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.5.3/quodlibet/util/clicolor.py����������������������������������������������������������0000644�0001750�0001750�00000012147�12614372203�021072� 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 ctypes import re import sys from ctypes import c_ulong, c_void_p, c_ushort, c_int, byref, c_short 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("(\x1b\[\d\d?m)") def strip_color(text): """Strip ansi escape codes from the passed text""" return _ANSI_ESC_RE.sub("", text) WORD = c_ushort DWORD = c_ulong HANDLE = c_void_p BOOL = c_int SHORT = c_short STD_INPUT_HANDLE = DWORD(-10) STD_OUTPUT_HANDLE = DWORD(-11) STD_ERROR_HANDLE = DWORD(-12) INVALID_HANDLE_VALUE = HANDLE(-1) FG_BLUE = 1 FG_GREEN = 2 FG_RED = 4 FG_INTENSITY = 8 FG_MASK = 0xF 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), ] GetStdHandle = None SetConsoleTextAttribute = None GetConsoleScreenBufferInfo = None def _init_windll(): global GetStdHandle, SetConsoleTextAttribute, GetConsoleScreenBufferInfo # LoadLibrary compared to getattr gets an uncached handle. # Needed to make this modules reloadable, since setting argtypes twice # with different Structure instances breaks ctypes somehow.. k32 = windll.LoadLibrary("Kernel32") GetStdHandle = k32.GetStdHandle GetStdHandle.argtypes = [DWORD] GetStdHandle.restype = HANDLE SetConsoleTextAttribute = k32.SetConsoleTextAttribute SetConsoleTextAttribute.argtypes = [HANDLE, WORD] SetConsoleTextAttribute.restype = BOOL GetConsoleScreenBufferInfo = k32.GetConsoleScreenBufferInfo GetConsoleScreenBufferInfo.argtypes = [ HANDLE, ctypes.POINTER(PCONSOLE_SCREEN_BUFFER_INFO)] GetConsoleScreenBufferInfo.restype = BOOL class WinColor(object): MAGENTA = FG_BLUE | FG_RED | FG_INTENSITY BLUE = FG_BLUE | FG_INTENSITY CYAN = FG_BLUE | FG_GREEN | FG_INTENSITY WHITE = FG_BLUE | FG_GREEN | FG_RED | FG_INTENSITY YELLOW = FG_GREEN | FG_RED | FG_INTENSITY GREEN = FG_GREEN | FG_INTENSITY RED = FG_RED | FG_INTENSITY BLACK = 0 GRAY = FG_INTENSITY def print_color_default(text, output): assert isinstance(text, str) output.write(text) def print_color_win(text, output): """Parses some ansi escape codes and translates them to Windows console API calls. """ assert isinstance(text, str) if output is sys.stdout: h = GetStdHandle(STD_OUTPUT_HANDLE) else: h = GetStdHandle(STD_ERROR_HANDLE) if h == INVALID_HANDLE_VALUE: return # get the default value info = PCONSOLE_SCREEN_BUFFER_INFO() if not GetConsoleScreenBufferInfo(h, byref(info)): return mapping = { Color.NO_COLOR: info.wAttributes & FG_MASK, Color.MAGENTA: WinColor.MAGENTA, Color.BLUE: WinColor.BLUE, Color.CYAN: WinColor.CYAN, Color.WHITE: WinColor.WHITE, Color.YELLOW: WinColor.YELLOW, Color.GREEN: WinColor.GREEN, Color.RED: WinColor.RED, Color.BLACK: WinColor.BLACK, Color.GRAY: WinColor.GRAY, } bg = info.wAttributes & (~FG_MASK) for part in _ANSI_ESC_RE.split(text): if part in mapping: SetConsoleTextAttribute(h, mapping[part] | bg) elif not _ANSI_ESC_RE.match(part): output.write(part) try: from ctypes import windll except ImportError: print_color = print_color_default else: _init_windll() print_color = print_color_win �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/tags.py��������������������������������������������������������������0000644�0001750�0001750�00000022441�12646426641�020233� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007-2008 Joe Wreschnig # 2014 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 """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", "u", _("composer"), _("composers"), _("composition")), 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", "u", _("language")), T("license", "u", _("license")), T("location", "u", _("location")), T("lyricist", "u", _("lyricist")), # 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")), # 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")), ]) def _get_sort_map(tags): """See TAG_TO_SORT""" tts = {} for name, tag in tags.iteritems(): 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 tags.iteritems(): 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 _TAGS.iteritems() 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.5.3/quodlibet/util/__init__.py����������������������������������������������������������0000644�0001750�0001750�00000104777�12646426641�021051� 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 random import re import ctypes import ctypes.util import sys import traceback import unicodedata import threading import subprocess import webbrowser import contextlib # Windows doesn't have fcntl, just don't lock for now try: import fcntl fcntl except ImportError: fcntl = None from quodlibet.compat import reraise as py_reraise, urlparse from quodlibet.util.path import iscommand, is_fsnative from quodlibet.util.string.titlecase import title from quodlibet.const import SUPPORT_EMAIL, COPYRIGHT from quodlibet.util.dprint import print_d, print_ from .misc import environ, argv, cached_func, get_locale_encoding, \ get_fs_encoding from .environment import * # pyflakes environ, argv, cached_func, get_locale_encoding, get_fs_encoding 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": sys.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 = sys.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.") % sys.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=(ValueError, re.error)): """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 err: 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 return time.mktime(time.strptime(datestr, frmt)) 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.""" # TODO: Better i18n of this (eg use O/KO/MO/GO in French) if size >= 1024 ** 3: return "%.1f GB" % (float(size) / (1024 ** 3)) elif size >= 1024 ** 2 * 100: return "%.0f MB" % (float(size) / (1024 ** 2)) elif size >= 1024 ** 2 * 10: return "%.1f MB" % (float(size) / (1024 ** 2)) elif size >= 1024 ** 2: return "%.2f MB" % (float(size) / (1024 ** 2)) elif size >= 1024 * 10: return "%d KB" % int(size / 1024) elif size >= 1024: return "%.2f KB" % (float(size) / 1024) else: return "%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_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. """ 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 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: return (join(s.split()),) 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 isinstance(s, unicode): s = s.decode("utf-8") s = normalize("NFD", s.lower()) return s and _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 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): """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 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, default): return 0 if '~#' in tag[:2] else self.comma(tag) fakesong = Fakesong({'filename': tag('filename', cap)}) fakesong.cap = cap try: p = (esc and XMLFromPattern(pat)) or 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 types = map(type, argv) if not (min(types) == max(types) == str): raise TypeError("executables and arguments must be str objects") print_d("Running %r" % " ".join(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 uri_is_valid(uri): return bool(urlparse(uri)[0]) def make_case_insensitive(filename): return "".join(["[%s%s]" % (c.lower(), c.upper()) for c in filename]) def print_exc(limit=None, file=None): """A wrapper preventing crashes on broken pipes in print_exc.""" if not file: file = sys.stderr print_(traceback.format_exc(limit=limit), output=file) 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 will finally be 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 im_self(self): return self.func.im_self @property def __code__(self): return self.func.__code__ @property def __closure__(self): return self.func.__closure__ 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, "im_self"): obj = handler.im_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 tags.iteritems(): key = key.lower() key = {"location": "website"}.get(key, key) if isinstance(value, unicode): 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, (int, long, float)): if not key.startswith("~#"): key = "~#" + key san[key] = value else: if key.startswith("~#"): key = key[2:] if not isinstance(value, unicode): 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 for version in versions: try: gi.require_version(name, version) except ValueError as e: pass else: return version else: raise e @contextlib.contextmanager def atomic_save(filename, suffix, mode): """Try to replace the content of a file in the safest way possible. * filename+suffix will be created during the process. * On UNIX this operation is atomic, on Windows it is not. with atomic_save("config.cfg", ".tmp", "wb") as f: f.write(data) Can raise. """ assert is_fsnative(filename) temp_filename = filename + suffix fileobj = open(temp_filename, "wb") try: if fcntl is not None: fcntl.flock(fileobj.fileno(), fcntl.LOCK_EX) yield fileobj fileobj.flush() os.fsync(fileobj.fileno()) # No atomic rename on windows if os.name == "nt": fileobj.close() try: os.remove(filename) except EnvironmentError: pass os.rename(temp_filename, filename) finally: if fcntl is not None: fcntl.flock(fileobj.fileno(), fcntl.LOCK_UN) fileobj.close() 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 os.environ: paths = os.environ["DYLD_FALLBACK_LIBRARY_PATH"] paths = paths.split(os.pathsep) if "/usr/lib" not in paths: paths.append("/usr/lib") os.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 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. """ 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 d.iteritems(): if key.upper() == key and isinstance(value, type_): value_instance = new_type(value) setattr(new_type, key, value_instance) map_[value] = key def repr_(self): if self in map_: return "%s.%s" % (type(self).__name__, map_[self]) else: return "%s(%s)" % (type(self).__name__, self) setattr(new_type, "__repr__", repr_) return new_type 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.5.3/quodlibet/util/cover/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020041� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/cover/__init__.py����������������������������������������������������0000644�0001750�0001750�00000000111�12607265240�022131� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from .manager import CoverManager CoverManager �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/cover/built_in.py����������������������������������������������������0000644�0001750�0001750�00000011607�12646426641�022222� 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 import os.path import re from quodlibet.plugins.cover import CoverSourcePlugin from quodlibet.util.path import fsdecode from quodlibet import config class EmbedCover(CoverSourcePlugin): PLUGIN_ID = "embed-cover" PLUGIN_NAME = _("Embed cover") 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_positive_regexes = frozenset( map(lambda s: re.compile(r'(\b|_)' + s + r'(\b|_)'), cover_positive_words)) cover_negative_regexes = frozenset( map(lambda s: re.compile(r'(\b|_|)' + s + r'(\b|_)'), ["back", "inlay", "inset", "inside"])) @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: get_ext = lambda s: os.path.splitext(s)[1].lstrip('.') entries = [] try: entries = os.listdir(base) except EnvironmentError: pass 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 = fsdecode(fn, False).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 keywords = [k.lower().strip() for k in [self.song("artist"), self.song("albumartist"), self.song("album")] if len(k) > 1] score += 2 * sum(map(dec_lfn.__contains__, keywords)) # Generic keywords score += 3 * sum(r.search(dec_lfn) is not None for r in self.cover_positive_regexes) negs = sum(r.search(dec_lfn) is not None for r in self.cover_negative_regexes) score -= 2 * negs #print("[%s - %s]: Album art \"%s\" scores %d (%s neg)." % ( # self("artist"), self("title"), fn, score, negs)) 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 file(path, "rb") except IOError: print_w("Failed reading album art \"%s\"" % path) return None �������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/cover/manager.py�����������������������������������������������������0000644�0001750�0001750�00000016667�12607265240�022033� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # 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 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.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.EmbedCover, 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]), emmited 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}'.format(name)) 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.5.3/quodlibet/util/cover/http.py��������������������������������������������������������0000644�0001750�0001750�00000004155�12501341560�021356� 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 gi.repository import Gio, GLib from quodlibet.util.http import HTTPRequest 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): self.fail(exception.message or ' '.join(exception.args)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/environment.py�������������������������������������������������������0000644�0001750�0001750�00000002064�12646426641�021640� 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 def is_unity(): """If we are running under Ubuntu/Unity""" return os.environ.get("XDG_CURRENT_DESKTOP", "") == "Unity" def is_windows(): """If we are running under Windows or Wine""" return os.name == "nt" 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.5.3/quodlibet/util/copool.py������������������������������������������������������������0000644�0001750�0001750�00000010501�12607265240�020553� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig, Alexandre Passos # 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 """Manage a pool of routines using Python iterators.""" from gi.repository import GLib 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 self.source_func = wrap(func, funcid, args, kwargs).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) print_d("Added copool function %r with id %r" % (func, funcid)) 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] print_d("Removed copool function id %r" % funcid) def remove_all(self): """Stop all running routines.""" for funcid in self.__routines.keys(): self.remove(funcid) def pause(self, funcid): """Temporarily pause a registered routine.""" routine = self._get(funcid) routine.pause() print_d("Paused copool function id %r" % funcid) 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() print_d("Resumed copool function id %r" % funcid) 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.5.3/quodlibet/util/winpipe.py�����������������������������������������������������������0000644�0001750�0001750�00000011000�12646426641�020735� 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 threading import win32pipe import win32file import pywintypes from gi.repository import GLib def write_pipe(pipe_name, data): """Writes the data to the pipe or raises EnvironmentError""" # XXX: otherwise many consecutive open fail, no idea.. pipe_exists(pipe_name) with open(NamedPipeServer._get_filename(pipe_name), "wb") as h: h.write(data) def pipe_exists(pipe_name): """Returns True if the named pipe named 'pipe_name' currently exists""" try: win32pipe.WaitNamedPipe(NamedPipeServer._get_filename(pipe_name), 1) except pywintypes.error: 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 ur'\\.\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): # REJECT doesn't do anything under XP, but XP is gone anyway PIPE_REJECT_REMOTE_CLIENTS = 0x00000008 FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000 buffer_ = 4096 timeout_ms = 50 try: handle = win32pipe.CreateNamedPipe( self._filename, win32pipe.PIPE_ACCESS_INBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE, (win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_READMODE_BYTE | win32pipe.PIPE_WAIT | PIPE_REJECT_REMOTE_CLIENTS), win32pipe.PIPE_UNLIMITED_INSTANCES, buffer_, buffer_, timeout_ms, None) except pywintypes.error: # due to FILE_FLAG_FIRST_PIPE_INSTANCE and not the first instance self._stopped = True self._event.set() return if handle == win32file.INVALID_HANDLE_VALUE: self._stopped = True self._event.set() return self._event.set() while 1: data = bytearray() try: win32pipe.ConnectNamedPipe(handle) while 1: try: code, message = win32file.ReadFile( handle, buffer_, None) except pywintypes.error: break data += message win32pipe.DisconnectNamedPipe(handle) except pywintypes.error: # better not loop forever.. break finally: if self._stopped: break if data: self._process(bytes(data)) try: win32file.CloseHandle(handle) except pywintypes.error: pass 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("stop!") except EnvironmentError: pass self._callback = None self.join() quodlibet-3.5.3/quodlibet/util/windows.py�����������������������������������������������������������0000644�0001750�0001750�00000015217�12607265240�020763� 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 import os import sys import collections import ctypes if os.name == "nt": from win32com.shell import shellcon, shell import pywintypes import pythoncom SHGFP_TYPE_CURRENT = 0 SHGFP_TYPE_DEFAULT = 1 CSIDL_FLAG_CREATE = 0x8000 CSIDL_FLAG_DONT_UNEXPAND = 0x2000 def _get_path(folder, default=False, create=False): """A path to an directory or None""" if default: flags = SHGFP_TYPE_DEFAULT else: flags = SHGFP_TYPE_CURRENT if create: folder |= CSIDL_FLAG_CREATE # we don't want env vars folder |= CSIDL_FLAG_DONT_UNEXPAND try: # returns either unicode or ascii str, depending on the env path = shell.SHGetFolderPath(0, folder, 0, flags) except pywintypes.com_error: return if not isinstance(path, unicode): path = path.decode("ascii") return path def get_personal_dir(**kwargs): return _get_path(shellcon.CSIDL_PERSONAL, **kwargs) def get_appdate_dir(**kwargs): return _get_path(shellcon.CSIDL_APPDATA, **kwargs) def get_desktop_dir(**kwargs): return _get_path(shellcon.CSIDL_DESKTOP, **kwargs) def get_music_dir(**kwargs): return _get_path(shellcon.CSIDL_MYMUSIC, **kwargs) def get_profile_dir(**kwargs): return _get_path(shellcon.CSIDL_PROFILE, **kwargs) def get_link_target(path): """Takes a path to a .lnk file and returns a path the .lnk file is targeting or None. """ link = pythoncom.CoCreateInstance( shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) try: link.QueryInterface(pythoncom.IID_IPersistFile).Load(path) # FIXME: this only supports the old non-unicode API.. path = link.GetPath(0)[0] return path.decode("latin-1") except pywintypes.com_error: pass def get_links_dir(): """Get the path to the Links directory (%USERPROFILE%\\Links) or None""" try: kfm = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager) except pywintypes.com_error: # WinXP for example return try: libs_folder = kfm.GetFolder(shell.FOLDERID_Links) # returns unicode return libs_folder.GetPath() except pywintypes.com_error: pass if os.name == "nt": 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 class WindowsEnvironError(Exception): pass def _set_windows_env_var(key, value): """Set an env var. Can raise WindowsEnvironError """ if not isinstance(key, unicode): raise TypeError if not isinstance(value, unicode): raise TypeError status = SetEnvironmentVariableW(key, value) if status == 0: raise WindowsEnvironError def _del_windows_env_var(key): """Delete an env var. Can raise WindowsEnvironError """ if not isinstance(key, unicode): raise TypeError status = SetEnvironmentVariableW(key, None) if status == 0: raise WindowsEnvironError def _get_windows_environ(): """Returns a unicode dict of the Windows environment. Can raise WindowsEnvironError """ res = GetEnvironmentStringsW() if not res: raise WindowsEnvironError 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 dict_[key] = value status = FreeEnvironmentStringsW(res) if status == 0: raise WindowsEnvironError return dict_ class WindowsEnviron(collections.MutableMapping): """os.environ that supports unicode on Windows. Keys can either be ascii bytes or unicode Like os.environ it will only contain the environment content present at load time. Changes will be synced with the real environment. """ def __init__(self): try: env = _get_windows_environ() except WindowsEnvironError: env = {} self._env = env def __getitem__(self, key): if isinstance(key, bytes): key = key.decode("ascii") return self._env[key] def __setitem__(self, key, value): if isinstance(key, bytes): key = key.decode("ascii") try: _set_windows_env_var(key, value) except WindowsEnvironError: pass self._env[key] = value def __delitem__(self, key): if isinstance(key, bytes): key = key.decode("ascii") try: _del_windows_env_var(key) except WindowsEnvironError: 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 get_win32_unicode_argv(): """Returns a unicode version of sys.argv""" from ctypes import cdll, windll, wintypes 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 argc = ctypes.c_int() argv = CommandLineToArgvW(GetCommandLineW(), ctypes.byref(argc)) if not argv: return [] res = argv[max(0, argc.value - len(sys.argv)):argc.value] LocalFree(argv) return res ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/fmps.py��������������������������������������������������������������0000644�0001750�0001750�00000032451�12646426641�020244� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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. # Free Media Player Specifications 1.1 by Jeff Mitchell # http://freedesktop.org/wiki/Specifications/free-media-player-specs FMPS_NOTHING = u"FMPS_NOTHING" LIST_SEPERATOR = u";;" ENTRY_SEPERATOR = u"::" def _split_left(val, sep): """Split a string by a delimiter which can be escaped by \\""" result = [] temp = u"" escaped = False index = 0 left = True for c in val: left = False temp += c if c == sep[index] and not escaped: index += 1 else: index = 0 if c == u"\\": escaped ^= True else: escaped = False if index >= len(sep): left = True index = 0 result.append(temp[:-len(sep)]) temp = u"" if temp or left: result.append(temp) return result def _split(val, sep): """Split and filter invalid segments. Entries seperated by ::: for example need to be set invalid because they could be split in two ways. """ invalid = [] inval = [] valid = [] vals = _split_left(val, sep) c = False # Look if a segment starts with :/; # and mark it and the next one as invalid (except the last one) for i, v in enumerate(vals[-1::-1]): new_c = v.startswith(sep[0]) excp = i == len(vals) - 1 if c or (new_c and not excp): inval.insert(0, v) else: if inval: invalid.insert(0, sep.join(inval)) inval = [] valid.insert(0, v) c = new_c if inval: invalid.insert(0, sep.join(inval)) return invalid, valid def _unescape(val): return val.replace( ur"\;", u";").replace(ur"\:", u":").replace(ur"\\", u"\\") def _escape(val): return val.replace( u"\\", ur"\\").replace(u";", ur"\;").replace(u":", ur"\:") def _escape_inval(val): if val.startswith(";"): return u"\\" + val return val class FmpsValue(object): _data = None def __repr__(self): return "%s(%s)" % (self.__class__.__name__, repr(self._data)) def native(self): return self._data def __unicode__(self): return unicode(self._data) def __str__(self): return str(self._data) class FmpsFloat(FmpsValue): def __init__(self, data): if not isinstance(data, basestring): self._validate(data) self._data = unicode(round(float(data), 6)) else: data = unicode(data) self._validate(data) self._data = data def _validate(self, data): return float(data) def native(self): return float(self._data) class FmpsPositiveFloat(FmpsFloat): def _validate(self, data): num = super(FmpsPositiveFloat, self)._validate(data) if num < 0 or (not isinstance(data, basestring) and num > 4294967294.999999): raise ValueError("Value not in range.") return num class FmpsRatingFloat(FmpsFloat): def _validate(self, data): num = super(FmpsRatingFloat, self)._validate(data) if not 0 <= num <= 1: raise ValueError("Value not in range.") return num class FmpsPositiveIntegerFloat(FmpsPositiveFloat): def _validate(self, data): num = super(FmpsPositiveIntegerFloat, self)._validate(data) if int(num) != num: raise ValueError("Value not an integer.") return num def native(self): return int(super(FmpsPositiveIntegerFloat, self).native()) class FmpsText(FmpsValue): def __init__(self, data): self._data = unicode(data) class FmpsInvalidValue(FmpsText): pass class FmpsDict(object): _kind = None def __init__(self, data=None): self.__dict = {} self.__invalid = [] if data: self.__load(data) def __load(self, data): if not isinstance(data, (list, tuple)): data = [data] data = map(unicode, data) vals = [] for seg in data: i, v = _split(seg, LIST_SEPERATOR) vals.extend(v) self.__invalid.extend(map(_escape_inval, i)) for val in vals: inval, fields = _split(val, ENTRY_SEPERATOR) if len(fields) != 2 or inval: self.__invalid.append(_escape_inval(val)) continue key, value = map(_unescape, fields) try: value = self._kind(value) except ValueError: value = FmpsInvalidValue(value) if key in self.__dict: self.__dict[key].append(value) else: self.__dict[key] = [value] def iterkeys(self): return self.__dict.iterkeys() keys = lambda self: list(self.iterkeys()) def iteritems(self): for key, values in self.__dict.iteritems(): for value in values: if not isinstance(value, FmpsInvalidValue): yield(key, value.native()) items = lambda s: list(s.iteritems()) def get_all(self, key): if key in self.__dict: return [f.native() for f in self.__dict[key] if not isinstance(f, FmpsInvalidValue)] return [] def remove_all(self, key): if key in self.__dict: del self.__dict[key] def set_all(self, key, value): key = unicode(key) if not isinstance(value, (list, tuple)): value = [value] value = map(self._kind, value) self.remove_all(key) if key in self.__dict: self.__dict[key].extend(value) else: self.__dict[key] = value def append(self, key, value): self.extend(key, [value]) def extend(self, key, values): key = unicode(key) values = map(self._kind, values) if key in self.__dict: self.__dict[key].extend(values) else: self.__dict[key] = values def to_data(self): fields = [] for key, values in self.__dict.iteritems(): values = map(_escape, map(unicode, values)) key = _escape(key) for val in values: fields.append(ENTRY_SEPERATOR.join([key, val])) return LIST_SEPERATOR.join(fields + filter(None, self.__invalid)) def __repr__(self): return "%s(%s, invalid=%s)" % ( self.__class__.__name__, repr(self.__dict), repr(self.__invalid)) class FmpsNamespaceDict(object): _kind = None def __init__(self, data=None): self.__dict = {} self.__invalid = [] if data: self.__load(data) def __load(self, data): if not isinstance(data, (list, tuple)): data = [data] data = map(unicode, data) vals = [] for seg in data: i, v = _split(seg, LIST_SEPERATOR) vals.extend(v) self.__invalid.extend(map(_escape_inval, i)) for val in vals: inval, fields = _split(val, ENTRY_SEPERATOR) if len(fields) != 3 or inval: self.__invalid.append(_escape_inval(val)) continue namespace, key, value = fields if not namespace or not key: self.__invalid.append(val) continue namespace, key, value = map(_unescape, (namespace, key, value)) try: value = self._kind(value) except ValueError: value = FmpsInvalidValue(value) if namespace in self.__dict: if key in self.__dict[namespace]: self.__dict[namespace][key].append(value) else: self.__dict[namespace][key] = [value] else: self.__dict[namespace] = {key: [value]} def get_all(self, namespace, key=None): """Will return a list of values if key is given, else a dict""" if namespace in self.__dict: if key is not None: if key in self.__dict[namespace]: return [f.native() for f in self.__dict[namespace][key] if not isinstance(f, FmpsInvalidValue)] else: return [] else: new_dict = {} for key, values in self.__dict[namespace].iteritems(): new_dict[key] = [f.native() for f in values if not isinstance(f, FmpsInvalidValue)] return new_dict else: if key is not None: return [] return {} def remove_all(self, namespace, key=None): if namespace in self.__dict: if key is not None: if key in self.__dict[namespace]: del self.__dict[namespace][key] if not self.__dict[namespace]: del self.__dict[namespace] else: del self.__dict[namespace] def set_all(self, namespace, key, value): """value can be a list or a singe value, or a dict in case key is None""" if not namespace or (key is not None and not key): raise ValueError("No empty namespace/key allowed.") if key is None and not isinstance(value, dict): raise ValueError("You have to pass a dict in case key is None.") if key is not None and isinstance(value, dict): raise ValueError("You can only pass a dict in case key is None.") namespace = unicode(namespace) key = key is not None and unicode(key) if isinstance(value, dict): value = dict(value) for key in value.iterkeys(): if not isinstance(value[key], (list, tuple)): value[key] = [value[key]] value[key] = map(self._kind, value[key]) self.__dict[namespace] = dict(value) return if not isinstance(value, (list, tuple)): value = [value] value = map(self._kind, value) if namespace in self.__dict: if key in self.__dict[namespace]: self.__dict[namespace][key] = value else: self.__dict[namespace] = {key: value} def append(self, namespace, key, value): self.extend(namespace, key, [value]) def extend(self, namespace, key, values): if not namespace or not key: raise ValueError("No empty namespace/key allowed.") namespace = unicode(namespace) key = unicode(key) values = map(self._kind, values) if namespace in self.__dict: if key in self.__dict[namespace]: self.__dict[namespace][key].extend(values) else: self.__dict[namespace][key] = values else: self.__dict[namespace] = {key: values} def iterkeys(self): return self.__dict.iterkeys() keys = lambda self: list(self.iterkeys()) def iteritems(self): for namespace, sub in self.__dict.iteritems(): for key, values in sub.iteritems(): for val in values: yield (namespace, key, val.native()) items = lambda self: list(self.iteritems()) def to_data(self): fields = [] for namespace, sub in self.__dict.iteritems(): namespace = _escape(namespace) for key, values in sub.iteritems(): key = _escape(key) values = map(_escape, map(unicode, values)) for val in values: fields.append(ENTRY_SEPERATOR.join([namespace, key, val])) return LIST_SEPERATOR.join(fields + filter(None, self.__invalid)) def __repr__(self): return "%s(%s, invalid=%s)" % ( self.__class__.__name__, repr(self.__dict), repr(self.__invalid)) class FmpsNoEmptyKeyDict(FmpsDict): def set_all(self, key, values): if not key: raise ValueError("No empty key allowed.") super(FmpsNoEmptyKeyDict, self).set_all(key, values) def extend(self, key, values): if not key: raise ValueError("No empty key allowed.") super(FmpsNoEmptyKeyDict, self).extend(key, values) #All simple Formats class Rating(FmpsRatingFloat): pass class Playcount(FmpsPositiveIntegerFloat): pass class Lyrics(FmpsText): pass #All Dicts class RatingUser(FmpsNoEmptyKeyDict): _kind = FmpsRatingFloat class PlaycountUser(FmpsNoEmptyKeyDict): _kind = FmpsPositiveIntegerFloat class Performers(FmpsDict): _kind = FmpsText class LyricsSources(FmpsDict): _kind = FmpsText #All NamespaceDicts class RatingCritic(FmpsNamespaceDict): _kind = FmpsRatingFloat class RatingAlgorithm(FmpsNamespaceDict): _kind = FmpsRatingFloat class PlaycountAlgorithm(FmpsNamespaceDict): _kind = FmpsPositiveFloat # AlbumsCompilations needs checks for unique # Application(case sensitive)+Type(case insensitive)+Identifier(case sensitive) # and should check if the keys are album/compilation only... # but I don't care atm so that's left to the user. class AlbumsCompilations(FmpsNamespaceDict): _kind = FmpsText �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/dbusutils.py���������������������������������������������������������0000644�0001750�0001750�00000025315�12607265240�021307� 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 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, str): 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) """ 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('<?xml version="1.0"?><props>' + spec + '</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 wl and bl: raise ValueError if not wl and not bl: return spec root = ET.fromstring('<?xml version="1.0"?><props>' + spec + '</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 "\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: if isinstance(value, unicode): value = value.encode("utf-8") return dbus.UTF8String(value) else: if isinstance(value, str): 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 self.__ispec.iteritems(): parts.append("<interface name=\"%s\">" % iface) parts.extend(intros) parts.append("</interface>") parts.append("</node>") return "\n".join(parts) 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 combos.iteritems(): 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.5.3/quodlibet/util/modulescanner.py�����������������������������������������������������0000644�0001750�0001750�00000010723�12646426641�022134� 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 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 self.deps.iteritems(): 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 self.__modules.items(): # 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 info.iteritems(): 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, 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.5.3/quodlibet/util/uri.py���������������������������������������������������������������0000644�0001750�0001750�00000010020�12646426641�020062� 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 # TODO: # * netloc separation (user/passwd/host/port using urllib) # * Coerce a URI to Unicode (via an encoding for the path and # Punycode for the domain) and back. import os from urllib import url2pathname, quote_plus, unquote_plus from urlparse import urlparse, urlunparse from quodlibet.util.path import fsdecode, pathname2url def _urlunparse(parts): # urlunparse doesn't like paths starting with // and will remove them. # we need them for UNC paths on Windows # e.g. we want "//foo/bar" -> urlparse -> urlunparse -> "//foo/bar" parts = list(parts) if parts[2].startswith("//") and not parts[1]: parts[2] = "//" + parts[2] return urlunparse(parts) class URI(str): """A full URI string. This object provides several convenience attributes to access data from the urlparse and urllib modules. URIs inherit from str, and so any method that works on a str works on a URI. URIs are not closed under concatenation, slicing, and so on. Neither are these URI objects; such operations will return strs.""" def __new__(klass, value, escaped=True): """Create a new URI object. By default, the URI is assumed to be escaped already. Pass escaped=False if you need the URI escaped (this is imperfect now). The URI returned will be equivalent, but not necessarily equal, to the value passed in.""" values = list(urlparse(value)) if not escaped: # FIXME: Handle netloc # FIXME: Handle query args values[2] = quote_plus(values[2], safe="/~") value = _urlunparse(values) obj = str.__new__(klass, value) # len() > 1 to not interpret windows paths as URIs # there are no schemes if not obj.scheme or not len(obj.scheme) > 1: raise ValueError("URIs must have a scheme, such as 'http://'") elif not (obj.netloc or obj.path): raise ValueError("URIs must have a network location or path") else: return obj @classmethod def frompath(klass, value): """Construct a URI from an unescaped filename.""" return klass("file://" + pathname2url(value), escaped=True) @property def scheme(self): """URI scheme (e.g. 'http')""" return urlparse(self)[0] @property def netloc(self): """URI network location (e.g. 'example.com:21')""" return urlparse(self)[1] @property def path(self): """URI path (e.g. '/~user')""" return urlparse(self)[2] @property def params(self): """URI parameters""" return urlparse(self)[3] @property def query(self): """URI query string (e.g. 'foo=bar&a=b')""" return urlparse(self)[4] @property def fragment(self): """URI fragment ('foo' in '#foo')""" return urlparse(self)[5] @property def unescaped(self): """an unescaped str (not URI) version of the URI""" values = list(urlparse(self)) values[2] = unquote_plus(values[2]) return _urlunparse(values) @property def filename(self): """a local filename equivalent to the URI""" if self.scheme != "file": raise ValueError("only the file scheme supports filenames") elif self.netloc: raise ValueError("only local files have filenames") else: if os.name == "nt": return fsdecode(url2pathname(self.path)) else: return url2pathname(self.path) @property def is_filename(self): """True if the URI is a valid (not necessarily existing) local filename """ return self.scheme == "file" and not self.netloc def __repr__(self): return "<%s %r>" % (type(self).__name__, self.unescaped) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/http.py��������������������������������������������������������������0000644�0001750�0001750�00000023341�12607265240�020245� 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 import json from gi.repository import Soup, Gio, GLib, GObject 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 PARAM_READWRITECONSTRUCT = GObject.ParamFlags.CONSTRUCT_ONLY | \ GObject.ParamFlags.READABLE | GObject.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': (GObject.SignalFlags.RUN_LAST, None, (Soup.Message,)), 'received': (GObject.SignalFlags.RUN_LAST, None, (Gio.OutputStream,)), # Failures 'send-failure': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'receive-failure': (GObject.SignalFlags.RUN_LAST, None, (object,)), # Common failure signal which will be emited when either of above # failure signals are. 'failure': (GObject.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 request to {0}'.format(self._uri)) session.send_async(self.message, self.cancellable, self._sent, None) def _sent(self, session, task, data): try: self.istream = session.send_finish(task) print_d('Sent request to {0}'.format(self._uri)) self.emit('sent', self.message) except GLib.GError as e: print_w('Failed sending request to {0}'.format(self._uri)) 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 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.5.3/quodlibet/util/tagsfrompath.py������������������������������������������������������0000644�0001750�0001750�00000005436�12604031045�021761� 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 quodlibet.util.path import fsdecode, is_fsnative 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].encode("ascii", "replace")) 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 is_fsnative(path) 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 = fsdecode(matchon, note=False) match = self.pattern.search(matchon) # dicts for all! if match is None: return {} else: return match.groupdict() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/dprint.py������������������������������������������������������������0000644�0001750�0001750�00000011251�12646426641�020572� 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 sys import time import os import quodlibet.const import quodlibet.util.logging from quodlibet.util.clicolor import Colorise from quodlibet.util import clicolor from .misc import get_locale_encoding from .environment import is_py2exe, is_py2exe_console _ENCODING = get_locale_encoding() def _format_print(string, prefix=""): """Inserts the given prefix at the beginning of each line""" if prefix: string = prefix + ("\n" + prefix).join(string.splitlines()) return string def extract_caller_info(): """Returns a string describing the caller of the caller of this function. It currently checks if the caller got arguments that have an attribute with the same name as the caller (so it's probably the class of a method) or returns the module name for everything else. """ try: raise ZeroDivisionError except: try: info = "" # The frame of the calling function frame = sys.exc_info()[2].tb_frame.f_back.f_back 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]] # the arg has an attr that is named like the function if hasattr(cls, co_name): # If it's an instance get the class if not hasattr(cls, '__name__'): cls = cls.__class__ 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 except (AttributeError, IndexError): return "" else: return info def _print(string, output, frm="utf-8", strip_color=True, end=os.linesep): if is_py2exe() and not is_py2exe_console(): return can_have_color = True if strip_color and not output.isatty(): string = clicolor.strip_color(string) can_have_color = False if isinstance(string, unicode): string = string.encode(_ENCODING, "replace") else: string = string.decode(frm).encode(_ENCODING, "replace") try: if can_have_color: clicolor.print_color(string, output) else: output.write(string) output.write(end) except IOError: pass def print_(string, output=None, end=os.linesep): if output is None: output = sys.stdout _print(string, output, end=end) def print_d(string, context=""): """Print debugging information.""" if quodlibet.const.DEBUG: output = sys.stderr else: output = None context = extract_caller_info() # strip the package name if context.startswith("quodlibet.") and context.count(".") > 1: context = context[10:] timestr = ("%0.2f" % time.time())[-6:] # Translators: "D" as in "Debug". It is prepended to # terminal output. APT uses a similar output format. prefix = _("D:") + " " string = "%s: %s: %s" % (Colorise.magenta(timestr), Colorise.blue(context), string) string = _format_print(string, Colorise.green(prefix)) if output is not None: _print(string, output) # Translators: Name of the debug tab in the Output Log window quodlibet.util.logging.log(clicolor.strip_color(string), "debug") def print_w(string): """Print warnings.""" # Translators: "W" as in "Warning". It is prepended to # terminal output. APT uses a similar output format. prefix = _("W:") + " " string = _format_print(string, Colorise.red(prefix)) _print(string, sys.stderr) # Translators: Name of the warnings tab in the Output Log window quodlibet.util.logging.log(clicolor.strip_color(string), "warnings") def print_e(string, context=None): """Print errors.""" # Translators: "E" as in "Error". It is prepended to # terminal output. APT uses a similar output format. prefix = _("E:") + " " string = _format_print(string, Colorise.red(prefix)) _print(string, sys.stderr) # Translators: Name of the warnings tab in the Output Log window quodlibet.util.logging.log(clicolor.strip_color(string), "errors") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/util/collection.py��������������������������������������������������������0000644�0001750�0001750�00000045251�12646426641�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-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 __future__ import absolute_import import os import random from quodlibet import util from quodlibet import config from quodlibet.formats._audio import TAG_TO_SORT, INTERN_NUM_DEFAULT from quodlibet.formats._audio import PEOPLE as _PEOPLE from collections import Iterable from quodlibet.util.path import escape_filename, unescape_filename from quodlibet.util.path import bytes2fsnative, is_fsnative, fsnative2bytes 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, basestring): 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, basestring) and x or str(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, (int, float, long)) 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 INTERN_NUM_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 key == "cover": return ((self.cover != type(self).cover) and "y") or None 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 = map(lambda x: x[0], sorted(result.items(), key=lambda x: x[1])) 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.""" COVER_SIZE = 48 cover = None scanned = False @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 scan_cover(self, force=False, scale_factor=1, callback=None, cancel=None): if (self.scanned and not force) or not self.songs: return self.scanned = True def set_cover_cb(pixbuf): self.cover = pixbuf callback() from quodlibet import app s = self.COVER_SIZE * scale_factor if callback is not None: app.cover_manager.get_pixbuf_many_async( self.songs, s, s, cancel, set_cover_cb) else: self.cover = app.cover_manager.get_pixbuf_many(self.songs, s, s) def __repr__(self): return "Album(%s)" % repr(self.key) class Playlist(Collection, Iterable): """A Playlist is a `Collection` that has list-like features Songs can appear more than once. TODO: Fix this crap """ __instances = [] quote = staticmethod(escape_filename) unquote = staticmethod(unescape_filename) @classmethod def new(cls, dir_, base=_("New Playlist"), library=None): assert is_fsnative(dir_) if not (dir_ and os.path.realpath(dir_)): raise ValueError("Invalid playlist directory %r" % (dir_,)) p = Playlist(dir_, "", library) i = 0 try: p.rename(base) except ValueError: while not p.name: i += 1 try: p.rename("%s %d" % (base, i)) except ValueError: pass return p @classmethod def fromsongs(cls, dir_, songs, library=None): assert is_fsnative(dir_) 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}) playlist = cls.new(dir_, title, library) playlist.extend(songs) return playlist @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 # List-like methods, for compatibilty with original Playlist class. def extend(self, songs): self._list.extend(songs) self.finalize() def append(self, song): ret = self._list.append(song) self.finalize() return ret def clear(self): 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, basestring)] def __init__(self, dir, name, library=None): super(Playlist, self).__init__() self.__instances.append(self) if isinstance(name, unicode) and os.name != "nt": name = name.encode('utf-8') self.name = name self.dir = dir self.library = library self._list = HashedList() try: with open(self.filename, "rb") as h: for line in h: assert library is not None try: line = bytes2fsnative(line.rstrip()) 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: self.write() @property def filename(self): basename = self.quote(self.name) return os.path.join(self.dir, basename) def rename(self, newname): if isinstance(newname, unicode): newname = newname.encode('utf-8') if newname == self.name: return elif os.path.exists(os.path.join(self.dir, self.quote(newname))): raise ValueError( _("A playlist named %s already exists.") % newname) else: try: os.unlink(self.filename) except EnvironmentError: pass self.name = newname self.write() def add_songs(self, filenames, library): changed = False for i in range(len(self)): if isinstance(self[i], basestring) and self._list[i] in filenames: self._list[i] = library[self._list[i]] changed = True return 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 """ 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) if leave_dupes: changed = True break else: changed = True if changed: self.finalize() return changed 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() try: os.unlink(self.filename) except EnvironmentError: pass if self in self.__instances: self.__instances.remove(self) def write(self): with open(self.filename, "wb") as f: for song in self._list: if isinstance(song, basestring): f.write(fsnative2bytes(song) + "\n") else: f.write(fsnative2bytes(song("~filename")) + "\n") def format(self): """Return a markup representation of information for this playlist""" total_size = float(self.get("~#filesize") or 0.0) songs_text = (ngettext("%d song", "%d songs", len(self.songs)) % len(self.songs)) # see Issue 504 return "<b>%s</b>\n<small>%s (%s%s)</small>" % ( util.escape(self.name), songs_text, self.get("~length", "0:00"), " / %s" % util.format_size(total_size) if total_size > 0 else "") @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 __cmp__(self, other): try: return cmp(self.name, other.name) except AttributeError: return -1 def __str__(self): songs_text = (ngettext("%d song", "%d songs", len(self.songs)) % len(self.songs)) return "\"%s\" (%s)" % (self.name, songs_text) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/commands.py���������������������������������������������������������������0000644�0001750�0001750�00000026566�12646426641�020135� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna, # 2011-2013 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 cStringIO import StringIO from quodlibet import browsers from quodlibet import util from quodlibet.util.uri import URI from quodlibet.util.path import fsnative 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""" 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. """ # only one arg supported atm parts = line.split(" ", 1) command = parts[0] args = parts[1:] print_d("command: %s(*%r)" % (command, args)) try: return self.run(app, command, *args) except CommandError as e: print_e(str(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 %r " % (cmd, args)) try: return cmd(app, *args) except CommandError as e: raise CommandError("%s: %s" % (name, str(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("order", args=1) def _order(app, value): order = app.window.order if value in ["t", "toggle"]: order.set_shuffle(not order.get_shuffle()) return try: order.set_active_by_name(value.lower()) except ValueError: try: order.set_active_by_index(int(value)) except (ValueError, IndexError): pass @registry.register("repeat", args=1) def _repeat(app, value): repeat = app.window.repeat if value in ["0", "off"]: repeat.set_active(False) elif value in ["1", "on"]: repeat.set_active(True) elif value in ["t", "toggle"]: repeat.set_active(not repeat.get_active()) @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): filename = os.path.realpath(value) song = app.library.add_filename(filename, add=False) if song: if app.player.go_to(song): app.player.paused = False @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 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): f = StringIO() for i, b in enumerate(browsers.browsers): if not b.is_empty: f.write("%d. %s\n" % (i, browsers.name(b))) return f.getvalue() @registry.register("set-browser", args=1) def _set_browser(app, value): try: browsers.get(value) except ValueError: raise CommandError("Unknown browser %r" % value) app.window.select_browser(None, value, app.library, app.player) @registry.register("open-browser", args=1) def _open_browser(app, 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): if app.browser.can_filter(tag): app.browser.filter_random(tag) @registry.register("filter", args=1) def _filter(app, value): try: tag, values = value.split('=', 1) values = [v.decode("utf-8", "replace") for v in values.split("\x00")] except ValueError: raise CommandError("invalid argument") if app.browser.can_filter(tag) and values: app.browser.filter(tag, values) @registry.register("query", args=1) def _query(app, value): if app.browser.can_filter_text(): app.browser.filter_text(value.decode("utf-8", "replace")) @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: if value in library: songs = [library[value]] else: songs = library.query(value) else: songs = [player.song] songs = filter(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(value) songs.sort() playlist.enqueue(songs) @registry.register("enqueue-files", args=1) def _enqueue_files(app, value): """Enqueues comma-separated filenames or song names.""" library = app.library window = app.window songs = [] for param in value.split(","): try: song_path = URI(param).filename 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(value) playlist.unqueue(songs) @registry.register("quit") def _quit(app): app.quit() @registry.register("status") def _status(app): player = app.player window = app.window f = StringIO() if player.paused: strings = ["paused"] else: strings = ["playing"] strings.append(type(app.browser).__name__) strings.append("%0.3f" % player.volume) strings.append(window.order.get_active_name()) strings.append((window.repeat.get_active() and "on") or "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) f.write(" ".join(strings) + "\n") try: f.write(app.browser.status + "\n") except AttributeError: pass return f.getvalue() @registry.register("song-list", args=1) def _song_list(app, value): window = app.window if value.startswith("t"): value = not window.song_scroller.get_property('visible') else: value = value not in ['0', 'off', 'false'] window.song_scroller.set_property('visible', value) @registry.register("queue", args=1) def _queue(app, value): window = app.window 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 f = StringIO() for song in window.playlist.pl.get(): f.write(song("~uri") + "\n") return f.getvalue() @registry.register("dump-queue") def _dump_queue(app): window = app.window f = StringIO() for song in window.playlist.q.get(): f.write(song("~uri") + "\n") return f.getvalue() @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 """ 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 app.browser.get_filter_text() + "\n" @registry.register("print-playing", optional=1) def _print_playing(app, fstring="<artist~album~tracknumber~title>"): from quodlibet.formats import AudioFile from quodlibet.pattern import Pattern song = app.player.info if song is None: song = AudioFile({"~filename": fsnative(u"/")}) song.sanitize() return Pattern(fstring).format(song) + "\n" ������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/cli.py��������������������������������������������������������������������0000644�0001750�0001750�00000021063�12607265240�017057� 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 import sys 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="") exit_(notify_startup=True) def process_arguments(argv): from quodlibet.util.uri import URI 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", "order", "repeat", "query", "volume", "filter", "set-rating", "set-browser", "open-browser", "random", "song-list", "queue"] 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")) 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")), ("order", _("Set or toggle the playback order"), "[order]|toggle"), ("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"), ("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"), "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 = { "order": ["0", "1", "t", "toggle", "inorder", "shuffle", "weighted", "onesong"].__contains__, "repeat": ["0", "1", "t", "on", "off", "toggle"].__contains__, "volume": is_vol, "seek": is_time, "set-rating": is_float, } 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.") % sys.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 = URI(arg).filename except ValueError: filename = arg queue(command, filename) elif command == "enqueue-files": queue(command, arg) elif command == "play-file": try: filename = URI(arg).filename except ValueError: 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 == "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.5.3/quodlibet/images/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017213� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/�����������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020652� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/64x64/�����������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�021445� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/64x64/status/����������������������������������������������0000755�0001750�0001750�00000000000�12646427760�022770� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/64x64/status/quodlibet-missing-cover.png�������������������0000644�0001750�0001750�00000013760�12501341560�030237� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���@���@���iq���sBIT|d��� pHYs��t��tfx���tEXtSoftware�www.inkscape.org<���tEXtTitle�Missing Album Cover Art{��DIDATxy$y{UtťZR*fC/[I9%qYNDzs86c $@0# #$8H]NOu只홝YБBWWMWՈf~o~'njϭmlz|?ԙ51;ٜ~?L={ A& z_ۥ^Q̛.p_:7k:ܼ MMo\siAڏwhSD6 8FQܱ low�0`k,Gn96Ќ15Pwvluz,>9*Ja" 1AS82kZ`>�}'C?tda q2{MY]Yc}}hf0Z8rxvkfI1CV' C0$s8Ȳ4Mz]Z\{OY,a`o|0fqeP7k�oI*Kˬ,pؑ4M,!MSdDAHZ5ĉ8ճ v:ciϴi1??ϭJբRL�*yeqƥK];z]./- uyVC-1ӧOov �dS x֒$ RTi48$iB%amL Vw4)k &a1 Z o뱲7M8};o^8Ǚ8<P�G}Y�\5k-(FKab{1iZjEL& G �h,L/ "0*:{<ZK}{~x"?<v\^^ D (&ߵk~y@&8_3!൰$Ms`WT*U Uk P8< tP֨U43 DU%2 ;ӼT*_˯:'ST��6v WݴnHpP+fNLd٨EzzNf&bV�CF>A1 TUǕ6^olh43>pIկn/qiiik(4`�9�$Is<ȭ-fG APשT*qhTDqHj4M1ø`g8CU1bhX UW.ИݚjsQ|I򕯠ҟ +[z((ܣTM0H4K'o-T3 FJJBĤi+Uy:>4ڴgM=;;Fsxmpi?pa_xMNz 3<9Ul�6�$40r!"TJJZ!M3Dбg[j@1l٦?Oh2l28ΓvV_aWHF}M�Yuοk"Bw8W V""T2q%LvC晛;<ass^waG+ AD8<qy7 z׵ti0c5̐;OZA"sG*k!HE�Rׂjip0"I>ck50dcs%�&5 �$! RH;yPE$I:y`CEXkW1<i z XВ~ϕMcgK 7̋I\q(N7PS7pOTf:Y*~?1=hD$xA)ݤjBۥg9;eMx{e*g}? =@EyK‹aLXh51 0F3l)*F@ՠ5c�#BYgY܌ a{4=q2,=hLTz5iH!ITLSN1??s8 \b0Fq{* #dr{ea~.IP0qAZK$!4EP)νj87a4qY677 KdkWXZ^ӧ9}#x_ZKFZd -vNQ͋KUh 眦7 #; cPh)KE0Vq//sαD<JV#T$%s.]Dĉ ^uߵ(rKqg T J  4EmT8c � k3w֖ǻ,K&M3*0VgskqRv~(LNPK:_8c}FFap]�Y ]Se_'"dYNdADA`qa!EK8Q-x$mG,˰` yP+|qR�@_ιkk jUj*qRdWrfEZ�F ki +xX?R])�叺%!w~˯Rrf[M4CT)i($eĉhic ޗῄ@{8uT'B+ alF9(s)e+[M{ݕv۩2__!N$Zww<wbnq "cOTd:֢ힻe02( !Xu]GWwBQrF]H+Wԝ1~2i!}{YXX0&Ǐh4H<w\MT�S1nH:9ugu'I)wUe0ݙn3& I, 9vǏ+2;SԬeٮZclZj [{ Cz>QYYu9.PQYR\~3OHS} ݝS0Y' \kRh fv'h:A5l`&4ʞ[$,//R]$VZۯL IYME3c F9F1$=X o$iQa1cs\r,tF8ݾLhLoO8Nv |<Gfonl1}'� Ӹ[QCU,--M ;齡q:DU>r$<wvoXD"!'6'mr&`Jj.՝JaKV'*8y7&~}M"߭t]vvvHӔ^GVVL�4y &S7�c-AКibh4^ۥ ~7z}666dYps|9 ۻ"|C�E=Pv|\\ €f+lmmoi۝k`:;;xUϱeXt!?HFNt^k-@ciklnY^]#sFO.v;#'"lootغBy>SSȁu5_H>2]-�K6DQHQ'w.]feegϲXt-(9:NUV7HӌFru54Xr5] f(1լ$onekkk;vI8hw oe4t V% lԊBjX} "Ԋ�lA)^{)� ZC{A7/E^c4vzXD!Nh`01~+W ŚdN4K^sTDyi C,/8NQ) bƌ*E!AXX .s[[Z]UPV'4neY62JӔniB% V# RtǑȫ;Yq$01�j駟`˱7xnoH/*+V 0C:>FuŕRRTl^aRT%BDZY9M k 5)"`9kX8:Ϲ˼~~qyQpĪ,/^ZܹѷϼV# 1ƤHOU{iU⽷^UVUިzo@`qE#^8kWcqo:ouFJF|IĤsDO! -U__}g<pʹfN F;$<ljGQ @ l{X5A"% -axc38k7:kMnuZaxH/7 ޳']U5ɉH)V63<COڭDkCN8I1CĚu;Q<*7%(*"E%}h_Ge8V1Ƌ?cfi/_ѯRtZrrU'g ZS{εD 1l{M?xc0 MzopZ맻`oEQcL ÎA4Otv?[OHUî ` d뮻Z_}䭷~X3jV?<7@?M3ia$ c?ZED0̧Ґ ˫hIzkŗeye=+kyCEo+(!X NV*/ٟT*b#T58VD}$?㽿bA`1A A8kEQ䬵~GėbDT@A//_g}}?W�LS?ԝß}HQceaaVs8z/$N乻dq.+nH. 1S1j jExs{#zw@ A{ݟɿephv yi$}-KEdXhU> ( sroT@m`KNw<vwbn~ (4g8z8Á IAuc/b@ ԋQ"Fj@/noȃ?=0” 4yg~93sJRj5z{eٷ]1y؉I 1V*&PcQ]^}o|\5<~_X8c]8F{v$N4IbQ%k֋8cP:PoVtՏ&qG<7�c�0n'o?i8p, Tx/X ƪ1EQ_~?>�EԸ&(�~Ň/Dat+(,'߂C&e|;r^8cX 0V~</?czSn<#*\-FvA�O<SU8v zn5T^s޼k]%7?f?'~0y`acsC@>0> aF,,ݞg8 jrϢ=ƛ?_x�v=Њ&Xvv;W_9c̬Kk0Ҝ`<7Hu}'?ȁl5c~ަ`@Qx)=ByģQ<~eBv~`sTUƪz0<}_z +omJ u 8h+}<ƂO3kJ^"i||~=-w+gW�~g}6�^/�/p68@wh4s.����IENDB`����������������quodlibet-3.5.3/quodlibet/images/hicolor/64x64/apps/������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�022410� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/64x64/apps/quodlibet.png�����������������������������������0000644�0001750�0001750�00000004216�12501341560�025070� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���@���@���iq���sBIT|d��� pHYs�� �� B(x���tEXtSoftware�www.inkscape.org<�� IDATxpT?w7aChHJ) ['  2#PȥCbDpb2? Ai-(H:2:P*!hLH$ HwOx%Iy/<GNv6w}w93BA_4 5馩%钩|pboIPDBy("p5qۣ.G*PVGl\ڀVBr{&_tS)0-o\eF*R*11"Cg. Gx lf(Tء<éM3{SZJ/m '+ΰd~TҊ zhߛwy#:pȡj7D�.Gá3'<2ͫzn/"r'�ݺÛBuKee=POt%%H[((8iO$ԉfjϻ˯6@k]- 4DzxV?ᅇx K_G{U�)m9^U㄂1$-Z腇x`٢weetCDhnnfk9S]}w[sӵ1ub1�+,˺ '0~cO"]@yK~ew3Zs-F2s'K,Jz)hŲE;\yڼ44F9U^T}I47WFo1$B}<q(V`"vu~C[oFΑg׮Wv"1•+Wr1R"b )E$1 #U$|/x@kmqUV~d{f!"q0;wc_!ueY)ƌ<nyz>[gk?m/7oٱ3ioAB 0Vkc,˚/8jG2$m}wBkmYV?@/K w:b3& _sVTBVZbn4W=:9c;I  F6uϒG{32.m^\z~q*˲7B ~_жTCw?eYY~2 D�clCԥDJD =xqeY%`O~/\ӕ۴%XGTV1OtIN+b6e`<X]D #BcC[mjY�Tحn-oLK%8!$Ž PWq4x ϲ ^أ#80QD̽^tZ-U@".2.\ȴMw%hmAL3CP  5 qo9=]K@t{@|[TVf&8 s^#q}%OcD�/TIⶁڮkFqԔTY9`.y�}?ʼnYAV +V-/R=z.B%0nu&ŗ^E"_l|fL;M^"F;/Wa78Xvh agut>1X=z$۶K09�P()//G"oiSa:IHHp^3q#`Gc0lUq:Džl|VkTJe;J ˖ \=0/*AmJ0x%u2sֳ8n (Z`KOPJ([L4.@O�־~APJ!ưz͚x/ta[Rϟٳ㇏�Sv6Bĸq(** Z7_c/tRb^!)`jg КȔR2hРsb7t xSku`J}Əz컑\t>_t=ˍP@vvvauF }`"|̙`_Lxb֬Y Æ Z7B� 4 hAtԑ`%����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/64x64/apps/exfalso.png�������������������������������������0000644�0001750�0001750�00000007434�12501341560�024546� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���@���@���iq���sBIT|d���tEXtSoftware�www.inkscape.org<��IDATx{p\u?wZ,$O #!-cI8<e2eI6\L0&mH I%?R0X<,d 0z!=cڽ{weM{f99*J/r_.i钥7^.0U7j-YJn.k6Yyh3j?.< r%K sMji VQ칃oA u \o zX]fQ֢]"T9" <,u p,^<M5DJ&Ê"خޒg>Ij* nTDEDA8{ݲckܪgP�Q@D@~bB'"# ʑ;Bק"Yk}tM]r-x)BVDdY or3[ܑ//C"$A)HyZ#( 2LL=|w2i׻P3ɟƭ DJ$',R_V̚�n�D 2H=QΊHXA^={oO6iQxH`)]"JC㑴%v ĭzIa@yCA'0$u-($/&YU4gkakt($qS9i+A(fau n/~C1i$vm0*m֌764wND8zJ]%|I95!z\6 13UVۼk3W޹V +4-7c~g'#}fcMo7a8m @:jU 3bd&!c86+6< v2M3>- }<>>"g"RODOp#uuI}#@|KP3g]lLSTX.DWR[ȤP-yƭ #ݧ?-I3 D%wUl6[pM\KhA}"c 7984> }%c ); zZr2ޕIG'M@{~ѴD |6X,G]�d"bOM^b{M^/ėm&�@ND4�AfW)Ri,63tE98�\DY1_!OD2k$gg�0*%1iʖsR|sWTpROsRAz" 1ߟt=3$ꛂncZz<m 6% 1z&դ%O $}!^qJUHF#wk/׭zNN ?@l6rD=H2' �%dҴGH6V7&og$ĭ4=Q2p|$D>im恢!ISXj~I)! ޺7B�qeFmɂ'+7dŰiin/좡 <V=맜�ۜځAFFG 22%3@g^g*Ewm@VقjT|l\ VkJ'kܪ'rQ�}˽T=t:ɮnz>p(D0 #l-rt8P*ex1cz33ZZOJ;0pXV=_Ǥ H� mG~ϖ f]#ɗȦX-9KU'`ízBs -9`0hʁyöqI{֯Kw8 @7! NUdpO 3Nџx2GĖ*l:ɧׇ:ns`۔)ze1UeF-Q_J\%xG/m}n/mpX/�sUubEPL&D8A2WjH�! n P@blIBOj[ՈD{ TX]KXo׷ȌV*(EC +eؼM1- 3ޞH0c!TQIQ8g|tbhm#jg;"SW<-sV.z?H^()Qٴaoڈ4RGr;˝g7^4,@B-Yܷl͵ybl61pEY)'<j YѾ8 cT7<tݷrpYgH4ʱc*>r(٧�xt�0"BW/K~nF =|αw6ON-ȊB%?{{݆%�pTj e%k$yݴL큠of|&Dr?}ĶҲk MTtttM 1Q-"2a"´iFS/."݅HnٳgL�A$ %R [Shq$<SKw^@raԕ_?U#ɋ\ǘ&f͜ޝ@Df>mxxj``YAW!}]bAUU IRVɧ~?�^iEPzyH"Vd1 32 #l$y#D"=z2\Ohs:td(.;ѴJ:::�Փ&�hK K>}LΝc@Wf(MB㩩P(n6GN 48O?sm?QRY8&,P%B,[=/bZ Wͫ\NgbD8tᡬq 4YHiz8M1n7X#mzS`QLGrzJ&"y{n�Wb;nH4РߪZ@Q7}a11ҭzr}5>sƶ6S$-<|խzv9(''QY:ӯwɕW{< <\76nE 蛻dɒ';::޽{Hd\7B!:;;̙�E@NHwGP$.W v;EEv^/-.y˘j/(}vd\x{ھѣG蠧p8L$/3AEaڵlٲ}޷!Rj2{F2)**2}e",Y(ySoC@/ /ݪg2I~ ^%>_Fioo_P(D @Db߾} #Ls+c?~tٳE|"~_K&~-ʤsYbw5>xwe;w䥗^ʫ|Zclw]c۶�^3,ۀ\'0/%B+U֭<x{ƍg(kȏ,_}&;/F{[n͛˟K3uLL6|G'[b?477j޼? } bZ MbU�~;ߐͯD����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/scalable/��������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�022420� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/scalable/status/�������������������������������������������0000755�0001750�0001750�00000000000�12646427760�023743� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/scalable/status/quodlibet-missing-cover.svg����������������0000644�0001750�0001750�00000104272�12501341560�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.5.3/quodlibet/images/hicolor/scalable/apps/���������������������������������������������0000755�0001750�0001750�00000000000�12646427760�023363� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/images/hicolor/scalable/apps/exfalso.svg����������������������������������0000644�0001750�0001750�00000014325�12501341560�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.5.3/quodlibet/images/hicolor/scalable/apps/quodlibet.svg��������������������������������0000644�0001750�0001750�00000022037�12501341560�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.5.3/quodlibet/images/hicolor/scalable/apps/quodlibet-symbolic.svg�����������������������0000644�0001750�0001750�00000014157�12607265240�027711� 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.91 r13725" sodipodi:docname="temp-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="-25.370041" 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;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" 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.5.3/quodlibet/images/hicolor/scalable/apps/exfalso-symbolic.svg�������������������������0000644�0001750�0001750�00000017750�12607265240�027364� 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.91 r13725" sodipodi:docname="temp-exfalso-symbolic.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="2" inkscape:cx="-80.627458" inkscape:cy="45.885944" 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;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: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.5.3/quodlibet/query/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017113� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/query/_match.py�����������������������������������������������������������0000644�0001750�0001750�00000024201�12607265240�020705� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2011 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 operator from quodlibet.util.path import fsdecode from quodlibet.util import date_key, validate_query_date, parse_date class error(ValueError): pass class ParseError(error): pass TIME_KEYS = ["added", "mtime", "lastplayed", "laststarted"] SIZE_KEYS = ["filesize"] FS_KEYS = ["~filename", "~basename", "~dirname"] class Node(object): def search(self, data): raise NotImplementedError def filter(self, sequence): return filter(self.search, sequence) 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 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 __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""" def __init__(self, tag, op, value): if isinstance(tag, unicode): self.__tag = tag.encode("utf-8") else: self.__tag = tag self.__ftag = "~#" + self.__tag self.__op, self.__value = map_numeric_op(self.__tag, op, value) def search(self, data): num = data(self.__ftag, None) if num is not None: return self.__op(round(num, 2), self.__value) return False def __repr__(self): return "<Numcmp tag=%r, op=%r, value=%.2f>" % ( self.__tag, self.__op.__name__, self.__value) 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 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 FS_KEYS: self.__fs.append(name) else: self.__intern.append(name) else: self.__names.append(name) def search(self, data): for name in self.__names: val = data.get(name) if val is None: # filename is the only real entry that's a path if name == "filename": val = fsdecode(data.get("~filename", "")) else: val = data.get("~" + name, "") if self.res.search(unicode(val)): return True for name in self.__intern: if self.res.search(unicode(data(name))): return True for name in self.__fs: if self.res.search(fsdecode(data(name))): 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]) def map_numeric_op(tag, op, value, time_=None): """Maps a human readable numeric comparison to something we can use. Handles cases like '< 3 days', '>5MB' etc.. If parsing fails, raises a ParseError. Takes a tag, an operator string and and a value string: op, v = map_numeric_op("added", "<", "today") Returns an (operator function, numeric value) tuple: if op(v, song("~#added")): ... (time_ is only used for testing) """ operators = { "<": operator.lt, "<=": operator.le, ">": operator.gt, ">=": operator.ge, "=": operator.eq, "!=": operator.ne, } if op not in operators: raise ParseError("Unknown operator %s" % op) inv_op = op.replace(">", "<") if op[0] == ">" else op.replace("<", ">") inv_op = operators[inv_op] op = operators[op] value = value.lower().strip() if tag == "date": if not validate_query_date(value): raise ParseError("Invalid date %r" % value) return (op, date_key(value)) if tag in TIME_KEYS: try: value = parse_date(value) except ValueError: pass else: return (op, value) if value == "now": value = (time_ or time.time()) return (inv_op, value) if value == "today": value = (time_ or time.time()) - 24 * 60 * 60 return (inv_op, value) # check for time formats: "5:30" # TODO: handle "5:30 ago" try: hms = map(int, value.split(":")) except ValueError: pass else: if len(hms) > 1: value = 0 for t in hms: value *= 60 value += t if tag in TIME_KEYS: value = (time_ or time.time()) - value return (inv_op, value) return (op, value) # get the biggest float/int max_val = "" for i in xrange(len(value) + 1, 0, -1): part = value[:i] try: float(part) except ValueError: pass else: max_val = part break else: raise ParseError("No numeric value %r" % value) unit = value[len(max_val):].strip() try: value = int(max_val) except ValueError: value = float(max_val) if tag in TIME_KEYS: part = (unit.split() or [""])[0].rstrip("s") if part.startswith("second"): value = value elif part == "minute": value *= 60 elif part == "hour": value *= 60 * 60 elif part == "day": value *= 24 * 60 * 60 elif part == "week": value *= 7 * 24 * 60 * 60 elif part == "month": value *= 30 * 24 * 60 * 60 elif part == "year": value *= 365 * 24 * 60 * 60 elif unit: raise ParseError("No time unit: %r" % unit) else: # don't allow raw seconds since epoch. It's not that usefull # and overlaps with the date parsing # (10 would be 10 seconds, 1970 would be 0) raise ParseError("No valid time format") value = int((time_ or time.time()) - value) return (inv_op, value) if tag in SIZE_KEYS: if 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 size unit: %r" % unit) elif unit: raise ParseError("Tag %r does not support units (%r)" % (tag, unit)) return (op, value) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/query/_diacritic.py�������������������������������������������������������0000644�0001750�0001750�00000031406�12646426641�021560� 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 # A simple top-down parser for the query grammar. It's basically textbook, # but it could use some cleaning up. It builds the requisite match.* # objects as it goes, which is where the interesting stuff will happen. """ Ways to let ASCII characters match other unicode characters which can be decomposed into one ASCII character and one or more combining diacritic marks. This allows to match e.g. "Múm" using "Mum". re_add_variants(u"Mum") => u"[MḾṀṂ][uùúûüũūŭůűųưǔǖǘǚǜȕȗṳṵṷṹṻụủứừửữự][mḿṁṃ]" This is also called Asymmetric Search: http://unicode.org/reports/tr10/#Asymmetric_Search TODO: support replacing multiple characters, so AE matches Æ """ import sre_parse import unicodedata import sys from quodlibet.util import re_escape _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 = { u'D': u'\xd0\u0110\ua779', u'F': u'\ua77b', u'G': u'\ua77d', u'H': u'\u0126', u'L': u'\u0141', u'O': u'\xd8\u01fe', u'R': u'\ua782', u'S': u'\ua784', u'T': u'\ua786', u'd': u'\xf0\u0111\ua77a', u'f': u'\ua77c', u'g': u'\u1d79', u'h': u'\u0127\u210f', u'l': u'\u0142', u'o': u'\xf8\u01ff', u'r': u'\ua783', u's': u'\ua785', u't': u'\ua787', u'\u03c3': (u'\u03c2\u03f2\U0001d6d3\U0001d70d\U0001d747' u'\U0001d781\U0001d7bb'), u'\u0413': u'\u0490', u'\u041e': u'\ua668\ua66a\ua66c', u'\u0433': u'\u0491', u'\u043e': u'\ua669\ua66b\ua66d', } 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 _diacritic_for_letters.iteritems(): 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 def _fixup_literal(literal, in_seq, mapping): u = unichr(literal) if u in mapping: u = u + 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_not_literal(literal, mapping): u = unichr(literal) if u in mapping: u = u + mapping[u] u = re_escape(u) return u"[^%s]" % 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(mapping[u])) start = re_escape(unichr(start)) end = re_escape(unichr(end)) return u"%s%s-%s" % ("".join(extra), start, end) def _construct_regexp(pattern, mapping): """Raises NotImplementedError""" parts = [] for op, av in pattern: if op == "not_literal": parts.append(_fixup_not_literal(av, mapping)) elif op == "literal": parts.append(_fixup_literal(av, False, mapping)) elif op == "category": 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 == "negate": parts.append(u"^") elif op == "in": in_parts = [] for entry in av: op, eav = entry if op == "literal": in_parts.append(_fixup_literal(eav, True, mapping)) else: in_parts.append(_construct_regexp([entry], mapping)) parts.append(u"[%s]" % (u"".join(in_parts))) elif op == "range": start, end = av parts.append(_fixup_range(start, end, 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": 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, unicode) pattern = sre_parse.parse(text) return _construct_regexp(pattern, mapping) # use _DIACRITIC_CACHE and create a lookup table _mapping = generate_re_mapping(diacritic_for_letters(regenerate=False)) # add more from the UCA decomp dataset for cp, repl in _UCA_DECOMPS.iteritems(): _mapping[cp] = _mapping.get(cp, u"") + repl 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, unicode) return re_replace_literals(text, _mapping) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/query/_parser.py����������������������������������������������������������0000644�0001750�0001750�00000023315�12646426641�021121� 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 # A simple top-down parser for the query grammar. It's basically textbook, # but it could use some cleaning up. It builds the requisite match.* # objects as it goes, which is where the interesting stuff will happen. import re from re import Scanner from . import _match as match from ._match import error, ParseError from ._diacritic import re_add_variants from quodlibet.util import re_escape # Token types. (NEGATION, INTERSECT, UNION, OPENP, CLOSEP, EQUALS, OPENRE, CLOSERE, REMODS, COMMA, TAG, RE, RELOP, NUMCMP, EOF) = range(15) class LexerError(error): pass class QueryLexer(Scanner): def __init__(self, s): self.string = s.strip() Scanner.__init__(self, [(r"/([^/\\]|\\.)*/", self.regexp), (r'"([^"\\]|\\.)*"', self.str_to_re), (r"'([^'\\]|\\.)*'", self.str_to_re), (r"([<>]=?)|(!=)", self.relop), (r"[=|()&!,#]", self.table), (r"\s+", None), (r"[^=)|&#/<>!,]+", self.tag) ]) def regexp(self, scanner, string): return QueryLexeme(RE, string[1:-1]) def str_to_re(self, scanner, string): if isinstance(string, unicode): string = string.encode('utf-8') string = string[1:-1].decode('string_escape') string = string.decode('utf-8') return QueryLexeme(RE, "^%s$" % re_escape(string)) def tag(self, scanner, string): return QueryLexeme(TAG, string.strip()) def relop(self, scanner, string): return QueryLexeme(RELOP, string) def table(self, scanner, string): return QueryLexeme({'!': NEGATION, '&': INTERSECT, '|': UNION, '(': OPENP, ')': CLOSEP, '=': EQUALS, ',': COMMA, '#': NUMCMP}[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] + [QueryLexeme(EOF, "")]) class QueryLexeme(object): _reverse = {NEGATION: "NEGATION", INTERSECT: "INTERSECT", OPENRE: "OPENRE", CLOSERE: "CLOSERE", REMODS: "REMODS", OPENP: "OPENP", CLOSEP: "CLOSEP", UNION: "UNION", EQUALS: "EQUALS", COMMA: "COMMA", TAG: "TAG", RE: "RE", RELOP: "RELOP", NUMCMP: "NUMCP", EOF: "EOF", } def __init__(self, typ, lexeme): self.type = typ self.lexeme = lexeme def __repr__(self): return (super(QueryLexeme, self).__repr__().split()[0] + " type=" + repr(self.type) + " (" + str(self._reverse[self.type]) + "), lexeme=" + repr(self.lexeme) + ">") class QueryParser(object): """Parse the input. One lookahead token, start symbol is Query.""" def __init__(self, tokens): self.tokens = iter(tokens) self.lookahead = self.tokens.next() def _match_parened(self, expect, ReturnType, InternalType): self.match(expect) self.match(OPENP) m = InternalType() if len(m) > 1: m = ReturnType(m) else: m = m[0] self.match(CLOSEP) return m def _match_list(self, InternalType): l = [InternalType()] while self.lookahead.type == COMMA: self.match(COMMA) l.append(InternalType()) return l def Query(self): if self.lookahead.type == UNION: return self.QueryUnion() elif self.lookahead.type == INTERSECT: return self.QueryInter() elif self.lookahead.type == NEGATION: return self.QueryNeg() elif self.lookahead.type == NUMCMP: return self.QueryNumcmp() elif self.lookahead.type == TAG: return self.QueryPart() elif self.lookahead.type == EOF: return match.True_() else: raise ParseError("The expected symbol should be |, &, !, #, or " "a tag name, but was %s" % self.lookahead.lexeme) def StartQuery(self): s = self.Query() self.match(EOF) return s def StartStarQuery(self, star): if self.lookahead.type == EOF: s = match.True_() self.match(EOF) return s s = self.RegexpSet(no_tag=True) self.match(EOF) def insert_tags(p): # traverse and fill in tags where needed if isinstance(p, match.Inter): return match.Inter([insert_tags(v) for v in p.res]) elif isinstance(p, match.Union): return match.Union([insert_tags(v) for v in p.res]) elif isinstance(p, match.Neg): return match.Neg(insert_tags(p.res)) else: return match.Tag(star, p) return insert_tags(s) def QueryNeg(self): self.match(NEGATION) return match.Neg(self.Query()) def QueryInter(self): return self._match_parened(INTERSECT, match.Inter, self.QueryList) def QueryUnion(self): return self._match_parened(UNION, match.Union, self.QueryList) def QueryNumcmp(self): return self._match_parened(NUMCMP, match.Inter, self.NumcmpList) def QueryList(self): return self._match_list(self.Query) def NumcmpList(self): return self._match_list(self.Numcmp) def Numcmp(self): tag = self.lookahead.lexeme self.match(TAG) op = self.lookahead.lexeme self.match(RELOP, EQUALS) value = self.lookahead.lexeme self.match(TAG) if self.lookahead.type in [RELOP, EQUALS]: # Reverse the first operator tag, value = value, tag op = {">": "<", "<": ">", "<=": ">=", "<=": ">="}.get(op, op) op2 = self.lookahead.lexeme self.match(RELOP, EQUALS) val2 = self.lookahead.lexeme self.match(TAG) return match.Inter([match.Numcmp(tag, op, value), match.Numcmp(tag, op2, val2)]) else: return match.Numcmp(tag, op, value) def _match_string(self): s = self.lookahead.lexeme self.match(self.lookahead.type) return s def QueryPart(self): names = [s.lower() for s in self._match_list(self._match_string)] if filter(lambda k: k.encode("ascii", "replace") != k, names): raise ParseError("Expected ascii key") self.match(EQUALS) res = self.RegexpSet() return match.Tag(names, res) def RegexpSet(self, no_tag=False): if self.lookahead.type == UNION: return self.RegexpUnion() elif self.lookahead.type == INTERSECT: return self.RegexpInter() elif self.lookahead.type == NEGATION: return self.RegexpNeg() elif self.lookahead.type == TAG and not no_tag: return self.MatchTag() elif self.lookahead.type == RE: return self.Regexp() else: raise ParseError("The expected symbol should be |, &, !, or " "a tag name, but was %s" % self.lookahead.lexeme) def RegexpNeg(self): self.match(NEGATION) return match.Neg(self.RegexpSet()) def RegexpUnion(self): return self._match_parened(UNION, match.Union, self.RegexpList) def RegexpInter(self): return self._match_parened(INTERSECT, match.Inter, self.RegexpList) def RegexpList(self): return self._match_list(self.RegexpSet) def MatchTag(self): tag = self.lookahead.lexeme self.match(TAG) try: return re.compile(re_escape(tag), re.IGNORECASE | re.UNICODE) except re.error: raise ParseError("The regular expression was invalid") def Regexp(self): regex = self.lookahead.lexeme self.match(RE) mods = re.MULTILINE | re.UNICODE | re.IGNORECASE if self.lookahead.type == TAG: s = self.lookahead.lexeme.lower() if set(s) - set("cisld"): raise ParseError("Invalid regular expression flags: %r" % s) if "c" in s: mods &= ~re.IGNORECASE if "i" in s: mods |= re.IGNORECASE if "s" in s: mods |= re.DOTALL if "l" in s: mods = (mods & ~re.UNICODE) | re.LOCALE if "d" in s: try: regex = re_add_variants(regex) except re.error: raise ParseError("The regular expression was invalid") except NotImplementedError: raise ParseError( "The regular expression was is not supported") self.match(TAG) try: return re.compile(regex, mods) except re.error: raise ParseError("The regular expression /%s/ is invalid." % regex) 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 = self.tokens.next() else: raise ParseError("The token '%s' is not the type exected." % ( self.lookahead.lexeme)) except StopIteration: self.lookahead = QueryLexeme(EOF, "") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/query/__init__.py���������������������������������������������������������0000644�0001750�0001750�00000000120�12607265240�021203� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- from ._query import Query, QueryType Query, QueryType ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/query/_query.py�����������������������������������������������������������0000644�0001750�0001750�00000011216�12607265240�020760� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 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 . import _match as match from ._match import error, Node from ._parser import QueryLexer, QueryParser from quodlibet.util import re_escape, enum, cached_property @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, dumb_match_diacritics=True): """Parses the query string and returns a match object. star -- List of tags to look in if none are specified in the query. You can add some by extending Query.START and pass it here. dumb_match_diacritics -- In case of text queries (QueryType.TEXT) try to match variants with diacritic marks. 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, unicode): string = string.decode('utf-8') self.star = list(star) self.string = string try: self.type = QueryType.VALID self._match = QueryParser(QueryLexer(string)).StartStarQuery(star) return except error: pass # normal string, put it in a intersection to get a value list if not set("#=").intersection(string): parts = ["/%s/" % re_escape(s) for s in string.split()] if dumb_match_diacritics: parts = [p + "d" for p in parts] string = "&(" + ",".join(parts) + ")" self.string = string try: self.type = QueryType.TEXT self._match = QueryParser( QueryLexer(string)).StartStarQuery(star) return except error: pass self.type = QueryType.VALID self._match = QueryParser(QueryLexer(string)).StartQuery() @classmethod def StrictQueryMatcher(cls, string): """Returns a Matcher for a strict, valid (non-freetext) Query, or `None` if this fails. """ try: return QueryParser(QueryLexer(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__() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/remote.py�����������������������������������������������������������������0000644�0001750�0001750�00000006701�12607265240�017605� 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 quodlibet.util import fifo 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): """Takes an Application and CommandRegistry""" raise NotImplemented @classmethod def remote_exists(self): """See if another instance exists""" raise NotImplemented @classmethod def send_message(cls, message): """Send data to the existing instance if possible and returns a response. 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. Might raise 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): try: winpipe.write_pipe(cls._NAME, message) 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): self._cmd_registry.handle_line(self._app, data) 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): try: return fifo.write_fifo(cls._PATH, message) 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: response = self._cmd_registry.handle_line(self._app, command) if path is not None: with open(path, "wb") as h: if response is not None: h.write(response) if os.name == "nt": Remote = QuodLibetWinRemote else: Remote = QuodLibetUnixRemote ���������������������������������������������������������������quodlibet-3.5.3/quodlibet/plugins/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017427� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/plugins/songsmenu.py������������������������������������������������������0000644�0001750�0001750�00000005300�12607265240�022003� 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 tense is called once for each selected song/album, but the plural tense 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, library): super(SongsMenuPlugin, self).__init__() self.__library = library self.__songs = songs 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.5.3/quodlibet/plugins/editing.py��������������������������������������������������������0000644�0001750�0001750�00000012316�12604031045�021404� 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 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.5.3/quodlibet/plugins/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000036036�12646426641�021545� 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 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 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, basestring): 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 self.__scanner.modules.itervalues() @property def _plugins(self): """All registered plugins""" plugins = [] for module in self.__modules.itervalues(): 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 self.__scanner.failures.iteritems(): 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 self.__modules.keys(): 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 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 sections 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) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/plugins/gui.py������������������������������������������������������������0000644�0001750�0001750�00000003075�12607265240�020560� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- 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`. """ # 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. MAX_INVOCATIONS = config.getint("plugins", "default_max_invocations", 30) def __init__(self): super(Gtk.ImageMenuItem, self).__init__(label=self.PLUGIN_NAME) 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.5.3/quodlibet/plugins/cover.py����������������������������������������������������������0000644�0001750�0001750�00000013216�12604031045�021077� 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.util.path import escape_filename, xdg_get_cache_home 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,)) } 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. key.update(repr(self.song.album_key)) 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.5.3/quodlibet/plugins/playlist.py�������������������������������������������������������0000644�0001750�0001750�00000017475�12607265240�021646� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 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 gi.repository import Gtk 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 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): title = ngettext("Run the plugin \"%(name)s\" on %(count)d playlist?", "Run the plugin \"%(name)s\" on %(count)d playlists?", count) % {"name": plugin_name, "count": count} 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 tense is called once for each selected playlist, but the plural tense 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/2014) 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). TODO: A way to inherit from both PlaylistPlugin and SongsMenuPlugin """ plugin_single_playlist = None plugin_playlist = None plugin_playlists = None def __init__(self, playlists, library): super(PlaylistPlugin, self).__init__() self._library = library 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): """custom confirmer mainly for testing""" self.__plugins = [] if confirmer is None: self._confirm_multiple = ConfirmMultiPlaylistInvoke.confirm else: self._confirm_multiple = confirmer 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, library)) except: print_e("Couldn't initialise playlist plugin %s: " % Kind) print_exc() items = filter(lambda i: i.initialized, items) 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 max(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.5.3/quodlibet/plugins/events.py���������������������������������������������������������0000644�0001750�0001750�00000010023�12604031045�021256� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Michael Urman, Joe Wreschnig # 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 GObject 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 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. Callables: obj.plugin_on_song_started(song) obj.plugin_on_song_ended(song, stopped) obj.plugin_on_added([song1, song2, ...]) obj.plugin_on_changed([song1, song2, ...]) obj.plugin_on_removed([song1, song2, ...]) obj.plugin_on_paused() obj.plugin_on_unpaused() obj.plugin_on_seek(song, msec) obj.plugin_on_error(song, error) """ 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 self.__plugins.itervalues(): method_name = 'plugin_on_' + event.replace('-', '_') handler = getattr(plugin, method_name, None) if handler is not None: try: handler(*args) except Exception: 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.5.3/quodlibet/plugins/gstelement.py�����������������������������������������������������0000644�0001750�0001750�00000002415�12607265240�022140� 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. """ _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.5.3/quodlibet/plugins/playorder.py������������������������������������������������������0000644�0001750�0001750�00000005724�12607265240�022000� 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 quodlibet.qltk.playorder class PlayOrderPlugin(quodlibet.qltk.playorder.Order): """Play order plugins define alternate play orders for Quod Libet. They appear, when enabled, in the combo box in the lower left of the main window, as well as in the tray icon context menu. Play order plugins must define at least two methods, next and previous. def next(self, playlist, iter): ... def previous(self, playlist, iter): ... '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), and iter is the GtkTreeIter for the song that just finished, if any (if the song is not in the list, this iter will be None). They can also define 'display_name' and 'accelerated_name' attributes which are used as the strings for display in the combo box and menu; both default to PLUGIN_NAME. Finally, they can specify an integer 'priority' to sort the list, and a 'replaygain_profile' list which is a list of Replay Gain profile names that this mode should fall back to (e.g. a shuffle mode should not use the 'album' Replay Gain profile). There is also def set(self, playlist, iter): ... for when the user manually selects a song from the list. In this case, iter is the song they selected, and playlist.current_iter is the current iter, if any. If iter is provided and this function returns None, the currently-playing song will not be ended. 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): ... There is also set_explicit, but no set_implicit. Finally, there is def reset(self, playlist): ... which is called when the playlist changes and state should be reset. """ name = None display_name = None accelerated_name = None priority = quodlibet.qltk.playorder.Order.priority class PlayOrderRememberedMixin(quodlibet.qltk.playorder.OrderRemembered): name = None display_name = None accelerated_name = None priority = quodlibet.qltk.playorder.Order.priority class PlayOrderInOrderMixin(quodlibet.qltk.playorder.OrderInOrder): name = None display_name = None accelerated_name = None priority = quodlibet.qltk.playorder.Order.priority class PlayOrderShuffleMixin(quodlibet.qltk.playorder.OrderShuffle): name = None display_name = None accelerated_name = None priority = quodlibet.qltk.playorder.Order.priority ��������������������������������������������quodlibet-3.5.3/quodlibet/player/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017242� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/player/xinebe/������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020514� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/player/xinebe/cdefs.py����������������������������������������������������0000644�0001750�0001750�00000021626�12607265240�022147� 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.5.3/quodlibet/player/xinebe/player.py���������������������������������������������������0000644�0001750�0001750�00000025303�12607265240�022353� 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 config from quodlibet.player import PlayerError from quodlibet.player._base import BasePlayer from . import cdefs from .cdefs import * class XineHandle(object): def __init__(self): _xine = xine_new() xine_config_load(_xine, xine_get_homedir() + "/.xine/config") xine_init(_xine) self._xine = _xine def list_input_plugins(self): plugins = [] for plugin in xine_list_input_plugins(self._xine): if not plugin: break plugins.append(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: " + 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): 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")) 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.get("settings", "xine_driver") except: driver = None return XinePlaylistPlayer(driver, librarian) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/player/xinebe/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000432�12607265240�022612� 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.5.3/quodlibet/player/__init__.py��������������������������������������������������������0000644�0001750�0001750�00000003461�12607265240�021345� 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 from quodlibet import const from quodlibet import util 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 __unicode__(self): return self.short_desc + ( u"\n" + self.long_desc if self.long_desc else u"") def __str__(self): return unicode(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 = __import__(modulename, {}, {}, "quodlibet.player") except Exception as e: if const.DEBUG: util.print_exc() util.reraise(PlayerError, str(e)) else: return backend ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/player/nullbe.py����������������������������������������������������������0000644�0001750�0001750�00000005620�12607265240�021066� 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.5.3/quodlibet/player/_base.py�����������������������������������������������������������0000644�0001750�0001750�00000020151�12635237573�020663� 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 import config 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 = filter(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: 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.5.3/quodlibet/player/gstbe/�������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�020346� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/player/gstbe/prefs.py�����������������������������������������������������0000644�0001750�0001750�00000007347�12607265240�022040� 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.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.5.3/quodlibet/player/gstbe/player.py����������������������������������������������������0000644�0001750�0001750�00000103431�12646426641�022213� 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, 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.util import fver, sanitize_tags, MainRunner, MainRunnerError, \ MainRunnerAbortedError, MainRunnerTimeoutError from quodlibet.player import PlayerError from quodlibet.player._base import BasePlayer from quodlibet.qltk.notif import Task 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 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 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 = gerror.message.decode("utf-8").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 = debug_info.decode("utf-8", errors="replace") 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": format_desc.decode("utf-8")} 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 a tuple (ok, next_song). ok is True if the next song should be set. """ 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 (False, None) if config.getboolean("player", "gst_disable_gapless"): print_d("Gapless disabled") return (False, None) # this can trigger twice, see issue 987 if self._in_gapless_transition: return (False, None) self._in_gapless_transition = True print_d("Select next song in mainloop..") self._source.next_ended() print_d("..done.") return (True, self._source.current) def __about_to_finish(self, playbin): print_d("About to finish (async)") try: ok, song = 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: print_d("About to finish (async): %s" % e) return except MainRunnerError: util.print_exc() return if ok: print_d("About to finish (async): setting uri") uri = song("~uri") if song is not None else None 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(unicode(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 sanitize_tags(tags, stream=False).iteritems(): if self.song.get(key) != value: changed = True self.song[key] = value for key, value in sanitize_tags(tags, stream=True).iteritems(): 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.5.3/quodlibet/player/gstbe/util.py������������������������������������������������������0000644�0001750�0001750�00000014173�12611220625�021662� 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 os import collections from gi.repository import GLib, Gst from quodlibet.util.string import decode from quodlibet.player import PlayerError 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 os.name == "nt": sinks = [ "directsoundsink", "autoaudiosink", ] 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: raise PlayerError(_("No GStreamer audio sink found")) 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 = e.message.decode("utf-8") 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, unicode): continue split = val.split("=", 1) sub_key = decode(split[0]) val = split[-1] if sub_key in merged: sub_val = merged[sub_key] if not isinstance(sub_val, unicode): 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, (int, long, float)): merged[key] = value continue if isinstance(value, str): value = decode(value) if not isinstance(value, unicode): value = unicode(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.5.3/quodlibet/player/gstbe/__init__.py��������������������������������������������������0000644�0001750�0001750�00000000545�12607265240�022451� 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.5.3/quodlibet/player/gstbe/plugins.py���������������������������������������������������0000644�0001750�0001750�00000005054�12607265240�022373� 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 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: 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.5.3/quodlibet/operon/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12646427760�017250� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/quodlibet/operon/base.py������������������������������������������������������������0000644�0001750�0001750�00000004723�12607265240�020530� 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.formats import MusicFile 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, 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 Exception 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.5.3/quodlibet/operon/util.py������������������������������������������������������������0000644�0001750�0001750�00000007470�12607265240�020575� 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 import string 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(string.ljust(h, 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.5.3/quodlibet/operon/__init__.py��������������������������������������������������������0000644�0001750�0001750�00000000426�12607265240�021351� 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.5.3/quodlibet/operon/commands.py��������������������������������������������������������0000644�0001750�0001750�00000057011�12607265240�021415� 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 quodlibet import util from quodlibet.formats import EmbeddedImage from quodlibet.util.path import mtime, fsdecode from quodlibet.pattern import Pattern, error as PatternError from quodlibet.util.tags import USER_TAGS, sortkey from quodlibet.util.tagsfrompath import TagsFromPattern 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 = map(str.strip, 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") 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 = map(str.strip, options.columns.split(",")) tags = [] for key in USER_TAGS: 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" % fsdecode(song("~filename")), ] return u"\n".join(lines) def _text_to_song(self, text, song): assert isinstance(text, unicode) # 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 tags.iteritems(): 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(unicode(e)) raise CommandError(_("Editing aborted")) except OSError as e: self.log(unicode(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 = args[0] value = args[1].decode("utf-8") 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 = args[0] value = args[1].decode("utf-8") 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 = map(str.strip, options.columns.split(",")) if not options.terse: tags = [] for key in ["~format", "~codec", "~encoding", "~length", "~bitrate", "~filesize"]: tags.append((util.tag(key), unicode(song.comma(key)))) print_table(tags, headers, nicks, order) else: tags = [] for key in ["~format", "~codec", "~encoding", "~#length", "~#bitrate", "~#filesize"]: tags.append((key.lstrip("#~"), unicode(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: song.set_image(image) @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: song.clear_images() @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 = [fsdecode(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: 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.5.3/quodlibet/operon/main.py������������������������������������������������������������0000644�0001750�0001750�00000006047�12607265240�020543� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python2 # -*- 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 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) def main(argv): 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), sys.stderr) return 1 break else: print_(u"Unknown command '%s'. See '%s help'." % (arg, main_cmd), sys.stderr) return 1 return 0 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.5.3/NEWS��������������������������������������������������������������������������������0000644�0001750�0001750�00000223542�12646427313�014457� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������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` 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) 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` 3.5.0 (2015-10-07) - BETTER ANSWERS TO "HEY HOW ARE YOU?" THAN "I'M FINE" ------------------------------------------------------------------------- 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 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 3.4.0 (2015-04-09) - She knew every of the things ------------------------------------------------- * 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 Packaging: * See the Packaging Guide for changes 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 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. ------------------------------------------------------------------------------------------------------------------------------- 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` 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) 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` 3.2.0 (2014-08-01) - WHAT KIND OF GOD MADE IT SO LIONS HUG BACK TOO HARD ------------------------------------------------------------------------ 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.org/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.org/en/latest/packaging.html 3.1.91 [beta] (2014-07-22) - Pumps, powerheads, lights and filters! ------------------------------------------------------------------- See final release 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` 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` 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 3.0.91 [beta] (2014-02-28) - You'd have to be in space for that to work. ------------------------------------------------------------------------ See final release 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) 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 3.0.1 (2013-07-08) - *gasp* --------------------------- * Fix a crasher with some PyGObject versions [1211] 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 * http://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 http://www.feedparser.org). * "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); see http://www.sacredchao.net/quodlibet/wiki/Plugins. * 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 (http://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.5.3/COPYING�����������������������������������������������������������������������������0000644�0001750�0001750�00000043110�12501341560�014767� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library General Public License instead of this License. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������