pax_global_header00006660000000000000000000000064112557647300014524gustar00rootroot0000000000000052 comment=ae2b1aecf5c551bf1485e5a9452c96a6c282e7be sonata-1.6.2.1/000077500000000000000000000000001125576473000131565ustar00rootroot00000000000000sonata-1.6.2.1/CHANGELOG000066400000000000000000000510771125576473000144020ustar00rootroot00000000000000v1.6.2.1 - September 21, 2009 + Library artwork caching/displaying improvements + Lyricwiki screen scraping workaround + Replace Amazon.com cover art fetching with Rhapsody.com + Bug: Fix library sorting when adding, e.g., albums to playlist + Bug: Fix window positioning weirdness when unwithdrawing from systray + Bug: Fix album being labeled various artists when a duplicate exists + Bug: Fix album tracks in the info tab being out of order sometimes + Bug: Show songs with a missing date in info album listing + Bug: Library icons change after adding stream to playlist + Bug: Cpu spike, tooltips missing in library search results with gtk 2.16.2 v1.6.2 - April 13, 2009 + Bug: Fix cli options (e.g. 'sonata play') v1.6.1 - April 11, 2009 + Reduce library's filesystem view row height + More auto-applying of preferences (e.g. format tab) + Bug: Fix python version check for Ubuntu Jaunty + Bug: Traceback if track has multiple date tags + Bug: Fix infinite loop when format strings end in '{' + Bug: Fix music directory chooser selecting the wrong folder sometimes + Bug: Catch OSErrors from os.listdir, e.g. flac files with cue sheets + Bug: Fix --profile option v1.6 - March 29, 2009 + Album browsing mode, additional details in library views + Real-time searching of library (search as you type) + Fullscreen album art mode (via right-click on artwork) (mips) + Improve library searching across meta tags + Sort library search results + Show file path in tooltip for library search results + Improved support for updating less than entire library + Drag-and-drop to copy files from Sonata to a file manager (Kamil) + Ability to show file paths in tag editing window + Use plchanges for faster performance (e.g. add to playlist) + Allow manually fetching remote art when using local art pref (Erik) + Swap mousewheel behavior for progressbar + Only minimize to trayicon on click if focused; raise if not focused + Use new 'listplaylists' command for retrieving playlists + Allow hiding the application's titlebar in preferences + Better error trapping + Make process name 'sonata' for linux (himdel) + Look for - .txt lyrics files by other clients + Add Traditional Chinese translation (b4283) + Add Japanese translation (Masato) + Add Slovenian translation (Alan) + Code modernisation, modularisation, overall cleanup, documentation + A prototype of a plug-in system + Unicode fixes + Some helpful error messages if startup fails + Useless code removed, various code cleanups and refactorings (Stephen) + Bug: Bad profiles prevent Sonata from starting + Bug: Error for CLI arguments when Sonata can't connect to MPD (Juan) + Bug: Files may not update in interface after tag editing + Bug: Traceback with Turkish locale + Bug: Lyrics don't work with python-zsi 2.0 on Ubuntu + Bug: Bell sound when going to parent folder using backspace v1.5.3 - September 13, 2008 + Quick link to edit lyrics through LyricWiki + Unicode lyrics and better searching with LyricWiki (orivej) + Store audioscrobbler password as md5 hash + Add Greek translation (Lazaros) + Bug: Fix lost connection when hard drive is spun down + Bug: Fix non-ascii characters when scrobbling with non-utf8 locale + Bug: Selected item changed on double-click + Bug: Use consistent behavior for titlebar + Bug: Prevent bad cover image files from causing problems + Bug: Don't sort library search results + Bug: Ensure image filenames are escaped in search routine v1.5.2 - June 5, 2008 + Improved artwork/lyrics caching through case-insenstive searching + Add Turkish translation (Gökmen) + Bug: Fix artwork for files with unicode characters + Bug: Fix crash if mpd library is empty + Bug: Fix regression where dbus-python became required + Bug: Bold titles lose sync if song changes with visible filterbar + Bug: Doesn't scrobble when same song is repeated + Bug: Python conflict when installed with sugar (OLPC) + Bug: Fix artwork display in song notification window for RTL languages + Bug: Fix progressbar seeking for RTL languages + Bug: No play/pause indicator in egg tray icon if started while mpd is active v1.5.1 - May 3, 2008 + Swap 'shuffle' and 'random' to be consistent with MPD + "Save list to">"foo" can now either replace playlist or append songs + Add Catalan translation (Franc) + Add Arabic translation (Ahmad) + Bug: Fix play/pause with multimedia keys (Vinay) + Bug: Prevent possible traceback from gobject.filename_from_utf8 + Bug: 'play after replace' when in shuffle mode plays 1st song, not random + Bug: Fix random, repeat, and toggle commands from console + Bug: Songs not tagged with the album name don't show up + Bug: Cannot disconnect when MPD_HOST and MPD_PORT are set + Bug: Fix %D and %N formats within brackets v1.5 - April 3, 2008 + Replace album view with genre view for library + Display covers for albums in artist/genre views + Add menu items and shortcuts for playing library items after add/replace + Allow setting artwork for streams + Optional stylized album art with cases (Aidan) + New, faster python mpd interface (jat) + --popup argument to popup song notification (requires D-Bus) (Oleg) + Show 'Untagged' artists/genres in their respective library views + Allow DND of cover art from a web browser (Артем) + Allow DND of music from a file manager into playlist (requires mpd 0.14) + Preserve column percentages for current tab across window resizing + Speed up mpd-related commandline arguments + Switch back to last tab on second cover art click + Retain selection in lists after removing items + Hidden config option to expand notebook tabs (tabs_expanded) + Set ServiceProxy cachedir for lyrics to work around ZSI bug + Add Estonian translation (Mihkel) + Bug: Fix multimedia keys for gnome 2.22 + Bug: Fix artwork for artists/albums with "/" in them (e.g. AC/DC) + Bug: Fix egg trayicon with vertical system tray + Bug: Weird bug in library-view + Bug: Prevent failure to load if tab positions are saved as None + Bug: Fix non-ascii characters in files for non-utf8 filesystems (zap) + Bug: Prevent crash with certain locales like turkish (jat) + Bug: Using filter causes playlist to jump to the top + Bug: Fix AudioScrobblerQuery (kigurai) v1.4.2 - February 9, 2008 + Add %D for disc tag in display formatting options + Better handling if no read permission (e.g. no/bad mpd password supplied) + Bug: Fix seeking in progress bar + Bug: Fix blank album info when there is an ampersand + Bug: Missing color in notification window + Bug: Notebook arrow clicks are ignored due to gtk bug + Bug: Potential ordering bug when sorting via column heading click + Bug: Make desktop file compliant + Bug: Column widths can collapse when exiting while minimized to the tray v1.4.1 - February 2, 2008 + Remove queue support (it was removed from mpd-svn, complain to them) + Improved re-ordering of playlist songs (including multiple selected songs) + Add album info into info tab + Use hand2 instead of hand1 for song info links + Bug: Traceback can occur after enabling audioscrobbler + Bug: Text background color on tabs (ecik) + Bug: Visible background of eventboxes for info tab links, etc. + Bug: Can't click (more) link in non-English locales + Bug: Crash when using libegg with system tray icon disabled + Bug: Disable tag editing link in info tab for streams/remote files + Bug: Unescape common html codes from lyrics fetching, enable formatting + Bug: The main notebook should be scrollable v1.4 - January 15, 2008 + Integrate info window into main player + Update to audioscrobbler protocol 1.2 and scrobbling bug fixes (mveers) + Implemented caching of scrobbles across client restarts + Vertically center currently playing song + Updated artwork (Adrian Chromenko) + IPv6 support for the mpd connection (Shane Kerr) + Allow screen center for notification popup + Preference for saving lyrics to music file's directory (like artwork) + Allow hiding and reordering notebook tabs (e.g. playlists, streams, info) + Retain library path when re-opening Sonata + Remove confusing 'remote only' and 'remote, then local' artwork options + Ability to hide progress bar (can create very minimal player) + Skip fallback artwork search of just album name if primary searches fail + Make system tray icon scalable + Shortcuts to search library (ctrl-h), randomize current playlist (alt-r) + Use gtk theme's link-color if available (only for gtk 2.12 and above) + Bug: Right-click menu can cause accidental actions with some gtk themes + Bug: Prevent crash on negative disc/track numbers + Bug: Filter + Edit Tags edits a different song than selected + Bug: Prevent possible exception regarding cover art on first load + Bug: Fix retrieving some non-English lyrics (ecik) + Bug: Allow MPD_HOST to override GUI + Bug: {} displays in the Current column title + Bug: Fix manpage path to be FHS compliant + Bug: Ensure that the version of ZSI is compatible with sonata v1.3 - October 29, 2007 + Playlist queue support (requires mpd 0.14 - currently mpd-svn) + Use-configurable columns in playlist by using "|" in prefs > format (xsdnyd) + Switch from SOAPpy to newer ZSI library for lyrics fetching + Use xmms-like search filter by default when user types (no more ctrl-j) + Ctrl-i shortcut to center currently playing song + Use case insensitive sorting for library (holy_robot) + Ignore "the" when sorting library in artist/album views (holy_robot) + Better logic when sorting playlists and new "dir+file" sort option (sed) + Allow saving/overwriting existing playlists and streams + Hidden config options to set browser, hide column headers + Update license to GNU GPLv3 + Added Brazilian translation (Alex Tercete Matos) + Added Danish translation (Martin Dybdal) + Bug: Fix nl.po translation causing crash + Bug: Remember playlist position when adding from library + Bug: Fixed tracebacks with certain encodings + Bug: MPD_HOST with password doesn't work on first install + Bug: Fix desktop file to match current XDG standard (nigel) + Bug: Search Amazon artwork using latin1 since it no longer supports utf8 + Bug: Possible tag editing issues w/non-latin encoding (requires tagpy 0.93) + Bug: Fix czech translation to use cs.po v1.2.3 - August 23, 2007 + Incorporate disc tag in album sorting (Emmanuel Viaud) + Significantly reduced wakeups/sec according to powertop + Add stream name as a formatting option + Added Italian translation (Gianni Vialetto) + Added Swedish translation (Daniel Nylander) + Added Dutch translation (Olivier) + Bug: Stupid parsing of amazon URLs, reduced success of cover art fetching + Bug: Default cover remains after refetching when not using ~/.covers + Bug: Czech translation incorrectly labeled Swedish + Bug: Song played after a replace is first in list, even in shuffle mode + Bug: Collapsed view doesn't work properly in some WMs (e.g. Fluxbox) + Bug: Display 'update library' menu item even when library is empty v1.2.2 - July 22, 2007 + Bug: Fix artwork fetching (Amazon gzip'ed xml returns garbage) + Bug: Prevent connection error if the interface hasn't yet been run + Bug: Prevent possibility of deleting image file when choosing local art file + Bug: Don't load gnome-settings-daemon if it's not running (kinote) v1.2.1 - July 16, 2007 + Bug: Using MPD with a password causes error v1.2 - July 15, 2007 + Audioscrobbler support (requires python 2.5 or python-elementtree) (Owen) + Support for multiple profiles (and, e.g., "sonata --profile=2") + Ability to set search terms for lyrics + Ability to rename playlists (requires mpd >= 0.13) + Prevent continually searching for artwork/lyrics if not found the first time + Search for additional artwork filenames + Allows resetting artwork to the default image + 'Save All' button for tag editing window + Display MPD status in systray icon + Prevent GUI blocking when connecting to MPD, where possible + Added Finnish translation (Ilkka Tuohela) + Bug: Multimedia keys no longer work in Gnome 2.18 (Florian) + Bug: Hide statusbar in collapse mode when showing from systray + Bug: Cover artwork filename doesn't use system's locale charset + Bug: MPD_HOST variable doesn't work when it includes password v1.1.1 - May 18, 2007 + Add Czech translation (Jakub Adler) + Bug: Incorrect artist can sometimes be set for album art/info (vEX) + Bug: Artwork isn't set when there is a single image in the song's dir + Bug: Improve handling under tiling WMs like ion3 + Bug: A 2nd instance isn't prevented with dbus/python 2.4 (Sebastian) v1.1 - May 7, 2007 + Ctrl-J for xmms-like search filter (vEX/Eduard) + Implemented logic for Various Artists albums + Cover art pref: save to ~/.covers or file's respective dir + Support for GNOME session management + Allow searching through ALL metadata in library + Link artist and album name in song info window to wikipedia entry + Add shuffle, repeat, --visible, and --hidden commandline arguments + Show if mpd is updating in statusbar + Save last used option in library search + Update code for dbus-python 0.80 API (Jordan) + Ellipsize text in treeviews, current playing song (Jordan) + Add button for listing of shortcuts to About dialog + Resize cover art to fit song info window + Added Simplified Chinese translation (Desmond Chang) + Bug: Prevent tracebacks between withdrawing app & gtk.StatusIcon + Bug: Fix error if mpd is not running and sonata starts hidden + Bug: Can't manually set artwork across filesystems + Bug: Can't use find-as-you-type in the current playlist + Bug: Right-click menu closes right away for some users v1.0.1 - February 13, 2007 + Make lyrics fetching optional + Allow editing of stream name/url + Hide the notification window when it is clicked + Small usability improvements to gtk.StatusIcon + Improvements to reordering the current playlist with drag-n-drop + Bug: Info window freezes when editing currently playing song's tags + Bug: Tag editing doesn't work with older version (0.90.1) of tagpy + Bug: Prevent strange potential freeze with gc.collect() + Bug: Cover art doesn't update correctly if Local Only artwork set + Bug: Lyrics occassionally don't stay synced with current playing song v1.0 - January 21, 2007 + Multiple views for library: filesystem, artists, albums + Editing of song tags (requires optional taglib & tagpy) + Auto-fetching of song lyrics (requires optional soappy) + Improved song info window and access to it + Allow pls/m3u/extm3u's as stream inputs + Sort current playlist (by metadata, random, reverse) + Optional statusbar (playlist length, time) + Revert to gtk's StatusIcon if gnome-python-extras isn't installed + Make system tray icon optional + Pref to write xmms-info like status file to use with IM, IRC.. (Tim) + Allow drag-n-drop of images to set album art + If there is only one image in the song's dir, set as art (Ivan) + Album art priority preference (local vs remove) + Formatting options (genre, song length, elapsed time, year) (Ivan) + Pref to play enqueued items on activate (i.e. enter/double-click) + Play friendler with other clients for shuffle/repeat/crossfade + Reduced startup time/memory usage + Use curly brackets {} to have formatting appear only if all enclosed tags are available + Ability to run on OLPC's Sugar user environment (Owen) + Added Ukranian translation (Господарисько Тарас) + Bug: No more freezes due to threading! Finally! Seriously! + Bug: Cannot set album art for album/artist with "/" in name + Bug: Prevent interface jumping because of progress bar font + Bug: Notification window isn't positioned correctly for dual-head v0.9 - November 19, 2006 + Added stream support + Use local artwork (cover.jpg, folder.jpg) first, if it exists (requires music_directory to be specified in preferences) + Allow crossfading (mixing) between songs + Fetch higher-resolution cover art + Allow specifying search terms for remote album art + Improved song info viewer + Make remote images window non-blocking + Popup song notification on un-pause + Pick up tooltip album background color from gtk theme + Store cover art in ~/.covers for consistency with gmpc + Add German translation (Paul Johnson) + Bug: Prevent infrequent crash when fetching album art + Bug: Intermittent interface freezes due to threading + Bug: Unable to delete playlists with ampersand, etc. + Bug: Player can become the wrong height on expand + Bug: Ensure local art is correctly applied on song changes + Bug: Searching library doesn't work for non-english locale v0.8.1 - October 19, 2006 + Add Polish translation (Tomasz Dominikowski) + Bug: Correctly send mpd password when using manual connect + Bug: Prevent certain keys from causing events + Bug: Prevent potential crash if not able to obtain mpd status v0.8 - October 7, 2006 + Allow user formatting of current playlist, library, and title + Pref for song notification location + Allow song notification for users without gnome-python-extras + Pref to hide playback buttons + Pref to update MPD library on start + --info, --status displays current song info or MPD status + Pref to autoconnect on start, connect/disconnect buttons + Fetch album art in background (non-blocking) + Correctly retain previous library state when ending search + Add russian translation [Andrew Lukoshko] + Bug: Display path when filename is empty or http/ftp prefixes + Bug: Fix crash if changing connection w/o gnome-python-extras + Bug: Prevent --help, --toggle, etc. from happening twice if dbus is installed + Bug: Some shortcuts don't work with numslock enabled v0.7.1 - September 27, 2006 + Bug: Fix crash if dbus is not installed + Bug: Fix crash if song does not have some id3 info specified v0.7 - September 27, 2006 + Ability to search library by type (can be disabled in prefs) + Optional notification popup on song changes + Show larger image on left-click of cover art + Reduce (pygmy's) default polling time + Retain selection of browsed directories in library + Retain selection after drag-n-drop + Keep width of tooltip fixed + Show previous instance of app if user tries to open a second instance [Mike Massonnet patch] + Add --version, --help; print usage + --toggle argument to minimize to tray or show (requires D-Bus) + Add french translation [Floréal M] + Additional shortcuts (see docs) + Bug: repeat/shuffle isn't updated if mpd is restarted + Bug: Unable to delete multiple playlists at once + Bug: Crash when playing ogg streams [patch] v0.6 - September 18, 2006 + Add support for playlists (save, load, queue, delete) + Ability to use local image for album cover + Support for multimedia keys + Fetch cover art if an artist, but not album, is specified + Add Ctrl-U and Ctrl-Shift-U for updating library (see docs) + (Re-)display systray icon if tray is (re-)opened + Fix mpdclient3.py to return all playlist objects + Bug: Delete key doesn't remove songs from playlist v0.5.2 - September 15, 2006 + Correctly update interface after updating MPD library + Interface prefs: show album art, show volume, sticky, above + Behavior prefs: minimize to systray, stop playback on exit + Increase iter time if connection timesout (to make gui responsive) + Use gtk.STOCK_JUSTIFY_FILL instead of custom playlist icon + Try gnome-open/exo-open first for opening help, then fallback + Ability to set translations (see TRANSLATIONS file) + Use dbus to prevent multiple instances + More shortcuts (see documentation) + Minor bugfixes v0.5.1 - September 13, 2006 + Increment to mpdclient3 to prevent incompatibility issues + Bug: Running Sonata without systray causes crash v0.5 - September 12, 2006 + Added album art (and ability to choose from alternatives if the one automatically selected is incorrect, via right-click) + Integrate playlist and library into one app + Change song progress with mousewheel over progressbar + Change volume with mousewheel over volume button, systray icon + Change volume icon based on volume level + Added playback, etc, shortcuts + Added Replace menu and dir/file icons to library browser + Removed toolbar, cleaned up interface + Removed horizontal scrollbar + Don't update systray icon based on playback status + Moved config to freedesktop.org standard + Keep app width constant when (un)expanding + Keep currently playing song visible in list + Removed python-empy, glade + Bug: mpdclient2/app doesn't accept passwords (crash) + Bug: mdpclient2 - lsinfo skips the first file found after dirs + Bug: Cannot remove multiple rows from right-click + Bug: Crash if user has MPD connection but no read access + Bug: GTK+ treeview search does not work + Bug: Right-Click checkbox doesnt set value on start + Bug: Doesn't properly retain view when browsing playlist + Added documentation + Other bugfixes, tweaks �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/COPYING������������������������������������������������������������������������������0000664�0000000�0000000�00000104513�11255764730�0014215�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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 3 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, see <http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: <program> Copyright (C) <year> <name of author> This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/README�������������������������������������������������������������������������������0000664�0000000�0000000�00000003135�11255764730�0014040�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sonata, an elegant GTK+ client for the Music Player Daemon (MPD) Copyright 2006-2009 Scott Horowitz <stonecrest@gmail.com> Thanks to Andrew Conkling et al, for all their hard work on Pygmy! Sonata started as a fork of the Pygmy project and is licensed under the GPLv3. DEVELOPERS: Scott Horowitz <stonecrest@gmail.com> Tuukka Hastrup <Tuukka.Hastrup@iki.fi> Stephen Boyd <bebarino@gmail.com> REQUIREMENTS: (Required) PyGTK 2.12 or newer (Required) GTK 2.12 or newer (Required) python-mpd 0.2 or newer (Required) Python 2.5 or newer (Required) MPD 0.12 or newer, possibly on another computer (Optional) Gnome-python-extras for enhanced system tray (Optional) taglib and tagpy for editing metadata (Optional) dbus-python for mmkeys, single instance support (Building) GCC (Building) python-dev (on some distros) RUNNING: Sonata can be run from source without installation. Simply run 'python sonata.py' as your user. INSTALLATION: Run 'python setup.py install' as root. FEATURES: + Expanded and collapsed views, fullscreen album art mode + Automatic remote and local album art + Library browsing by folders, or by genre/artist/album + User-configurable columns + Automatic fetching of lyrics + Playlist and stream support + Support for editing song tags + Drag-and-drop to copy files + Popup notification + Library and playlist searching, filter as you type + Audioscrobbler (last.fm) 1.2 support + Multiple MPD profiles + Keyboard friendly + Support for multimedia keys + Commandline control + Available in 24 languages DOCUMENTATION/FAQ: http://sonata.berlios.de/documentation.html �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/TODO���������������������������������������������������������������������������������0000664�0000000�0000000�00000004641�11255764730�0013653�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������v1.6.3 disconnect/connect/reconnect ui weirdness sonata freezes with gail/accessibility enabled during new library searching translations - bold, commas for arabic (ahmad farghal email) #3992: enabling/disabling outputs #4370: number in playlist contextual statusbar depending on tab opened? (michael email) save to playlist.. default to selected files? pref? tag editing - support for composer, disc song queue (mpd-git will be bringing it back) search results - show albums, artists, genres that match right-click on tab bar (michael email) 0.15 has input support for last.fm radio v1.7 remove libegg? statusicon provides everything in gtk 2.16, not yet in pygtk albumartist tag for, e.g., VA albums; composer for classical plugin support - single instance, mmkeys (could remove dbus; faster on startup, less memory) - artwork - lyrics - system tray - audioscrobbler - popup notification - tag editing - #2419 dynamic playlist (patch) - #2454 Add as Next Track (patch) - #4007 stop after track ('single' command in 0.15) - #Zeroconf/avahi (patch) Future: support for new idle command (waiting on python-mpd) work with mpd's new "allow authenticated local users to add any local file to the playlist" - waiting on python-mpd to implement unix socket paths - dnd from a file manager (implemented and untested because of above) - new library browsing mode to open any file? remember: no tags and implications for remote mpd users. crop songs in current playlist? mpd statistics use GtkVolumeButton? better playlist support (mpd 0.13+ only): ability to view songs, reorder songs, remove songs, etc lazy loading of the treeview http://log.emmanuelebassi.net/documentation/lazy-loading/ http://blogs.gnome.org/jamesh/2006/03/31/re-lazy-loading/ clean-up extract duplicate code into functions, classes etc. document interfaces and implementation modularity: - limit module size to 1000 lines - limit dependencies between modules style: - rewrite unpythonic or complicated parts - fix reasonable pychecker/pylint warnings tests: - write automated tests - refactor code into parts that can be tested use the logging module: - add verbose and debug logging modes - log to file if not running on console exceptions: - add class restrictions to most "except:" clauses - add debug logging to most except clauses threading: - design, document, and implement a bug-free use of threads �����������������������������������������������������������������������������������������������sonata-1.6.2.1/TRANSLATORS��������������������������������������������������������������������������0000664�0000000�0000000�00000001200�11255764730�0014706�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sonata provides a quick and easy way of creating a translation for your language. If you find this software useful and are capable of adding a language that has not yet been translated, it would be greatly appreciated. 1. Download the latest messages.po file. Please use the SVN version, which can be found at: http://svn.berlios.de/svnroot/repos/sonata/trunk/po/messages.po 2. Use poedit (http://www.poedit.org/) to create translations for all of the strings. 3. Join the sonata-translators mailing list: https://lists.berlios.de/mailman/listinfo/sonata-translations 4. Submit your po file and keep it updated for future releases ;-) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11255764730�0014463�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/COPYING�����������������������������������������������������������������������0000664�0000000�0000000�00000043110�11255764730�0015515�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/Makefile����������������������������������������������������������������������0000664�0000000�0000000�00000001252�11255764730�0016123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright 2004 Joe Wreschnig. Released under the terms of the GNU GPL. PYTHON_DIR = /usr/include/python2.4/ CFLAGS += -fPIC -O2 `pkg-config --cflags gtk+-2.0 pygtk-2.0` -I$(PYTHON_DIR) LDFLAGS += `pkg-config --libs gtk+-2.0 pygtk-2.0` mmkeys.so: mmkeyspy.o mmkeys.o mmkeysmodule.o $(CC) $(LDFLAGS) -shared $^ -o $@ strip mmkeys.so DEFS=`pkg-config --variable=defsdir pygtk-2.0` mmkeyspy.c: mmkeys.defs mmkeys.override pygtk-codegen-2.0 --prefix mmkeys \ --register $(DEFS)/gdk-types.defs \ --register $(DEFS)/gtk-types.defs \ --override mmkeys.override \ mmkeys.defs > gen-tmp mv gen-tmp $@ clean: rm -f mmkeys.so *.o mmkeyspy.c distclean: clean rm -f *~ gen-tmp ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/README������������������������������������������������������������������������0000664�0000000�0000000�00000002404�11255764730�0015343�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Multimedia Key support as a PyGTK object ---------------------------------------- This module lets you access multimedia keys found on most new keyboards from Python; most important it grabs all input events so your program doesn't need to be in focus when the key is pressed (which is the usual behavior of the keys). You still need something like Acme or xmodmap to map the keys before using them. This code comes from the mmkeys object found in the Muine media player. Compiling: ---------- (Requires the PyGTK and Python development libraries.) $ make mmkeys.so Usage: ------ import mmkeys keys = mmkeys.Mmkeys() keys.connect("mm_prev", previous_cb) keys.connect("mm_next", next_cb) keys.connect("mm_playpause", playpause_cb) Make sure the reference to 'keys' sticks around; if it falls out of scope it can get GCd and cause segfaults. License: -------- Copyright (C) 2004 Lee Willis <lee@leewillis.co.uk> Borrowed heavily from code by Jan Arne Petersen <jpetersen@uni-bonn.de> Python bindings by Joe Wreschnig <piman@sacredchao.net> 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. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/mmkeys.c����������������������������������������������������������������������0000664�0000000�0000000�00000014333�11255764730�0016140�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 2004 Lee Willis <lee@leewillis.co.uk> * Borrowed heavily from code by Jan Arne Petersen <jpetersen@uni-bonn.de> * * 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. */ #include <stdio.h> #include "mmkeys.h" static void mmkeys_class_init (MmKeysClass *klass); static void mmkeys_init (MmKeys *object); static void mmkeys_finalize (GObject *object); static void grab_mmkey (int key_code, GdkWindow *root); static GdkFilterReturn filter_mmkeys (GdkXEvent *xevent, GdkEvent *event, gpointer data); enum { MM_PLAYPAUSE, MM_NEXT, MM_PREV, MM_STOP, LAST_SIGNAL }; static GObjectClass *parent_class; static guint signals[LAST_SIGNAL]; static GType type = 0; GType mmkeys_get_type (void) { if (!type) { static const GTypeInfo info = { sizeof (MmKeysClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) mmkeys_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (MmKeys), 0, (GInstanceInitFunc) mmkeys_init, }; type = g_type_register_static (G_TYPE_OBJECT, "MmKeys", &info, 0); } return type; } static void mmkeys_class_init (MmKeysClass *klass) { GObjectClass *object_class; parent_class = g_type_class_peek_parent (klass); object_class = (GObjectClass*) klass; object_class->finalize = mmkeys_finalize; signals[MM_PLAYPAUSE] = g_signal_new ("mm_playpause", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); signals[MM_PREV] = g_signal_new ("mm_prev", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); signals[MM_NEXT] = g_signal_new ("mm_next", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); signals[MM_STOP] = g_signal_new ("mm_stop", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); } static void mmkeys_finalize (GObject *object) { parent_class->finalize (G_OBJECT(object)); } #define N_KEYCODES 5 static void mmkeys_init (MmKeys *object) { int keycodes[N_KEYCODES]; GdkDisplay *display; GdkScreen *screen; GdkWindow *root; guint i, j; display = gdk_display_get_default (); keycodes[0] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev); keycodes[1] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioNext); keycodes[2] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPlay); keycodes[3] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPause); keycodes[4] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioStop); for (i = 0; i < gdk_display_get_n_screens (display); i++) { screen = gdk_display_get_screen (display, i); if (screen != NULL) { root = gdk_screen_get_root_window (screen); for (j = 0; j < N_KEYCODES; j++) { if (keycodes[j] > 0) grab_mmkey (keycodes[j], root); } gdk_window_add_filter (root, filter_mmkeys, object); } } } MmKeys * mmkeys_new (void) { return MMKEYS (g_object_new (TYPE_MMKEYS, NULL)); } static void grab_mmkey (int key_code, GdkWindow *root) { gdk_error_trap_push (); XGrabKey (GDK_DISPLAY (), key_code, 0, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); XGrabKey (GDK_DISPLAY (), key_code, Mod2Mask, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); XGrabKey (GDK_DISPLAY (), key_code, Mod5Mask, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); XGrabKey (GDK_DISPLAY (), key_code, LockMask, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); XGrabKey (GDK_DISPLAY (), key_code, Mod2Mask | Mod5Mask, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); XGrabKey (GDK_DISPLAY (), key_code, Mod2Mask | LockMask, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); XGrabKey (GDK_DISPLAY (), key_code, Mod5Mask | LockMask, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); XGrabKey (GDK_DISPLAY (), key_code, Mod2Mask | Mod5Mask | LockMask, GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); gdk_flush (); if (gdk_error_trap_pop ()) { fprintf (stderr, "Error grabbing key %d, %p\n", key_code, root); } } static GdkFilterReturn filter_mmkeys (GdkXEvent *xevent, GdkEvent *event, gpointer data) { XEvent *xev; XKeyEvent *key; xev = (XEvent *) xevent; if (xev->type != KeyPress) { return GDK_FILTER_CONTINUE; } key = (XKeyEvent *) xevent; if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPlay) == key->keycode) { g_signal_emit (data, signals[MM_PLAYPAUSE], 0, 0); return GDK_FILTER_REMOVE; } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPause) == key->keycode) { g_signal_emit (data, signals[MM_PLAYPAUSE], 0, 0); return GDK_FILTER_REMOVE; } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev) == key->keycode) { g_signal_emit (data, signals[MM_PREV], 0, 0); return GDK_FILTER_REMOVE; } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioNext) == key->keycode) { g_signal_emit (data, signals[MM_NEXT], 0, 0); return GDK_FILTER_REMOVE; } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioStop) == key->keycode) { g_signal_emit (data, signals[MM_STOP], 0, 0); return GDK_FILTER_REMOVE; } else { return GDK_FILTER_CONTINUE; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/mmkeys.defs�������������������������������������������������������������������0000664�0000000�0000000�00000000602�11255764730�0016631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������; Copyright 2004 Joe Wreschnig. Released under the terms of the GNU GPL. (define-object MmKeys (in-module "MM") (parent "GtkPlug") (c-name "MmKeys") (gtype-id "TYPE_MMKEYS") ) (define-function mmkeys_get_type (c-name "mmkeys_get_type") (return-type "GType") ) (define-function mmkeys_new (c-name "mmkeys_new") (is-constructor-of "MmKeys") (return-type "MmKeys*") ) ������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/mmkeys.h����������������������������������������������������������������������0000664�0000000�0000000�00000003406�11255764730�0016144�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 2004 Lee Willis <lee@leewillis.co.uk> * Borrowed heavily from code by Jan Arne Petersen <jpetersen@uni-bonn.de> * * 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. */ #include <X11/Xlib.h> #include <X11/XF86keysym.h> #include <gdk/gdk.h> #include <gdk/gdkx.h> #include <stdio.h> #include <gtk/gtktogglebutton.h> #ifndef __MM_KEYS_H #define __MM_KEYS_H #define TYPE_MMKEYS (mmkeys_get_type ()) #define MMKEYS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MMKEYS, MmKeys)) #define MMKEYS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MMKEYS, MmKeysClass)) #define IS_MMKEYS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MMKEYS)) #define IS_MMKEYS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MMKEYS)) #define MMKEYS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MMKEYS, MmKeysClass)) typedef struct _MmKeys MmKeys; typedef struct _MmKeysClass MmKeysClass; struct _MmKeys { GObject parent; }; struct _MmKeysClass { GObjectClass parent_class; }; GType mmkeys_get_type (void); MmKeys *mmkeys_new (void); #endif /* __MM_KEYS_H */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/mmkeys.override���������������������������������������������������������������0000664�0000000�0000000�00000000361�11255764730�0017531�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright 2004 Joe Wreschnig. Released under the terms of the GNU GPL. */ %% headers #include <Python.h> #include "pygobject.h" #include "mmkeys.h" %% modulename mmkeys %% import gtk.Plug as PyGtkPlug_Type %% ignore-glob *_get_type %% �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/mmkeys/mmkeysmodule.c����������������������������������������������������������������0000664�0000000�0000000�00000000713�11255764730�0017343�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright 2004 Joe Wreschnig. Released under the terms of the GNU GPL. */ #include <pygobject.h> void mmkeys_register_classes(PyObject *d); extern PyMethodDef mmkeys_functions[]; DL_EXPORT(void) initmmkeys(void) { PyObject *m, *d; init_pygobject(); m = Py_InitModule("mmkeys", mmkeys_functions); d = PyModule_GetDict(m); mmkeys_register_classes(d); if (PyErr_Occurred()) Py_FatalError("can't initialise module mmkeys"); } �����������������������������������������������������sonata-1.6.2.1/mmkeys/mmkeyspy.c��������������������������������������������������������������������0000664�0000000�0000000�00000006646�11255764730�0016521�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -- THIS FILE IS GENERATED - DO NOT EDIT *//* -*- Mode: C; c-basic-offset: 4 -*- */ #include <Python.h> #line 4 "mmkeys.override" #include <Python.h> #include "pygobject.h" #include "mmkeys.h" #line 13 "mmkeys.c" /* ---------- types from other modules ---------- */ static PyTypeObject *_PyGtkPlug_Type; #define PyGtkPlug_Type (*_PyGtkPlug_Type) /* ---------- forward type declarations ---------- */ PyTypeObject PyMmKeys_Type; #line 24 "mmkeys.c" /* ----------- MmKeys ----------- */ static int _wrap_mmkeys_new(PyGObject *self, PyObject *args, PyObject *kwargs) { static char* kwlist[] = { NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":mmkeys.MmKeys.__init__", kwlist)) return -1; pygobject_constructv(self, 0, NULL); if (!self->obj) { PyErr_SetString(PyExc_RuntimeError, "could not create %(typename)s object"); return -1; } return 0; } PyTypeObject PyMmKeys_Type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "mmkeys.MmKeys", /* tp_name */ sizeof(PyGObject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)0, /* tp_dealloc */ (printfunc)0, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ (cmpfunc)0, /* tp_compare */ (reprfunc)0, /* tp_repr */ (PyNumberMethods*)0, /* tp_as_number */ (PySequenceMethods*)0, /* tp_as_sequence */ (PyMappingMethods*)0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)0, /* tp_str */ (getattrofunc)0, /* tp_getattro */ (setattrofunc)0, /* tp_setattro */ (PyBufferProcs*)0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ NULL, /* Documentation string */ (traverseproc)0, /* tp_traverse */ (inquiry)0, /* tp_clear */ (richcmpfunc)0, /* tp_richcompare */ offsetof(PyGObject, weakreflist), /* tp_weaklistoffset */ (getiterfunc)0, /* tp_iter */ (iternextfunc)0, /* tp_iternext */ NULL, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ NULL, /* tp_base */ NULL, /* tp_dict */ (descrgetfunc)0, /* tp_descr_get */ (descrsetfunc)0, /* tp_descr_set */ offsetof(PyGObject, inst_dict), /* tp_dictoffset */ (initproc)_wrap_mmkeys_new, /* tp_init */ (allocfunc)0, /* tp_alloc */ (newfunc)0, /* tp_new */ (freefunc)0, /* tp_free */ (inquiry)0 /* tp_is_gc */ }; /* ----------- functions ----------- */ PyMethodDef mmkeys_functions[] = { { NULL, NULL, 0 } }; /* initialise stuff extension classes */ void mmkeys_register_classes(PyObject *d) { PyObject *module; if ((module = PyImport_ImportModule("gtk")) != NULL) { PyObject *moddict = PyModule_GetDict(module); _PyGtkPlug_Type = (PyTypeObject *)PyDict_GetItemString(moddict, "Plug"); if (_PyGtkPlug_Type == NULL) { PyErr_SetString(PyExc_ImportError, "cannot import name Plug from gtk"); return; } } else { PyErr_SetString(PyExc_ImportError, "could not import gtk"); return; } #line 124 "mmkeys.c" pygobject_register_class(d, "MmKeys", TYPE_MMKEYS, &PyMmKeys_Type, Py_BuildValue("(O)", &PyGtkPlug_Type)); pyg_set_object_has_new_constructor(TYPE_MMKEYS); } ������������������������������������������������������������������������������������������sonata-1.6.2.1/po/����������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11255764730�0013574�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/POTFILES.in�����������������������������������������������������������������������0000664�0000000�0000000�00000000773�11255764730�0015360�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������./setup.py ./sonata.py ./sonata/about.py ./sonata/artwork.py ./sonata/audioscrobbler.py ./sonata/breadcrumbs.py ./sonata/cli.py ./sonata/config.py ./sonata/consts.py ./sonata/current.py ./sonata/dbus_plugin.py ./sonata/img.py ./sonata/info.py ./sonata/library.py ./sonata/main.py ./sonata/misc.py ./sonata/mpdhelper.py ./sonata/playlists.py ./sonata/pluginsystem.py ./sonata/preferences.py ./sonata/scrobbler.py ./sonata/streams.py ./sonata/svnversion.py ./sonata/tagedit.py ./sonata/tray.py ./sonata/ui.py �����sonata-1.6.2.1/po/ar.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000127576�11255764730�0014560�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:00-0600\n" "PO-Revision-Date: 2009-03-23 07:09+0200\n" "Last-Translator: Ahmad Farghal <ahmad.farghal@gmail.com>\n" "Language-Team: Arabic <ar@arabic.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : n>=3 && n<=10 ? 2 : 3\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "حول سوناتا" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "تفضيلات" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "وضع غلاف الألبوم بكامل الشاشة" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "انتقل للسان من 1 لـ5" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "اتصل بـMPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "افصل من MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "رتّب قائمة التشغيل الحالية عشوائيّا" #: .././sonata/about.py:59 msgid "Expand player" msgstr "وسّع المشغّل" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "ارجع للسان السابق" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "انتقل للسان التالي" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "إطوِ المشّغل" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "ابحث في المكتبة" #: .././sonata/about.py:64 msgid "Quit" msgstr "أنهِ" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "حدّث المكتبة بأكملها" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "أظهر قائمة منبثقة" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "قلّص إلى مساحة التبليغ (إذا كان ممكنا)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "المقطوعة السابقة" #: .././sonata/about.py:70 msgid "Next track" msgstr "المقطوعة التالية" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "شغّل/أوقف مؤقتا" #: .././sonata/about.py:72 msgid "Stop" msgstr "أوقف" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "أخفض الصوت" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "زد الصوت" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "شغّل الأغنية المنتقاة" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "أزِل الأغاني المنتقاة" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "ركّز على الأغنية التي يتم تشغيلها" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "حرّر وسوم الاغنية المنتقاة" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "احفظ إلى قائمة تشغيل جديدة" #: .././sonata/about.py:81 msgid "Clear list" msgstr "امسح القائمة" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "رتّب القائمة عشوائيّا" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "أضِف الأغاني المنتقاة أو أدخل دليلا" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "اذهب إلى الدليل الأب" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "أضِف العناصر المنتقاة" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "استبدِل بالعناصر المنتقاة" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "أضِف العناصر المنتقاة وشغّلها" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "استبدِل بالعناصر المنتقاة وشغّلها" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "حدّث العناصر أو المسارات المنتقاة" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "أضِف قوائم التشغيل المنتقاة" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "أزِل قوائم التشغيل المنتقاة" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "استبدِل بقوائم التشغيل المنتقاة" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "أضِف قوائم التشغيل المنتقاة وشغّلها" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "استبدِل بقوائم التشغيل المنتقاة وشغلها" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "أضِف الدفوق المنتقاة" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "أزِل الدفوق المنتقاة" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "استبدِل بالدفوق المنتقاة" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "أضِف الدفوق المنتقاة وشغّلها" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "استبدل بالدفوق المنتقاة وشغّلها" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "حرّر وسوم الأغنية المُشَغّلة" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "الاختصارات العامة" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "اختصارات التشغيل" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "اختصارات التشغيل الآن" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "اختصارات المكتبة" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "اختصارات قوائم التشغيل" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "اختصارات الدفوق" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "اختصارات المعلومات" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "الاختصارات" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "عميل موسيقى أنيق لـMPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "الا_ختصارات" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "غير قادر على إطلاق متصفح مناسب." #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "أطلق المتصفح" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "خياري الإبدال والانبثاق يتطلبان D-Bus. تم الإجهاض." #: .././sonata/cli.py:97 msgid "Version" msgstr "الإصدار" #: .././sonata/cli.py:98 msgid "Website" msgstr "موقع وب" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "الاستخدام: sonata [الخيار]... [الأمر]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "خيارات" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "يظهر شاشة المساعدة هذه ويخرج" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "يظهر نافذة منبثقة بالأغنية (يتطلب D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "يظهر أو يخفي التطبيق" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "في مساحة التبليغ (يتطلب D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "لا تفتح التطبيق إذا فشلت أوامر D-Bus" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "يظهر معلومات الإصدار ويخرج" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "يبدأ التطبيق مخفيّا (يتطلب وجود مساحة تبليغ للنظام)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "يبدأ التطبيق ظاهرا (يتطلب وجود مساحة تبليغ للنظام)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "يبدأ بضبط [رقم]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "الأوامر" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "يشغّل أغنية في قائمة التشغيل" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "يوقف تشغيل الاغنية الحالية مؤقتا" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "يوقف تشغيل الاغنية الحالية" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "يشغّل الأغنية التالية في قائمة التشغيل" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "يشغّل الأغنية السابقة في قائمة التشغيل" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "يشغّل أو يوقف التشغيل مؤقتا؛ يبدأ التشغيل إذا كان متوقفا" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "مكّن أو عطّل وضع التكرار" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "مكّن أو عطّل الوضع العشوائي" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "يظهر معلومات الأغنية الحالية" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "يظهر حالة MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "بدء سوناتا بالضبط %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d ليس رقم ضبط متوفر." #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "يجب أن يكون رقم الضبط بين 1 و %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "بايثون غير قادر على قراءة %s كرقم." #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "الضبط المبدئي" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr "أداء" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "من" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "غير قادر على الاتصال بـMPD.\n" "رجاءً تأكد من تفضيلات سوناتا أو متغيري النظام MPD_HOST و MPD_PORT." #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "الاسم" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "الفنان" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "الألبوم" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "السنة" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "المقطوعة" #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "النوع" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "الملف" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "الوقت" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "معدّل البتّات" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD متوقف" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "الحالة" #: .././sonata/cli.py:228 msgid "Playing" msgstr "يشغل" #: .././sonata/cli.py:230 msgid "Paused" msgstr "متوقف مؤقتا" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "متوقف" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "التكرار" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "مُمَكّن" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "مُعَطّل" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "عشوائيًا" #: .././sonata/cli.py:241 msgid "Volume" msgstr "شدّة الصوت" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "الإبهات المتداخل" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "ثانية واحدة" msgstr[1] "ثانيتان" msgstr[2] "ثوان" msgstr[3] "ثانية" #: .././sonata/current.py:64 msgid "Filter" msgstr "رشّح" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "فشل سوناتا في الاتصال بناقل جلسة D-Bus: غير قادر على تحديد عنوان ناقل الرسائل (للمساعدة، جرّب 'man dbus-launch' و 'man dbus-daemon')" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "فشل تنفيذ الأوامر البعيدة." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "سيتم بدء سوناتا..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "هل أنت متأكد أن سوناتا يعمل؟" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "سوناتا يعمل مسبقا، سيتم إظهارها..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "فشل تنفيذ الأمر البعيد." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "معلومات عن الأغنية" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "افتح صفحة الفنان في ويكيبيديا" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "افتح صفحة الألبوم في ويكيبيديا" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "أظهر أو أخفِ الوسوم الإضافية" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "حرّر وسوم الأغنية" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "الكلمات" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "ابحث في Lyricwiki.org عن الكلمات" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "حرّر الكلمات على Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "معلومات عن الألبوم" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "المزيد" #: .././sonata/info.py:215 msgid "hide" msgstr "أخفِ" #: .././sonata/info.py:281 msgid "edit tags" msgstr "حرّر الوسوم" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "معلومات الألبوم غير موجودة" #: .././sonata/info.py:311 msgid "Album name not set." msgstr "لم يتم تعيين اسم للألبوم" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI غير موجود، سيتم تعطيل جلب الكلمات." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "لم يتم تعيين اسم الفنان أو الأغنية." #: .././sonata/info.py:371 msgid "search" msgstr "ابحث" #: .././sonata/info.py:372 msgid "edit" msgstr "حرّر" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "الكلمات غير موجودة" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "يجلب الكلمات..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "عاجز عن الاتصال بـLyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "فشل جلب الكلمات" #: .././sonata/library.py:47 msgid "Untagged" msgstr "غير موسوم" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "فنانون متعددون" #: .././sonata/library.py:49 msgid "Filename" msgstr "اسم الملف" #: .././sonata/library.py:49 msgid "Everything" msgstr "الكل" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "نظام الملفات" #: .././sonata/library.py:53 msgid "Artists" msgstr "الفنانون" #: .././sonata/library.py:54 msgid "Albums" msgstr "الألبومات" #: .././sonata/library.py:55 msgid "Genres" msgstr "الأنواع" #: .././sonata/library.py:84 msgid "Search terms" msgstr "مفردات البحث" #: .././sonata/library.py:90 msgid "End Search" msgstr "أنهِ البحث" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "مشهد تصفح المكتبة" #: .././sonata/library.py:96 msgid "Search" msgstr "ابحث" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "أغنية واحدة" msgstr[1] "أغنيتان" msgstr[2] "أغاني" msgstr[3] "أغنية" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "دقيقة واحدة" msgstr[1] "دقيقتان" msgstr[2] "دقائق" msgstr[3] "دقيقة" #: .././sonata/library.py:849 msgid "Song" msgstr "أغنية" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "المسار" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "التشغيل الآن" #: .././sonata/main.py:103 msgid "Library" msgstr "مكتبة" #: .././sonata/main.py:104 msgid "Playlists" msgstr "قوائم تشغيل" #: .././sonata/main.py:105 msgid "Streams" msgstr "دفوق" #: .././sonata/main.py:106 msgid "Info" msgstr "معلومات" #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "طول مدة الأغنية" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_رتّب القائمة" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "احف_ظ القائمة إلى" #: .././sonata/main.py:236 msgid "_Connection" msgstr "الات_صال" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "ش_غّل بعد" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "_حدّث" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "استخدم صورة _بعيدة..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "استخدم صورة م_حلية..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "وضع _كامل الشاشة" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "استَعِدْ الصورة الأصلية" #: .././sonata/main.py:243 msgid "_Play" msgstr "_شغّل" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "أو_قِف مؤقتًا" #: .././sonata/main.py:245 msgid "_Stop" msgstr "أو_قِف" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "ال_سابقة" #: .././sonata/main.py:247 msgid "_Next" msgstr "ال_تالية" #: .././sonata/main.py:248 msgid "_Quit" msgstr "أ_نهِ" #: .././sonata/main.py:249 msgid "_Remove" msgstr "أ_زِل" #: .././sonata/main.py:250 msgid "_Clear" msgstr "ام_سح" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "المكتبة بأ_كملها" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "العناصر المنت_قاة" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "تف_ضيلات..." #: .././sonata/main.py:254 msgid "_About..." msgstr "ح_ول..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_حرّر الوسوم..." #: .././sonata/main.py:256 msgid "_Add" msgstr "أ_ضف" #: .././sonata/main.py:257 msgid "_Replace" msgstr "استب_دل" #: .././sonata/main.py:258 msgid "Add" msgstr "أضف" #: .././sonata/main.py:259 msgid "Replace" msgstr "استبدل" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "ا_حذف..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "اخلط" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "أ_ظهر سوناتا" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_كرّر" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "عشوا_ئي" #: .././sonata/main.py:428 msgid "By Artist" msgstr "حسب الفنان" #: .././sonata/main.py:429 msgid "By Album" msgstr "حسب الألبوم" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "حسب اسم الأغنية" #: .././sonata/main.py:431 msgid "By File Name" msgstr "حسب اسم الملف" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "حسب الدليل واسم الملف" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "اعكس ترتيب القائمة" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "_جديد..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_حرّر..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_غيّر الاسم..." #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "قائمة تشغيل" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "أنقر للتوسعة" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "أنقر للطي" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "غير متّصل" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "غير مصرّح بالقراءة" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "صورة الغلاف" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "الضبط" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "مضيف MPD / كلمة السّر" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "افصل" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "الرقم" #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "السنة" #: .././sonata/main.py:1192 msgid "Stream" msgstr "دفق" #: .././sonata/main.py:1193 msgid "Len" msgstr "Len" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "مجهول" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "يوم واحد" msgstr[1] "يومان" msgstr[2] "أيام" msgstr[3] "يوما" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "ساعة واحدة" msgstr[1] "ساعتان" msgstr[2] "ساعات" msgstr[3] "ساعة" #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr "و" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(تحديث mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "بحث عن الكلمات" #: .././sonata/main.py:2117 msgid "_Search" msgstr "اب_حث" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "اسم الفنان" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "اسم الأغنية" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "افتح صورة" #: .././sonata/main.py:2379 msgid "Images" msgstr "الصور" #: .././sonata/main.py:2383 msgid "All files" msgstr "كل الملفّات" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "اختر صورة الغلاف" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "ا_ختر" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "حرّر مفردات البحث" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "لم يتم إيجاد اسم الفنان أو الأغنية." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "لم يتم إيجاد صورة غلاف." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "حذف قائمة التشغيل المنتقاة؟" msgstr[1] "حذف قائمتي التشغيل المنتقاتان؟" msgstr[2] "حذف قوائم التشغيل المنتقاة؟" msgstr[3] "حذف قوائم التشغيل المنتقاة؟" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "احذف قائمة التشغيل" msgstr[1] "احذف قائمتي التشغيل" msgstr[2] "احذف قوائم التشغيل" msgstr[3] "احذف قوائم التشغيل" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "حذف الدفق المنتقى؟" msgstr[1] "حذف الدفقين المنتقيين؟" msgstr[2] "حذف الدفوق المنتقاة؟" msgstr[3] "حذف الدفوق المنتقاة؟" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "احذف الدفق" msgstr[1] "احذف الدفقين" msgstr[2] "احذف الدفوق" msgstr[3] "احذف الدفوق" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "يجب أن تحدد دليل موسيقى صالح حتى تتمكن من حفظ الكلمات للدليل الموجود فيه ملف الموسيقى." #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "التحقق من دليل الموسيقى" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "يجب أن تحدد دليل موسيقى صالح حتى تتمكن من حفظ غلاف الألبوم للدليل الموجود فيه ملف الموسيقى." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "ألبوم واحد" msgstr[1] "ألبومان" msgstr[2] "ألبومات" msgstr[3] "ألبوما" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "فنان واحد" msgstr[1] "فنانان" msgstr[2] "فنانين" msgstr[3] "فنانا" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "يوم واحد من النعيم" msgstr[1] "يومان من النعيم" msgstr[2] "أيام من النعيم" msgstr[3] "يوما من النعيم" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "ساعة واحدة من النعيم" msgstr[1] "ساعتان من النعيم" msgstr[2] "ساعات من النعيم" msgstr[3] "ساعة من النعيم" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "احفظ قائمة التشغيل" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "هل ترغب في استبدال قائمة التشغيل الموجودة أم إلحاق هذه الأغاني بها؟" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "قائمة تشغيل موجودة" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "استبدل قائمة التشغيل" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "ألحق الأغاني" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "توجد قائمة تشغيل بهذا الاسم مسبقا. هل ترغب في استبدالها؟" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "اسم قائمة التشغيل" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "غيّر اسم قائمة التشغيل" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "مساحة تبليغ النظام" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "أعلى اليسار" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "أعلي اليمين" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "أدنى اليسار" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "أدنى اليمين" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "مركز الشاشة" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "الاتصال بـMPD" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "الا_سم" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "الم_ضيف" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "المنف_ذ" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_دليل الموسيقى" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "انتق دليل موسيقى" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "كلمة ال_سّر" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "أترك هذا الحقل فارغًا إذا لم تكن هناك كلمة سر" #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "اتّ_صل آليّا عند البدء" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "باستخدام MPD_HOST/PORT" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "خيارات إضافية" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "أبل_غ عن الموسيقى (لاست . إف إم)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "اسم المست_خدم:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "كلمة ال_سّر:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "أظهر _تنبيها عند تغير الأغنية" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "مدة الإبهات" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "مدة الإب_هات" #: .././sonata/preferences.py:213 msgid "sec" msgstr "ث" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "الإبهات المتدا_خل" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "العرض" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "_غلاف الألبوم" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "قياسي" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "مزخرف" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "شكل الغلاف:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "محليا فقط" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "محليا وعبر إنترنت" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "أماكن البحث:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "مسار_الأغنية" #: .././sonata/preferences.py:269 msgid "custom" msgstr "مخصص" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "احفظ الغلاف في:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "أ_زرار التشغيل والصوت" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "شريط التق_دم" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "شريط ال_حالة" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "_كلمات الأغنية" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "احفظ الكلمات في:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "أيقونة مساحة تبلي_غ النظام" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "سلوك النوافذ" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "أ_ظهر النافذة في كل مساحات العمل" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "أ_بقِ النافذة فوق النوافذ الأخرى" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "أ_خف عنوان النافذة" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_قلّص لمساحة تبليغ النظام عند الإغلاق" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "إذا تم تمكين هذا الخيار، فسيقوم سوناتا بتقليص نفسه إلى مساحة تبليغ النظام عند إغلاقه. لاحظ أنه من المستحيل حاليا التعرف على ما إن كان نظامك به مساحة تبليغ أم لا، قلا تمكّن هذا الخيار إلا إذا كان نظامك فيه مساحة تبليغ." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "خيارات متنوعة" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "_حدّث مكتبة MPD عند البدء" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "إذا تم تمكين هذا الخيار، فسيقوم سوناتا بتحديث مكتبة MPD عند بدء تشغيله." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "أو_قف التشغيل عند الخروج" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "يستطيع MPD تشغيل الموسيقى حتى لو لم يكن هناك عميل متصل به. إذا تم تمكين هذا الخيار، فسيسلك سوناتا مسلك مشغلات الموسيقى التقليدية بأن يقوم بإيقاف تشغيل الأغاني عن الخروج." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "أكتب ملف _حالة:" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "إذا تم تمكين هذا الخيار، فسينشئ سوناتا ملفّا مشابه لـxmms-infopipe يحتوي على معلومات عن الأغنية الحالية. تدعم الثير من التطبيقات ملف xmms-infopipe (مثل عملاء IRC وبرامج المراسلة الفورية...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "تهيئة اسم الاغنية" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "قائمة التش_غيل الحالية:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "ال_مكتبة:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "عنوان ال_نافذة:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "_سطر الأغنية الحالية الأول:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "س_طر الأغنية الحالية الثاني:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "الخيارات المتوفرة" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "اسم الفنان" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "اسم الألبوم" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "اسم المقطوعة" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "رقم المقطوعة" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "رقم القرص" #: .././sonata/preferences.py:433 msgid "File path" msgstr "مسار الملف" #: .././sonata/preferences.py:434 msgid "File name" msgstr "اسم الملف" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "اسم الدفق" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "مدة الأغنية" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "الوقت المنقضي (عنوان النافذة فقط)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "لن يتم عرض المعلومات إلا عندما تكون كل الوسوم بين القوسين مستوفاة" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "ينشئ عواميد في قائمة التشغيل الحالية" #: .././sonata/preferences.py:473 msgid "_About" msgstr "ح_ول" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "ا_ضبط..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "مُحَمَّل" #: .././sonata/preferences.py:521 msgid "Description" msgstr "الوصف" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "السلوك" #: .././sonata/preferences.py:535 msgid "Format" msgstr "التهيئة" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "ضبط جديد" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "غلاف ألبوم مخصّص" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "اسم ملف الغلاف" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "حرّر الدفق" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "دفق جديد" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "عنوان الدفق" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "يوجد دفق بهذا الاسم مسبقا. هل ترغب في استبداله؟" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Taglib و/أو tagpy غير موجودان، سيتم تعطيل دعم تحرير الوسوم." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "حرّر الوسوم" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "نسخة Tagpy الموجودة أقدم من 0.91. رجاءً حدّث نسختك حتى تستطيع تحرير الوسوم." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "المسار" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "غير موجود. رجاءً حدد دليل موسيقى صالح في التفضيلات." #: .././sonata/tagedit.py:99 msgid "File " msgstr "الملف" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " غير موجود. رجاءً حدّد دليل موسيقى صالح في التفضيلات." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "لا توجد ملفات موسيقى يمكن تحرير وسومها." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "التعليق" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "احفظ ال_كل" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "زيادة الرقم بدءا من 1 لكل ملف يعقب هذا الملف." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "طبّق على كل ملفات الموسيقى المنتقاة." #: .././sonata/tagedit.py:260 msgid "of" msgstr "من" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "غير قادر على حفظ الوسم لملف الموسيقى." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "أخف مسار الملف" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "أظهر مسار الملف" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "خيار الانبثاق يتطلب D-Bus. تم الإجهاض." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_حدّث" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "موقع وِب: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "مكّن أوديوسكروبلر" #~ msgid "Enable Crossfade" #~ msgstr "مكّن الإبهات المتداخل" #~ msgid "Enable album art" #~ msgstr "أظهر غلاف الألبوم" #~ msgid "Enable lyrics" #~ msgstr "مكّن الكلمات" #~ msgid "Enable system tray icon" #~ msgstr "مكّن أيقونة مساحة التبليغ" #~ msgid "_Display" #~ msgstr "ال_عرض" #~ msgid "_Extras" #~ msgstr "خيارات إ_ضافية" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "غير قادر على إيجاد PyGTK+ 2.10 أو gnome-python-extras. تم تعطيل دعم مساحة " #~ "تبليغ النظام." #~ msgid "Reset to Default" #~ msgstr "صفّر إلى المبدئي" #~ msgid "_New Playlist..." #~ msgstr "قائمة تشغيل _جديدة..." #~ msgid "Notification" #~ msgstr "التنبيه" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 أو python-elementtree غير موجودان، سيتم تعطيل دعم أوديوسكروبلر." #~ msgid "Audioscrobbler Verification" #~ msgstr "التحقق من أوديوسكروبلر" #~ msgid "Update library for selected item(s)" #~ msgstr "حدّث المكتبة بالنسبة للعناصر المنتقاة" #~ msgid "_Shuffle" #~ msgstr "ا_خلِط" #~ msgid "Toggle shuffle mode" #~ msgstr "مكّن أو عطّل وضع الخلط" ����������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/be@latin.po�����������������������������������������������������������������������0000664�0000000�0000000�00000121136�11255764730�0015656�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Biełaruski pierakład Sonata. # Copyright (C) 2007 Ihar Hrachyshka # This file is distributed under the same license as the sonata package. # Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2007, 2008. # msgid "" msgstr "" "Project-Id-Version: sonata 1.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:00-0600\n" "PO-Revision-Date: 2008-03-22 11:38+0200\n" "Last-Translator: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>\n" "Language-Team: Belarusian (Latin script) <translation-team-be-latin@lists." "sourceforge.net>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Ab Sonacie" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Nałady" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Pieraklučysia na 1-5. kartku" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Spałučy z MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Adłučy ad MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Pieratasuj dziejny śpis" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Razharni player" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Na papiaredniuju kartku" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Na nastupnuju kartku" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Zharni player" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Šukaj u biblijatecy" #: .././sonata/about.py:64 msgid "Quit" msgstr "Vyjdzi" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Aktualizuj usiu biblijateku" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Pakažy vypłyŭnaje menu" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimalizuj u systemny tray (kali ŭklučana)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Papiaredniaja pieśnia" #: .././sonata/about.py:70 msgid "Next track" msgstr "Nastupnaja pieśnia" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Hraj/Paŭza" #: .././sonata/about.py:72 msgid "Stop" msgstr "Spyni" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Pamienš hučnaść" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Pavialič hučnaść" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Hraj zaznačanuju pieśniu" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Vydal zaznačanyja pieśni" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Adcentruj pieśniu, jakaja ciapier hrajecca" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Redahuj tagi dla zaznačanaj pieśni" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Zapišy ŭ novy śpis" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Ačyść śpis" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Pieratasuj śpis" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Dadaj zaznačanyja pieśni ci ŭvajdzi ŭ kataloh" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Pierajdzi ŭ baćkoŭski kataloh" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Dadaj zaznačanyja pieśni" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Zamiani zaznačanymi pieśniami" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Dadaj zaznačanyja pieśni j pačni hrać" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Zamiani zaznačanymi pieśniami j pačni hrać" #: .././sonata/about.py:91 #, fuzzy msgid "Update selected item(s)/path(s)" msgstr "Dadaj zaznačanyja pieśni" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Dadaj zaznačanyja śpisy" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Vydal zaznačanyja śpisy" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Zamiani zaznačanymi śpisami" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Dadaj zaznačanyja śpisy j pačni hrać" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Zamiani zaznačanymi śpisami j pačni hrać" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Dadaj zaznačanyja płyni" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Vydal zaznačanyja płyni" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Zamiani zaznačanymi albomami" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Dadaj zaznačanyja płyni j pačni hrać" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Zamiani zaznačanymi płyniami j pačni hrać" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Redahuj tagi dla pieśni, jakaja ciapier hraje" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Asnoŭnyja skaroty" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Skaroty hrańnia" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Dziejnyja skaroty" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Skaroty biblijateki" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Skaroty śpisu" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Skaroty płyni" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Daviednik skarotaŭ" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Skaroty" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Elehantny muzyčny klijent dla MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Skaroty" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Niemahčyma ŭklučyć prydatnaha hartača." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Uklučy hartača" #: .././sonata/cli.py:81 #, fuzzy msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Arhument pieraklučeńnia vymahaje D-Bus. Abryŭ." #: .././sonata/cli.py:97 #, fuzzy msgid "Version" msgstr "Versija: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 #, fuzzy msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Užyćcio: sonata [OPCYJA]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Opcyi" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Pakažy hetuju daviedku i vyjdzi" #: .././sonata/cli.py:107 #, fuzzy msgid "Popup song notification (requires D-Bus)" msgstr "Vypłyŭnoje infarmavańnie ab piśni, jakaja hraje (vymahaje DBus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Źmianiaje minimalizavanaść aplikacyi" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "u tray i bačnaść (vymahaje D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Pakažy źviestki ab versii dy vyjdzi" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Uklučy aplikacyju schavanaj (vymahaje systray)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Uklučy aplikacyju bačnaj (vymahaje systray)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Uklučy dla profilu [NUM]" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Kamentar" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Hraj pieśniu sa śpisu" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Prypyni pieśniu, jakaja ciapier hrajecca" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Spyni pieśniu, jakaja ciapier hrajecca" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Hraj nastupnuju pieśniu sa śpisu" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Hraj papiaredniuju pieśniu sa śpisu" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Hraj, kali prypynieny; prypyni, kali hraješ" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Źmiani režym paŭtoru" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Źmiani režym vypadkovaści" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Pakažy źviestki ab pieśni, jakaja ciapier hrajecca" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Pakažy status MPD" #: .././sonata/cli.py:134 #, fuzzy, python-format msgid "Starting Sonata with profile %s..." msgstr "Uklučeńnie Sonaty dla profilu" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, fuzzy, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Niapravilny numar profilu. Numar profilu musić być ad 1 da" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Zmoŭčany profil" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "ad" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "z" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Niemahčyma spałučycca z MPD.\n" "Pravier nałady Sonaty ci źmiennyja asiarodździa MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Nazva" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Vykanaŭca" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Albom" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Data" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Pieśnia" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Styl" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Fajł" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Čas" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Častata bitaŭ" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD spynieny" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Stan" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Hraje" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Prypyniena" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Spyniena" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Paŭtary" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Vyklučana" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Uklučana" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Vypadkova" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Hučnaść" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Crossfade" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekunda" msgstr[1] "sekundy" msgstr[2] "sekundaŭ" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonata nie zmahła spałučycca z sesijnym busam D-BUS: Niemahčyma vyznačyć " "adras busa paviedamleńniaŭ (ka atrymać dapamohu, pasprabuj \"man dbus-launch" "\" i \"man dbus-daemon\")" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Uklučeńnie Sonaty dla profilu" #: .././sonata/dbus_plugin.py:100 #, fuzzy msgid "Maybe Sonata is not running?" msgstr "Sonata ŭžo pracuje." #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata ŭžo pracuje." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Źviestki ab pieśni" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Adčyni artykuł pra vykanaŭca ź Wikipedyi" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Adčyni artykuł pra albom ź Wikipedyi" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Pieraklučy dadatkovyja tagi" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Redahuj tagi dla pieśni" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Słovy" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Šukaj słovy na Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Źviestki ab albomie" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "bolej" #: .././sonata/info.py:215 msgid "hide" msgstr "schavaj" #: .././sonata/info.py:281 msgid "edit tags" msgstr "redahuj tagi" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Źviestki pra albom nia znojdzienyja." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Nazva albomu nie akreślenaja." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI nia znojdziena, zahruzka słovaŭ vyklučanaja." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Nazva vykanaŭcy ci pieśni nie akreślenaja." #: .././sonata/info.py:371 msgid "search" msgstr "šukaj" #: .././sonata/info.py:372 #, fuzzy msgid "edit" msgstr "redahuj tagi" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Słovaŭ nia znojdziena" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Zahruzka słovaŭ..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Niemahčyma spałučycca z LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Niaŭdałaja zahruzka słovaŭ" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Biaź źviestak" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Roznyja vykanaŭcy" #: .././sonata/library.py:49 msgid "Filename" msgstr "Nazva fajłu" #: .././sonata/library.py:49 msgid "Everything" msgstr "Usio" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Fajłavaja systema" #: .././sonata/library.py:53 #, fuzzy msgid "Artists" msgstr "Vykanaŭca" #: .././sonata/library.py:54 #, fuzzy msgid "Albums" msgstr "Albom" #: .././sonata/library.py:55 #, fuzzy msgid "Genres" msgstr "Styl" #: .././sonata/library.py:84 #, fuzzy msgid "Search terms" msgstr "Redahuj krytery pošuku" #: .././sonata/library.py:90 #, fuzzy msgid "End Search" msgstr "_Skončy pošuk" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Ahlad biblijateki" #: .././sonata/library.py:96 #, fuzzy msgid "Search" msgstr "_Šukaj" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "pieśnia" msgstr[1] "pieśni" msgstr[2] "pieśniaŭ" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "chvilina" msgstr[1] "chviliny" msgstr[2] "chvilin" #: .././sonata/library.py:849 #, fuzzy msgid "Song" msgstr "pieśnia" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Ściežka" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Dziejny" #: .././sonata/main.py:103 msgid "Library" msgstr "Biblijateka" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Śpisy" #: .././sonata/main.py:105 msgid "Streams" msgstr "Płyni" #: .././sonata/main.py:106 msgid "Info" msgstr "Źviestki" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Usia pieśnia" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Uparadkuj śpis" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "_Zapišy śpis u" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Spałučeńnie" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "_Hraj paśla" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Aktualizuj" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Užyj _addalenuju vyjavu..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Užyj _lakalnuju vyjavu..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 #, fuzzy msgid "Reset Image" msgstr "Adčyni vyjavu" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Hraj" #: .././sonata/main.py:244 #, fuzzy msgid "Pa_use" msgstr "_Paŭza" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Spyni" #: .././sonata/main.py:246 #, fuzzy msgid "Pre_vious" msgstr "_Papiaredniaja" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Nastupnaja" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Vyjdzi" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Vydal" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Ačyść" #: .././sonata/main.py:251 #, fuzzy msgid "_Entire Library" msgstr "_Aktualizuj biblijateku" #: .././sonata/main.py:252 #, fuzzy msgid "_Selected Items" msgstr "Dadaj zaznačanyja pieśni" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Nałady..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_Ab prahramie..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Redahuj tagi..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Dadaj" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Zamiani" #: .././sonata/main.py:258 msgid "Add" msgstr "Dadaj" #: .././sonata/main.py:259 msgid "Replace" msgstr "Zamiani" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Vydal..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Tasuj" #: .././sonata/main.py:286 #, fuzzy msgid "S_how Sonata" msgstr "_Pakažy Sonatu" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Paŭtaraj" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "_Vypadkova" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Pavodle vykanaŭcaŭ" #: .././sonata/main.py:429 msgid "By Album" msgstr "Pavodle albomaŭ" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Pavodle nazvaŭ piesień" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Pavodle nazvaŭ fajłaŭ" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Pavodle katalohaŭ dy nazvaŭ fajłaŭ" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Pieraviarni śpis" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Novy..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Redahuj..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Źmiani nazvu..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Śpis" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Klikni, kab razharnuć" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Klikni, kab zharnuć" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Nie spałučany" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Nie staje pravoŭ dziela zapisu" #: .././sonata/main.py:645 #, fuzzy msgid "Cover Art" msgstr "_Vokładka" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Adłučy" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Hod" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Płyń" #: .././sonata/main.py:1193 msgid "Len" msgstr "Praciahłaść" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Nieviadoma" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "dzień" msgstr[1] "dni" msgstr[2] "dzion" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "hadzina" msgstr[1] "hadziny" msgstr[2] "hadzin" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "i" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(aktualizacyja mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Pošuk słovaŭ" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Šukaj" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Nazva vykanaŭcy" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Nazva pieśni" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Adčyni vyjavu" #: .././sonata/main.py:2379 msgid "Images" msgstr "Vyjavy" #: .././sonata/main.py:2383 msgid "All files" msgstr "Usie fajły" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Abiary vokładku" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "_Abiary" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Redahuj krytery pošuku" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Nazvaŭ vykanaŭcaŭ ci albomaŭ nia znojdziena." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Vokładak nia znojdziena." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Vydalić zaznačany śpis?" msgstr[1] "Vydalić zaznačanyja śpisy?" msgstr[2] "Vydalić zaznačanyja śpisy?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Vydal śpis" msgstr[1] "Vydal śpisy" msgstr[2] "Vydal śpisy" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Vydalić zaznačanuju płyń?" msgstr[1] "Vydalić zaznačanyja płyni?" msgstr[2] "Vydalić zaznačanyja płyni?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Vydal płyń" msgstr[1] "Vydal płyni" msgstr[2] "Vydal płyni" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Kab zachoŭvać słovy ŭ katalohu muzyčnaha fajłu, treba akreślić sapraŭdny " "kataloh z muzykaj." #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Pravierka katalohu z muzykaj" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Kab zachoŭvać vokładki ŭ katalohu muzyčnaha fajłu, treba akreślić sapraŭdny " "kataloh z muzykaj." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "albom" msgstr[1] "albomy" msgstr[2] "albomaŭ" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "vykanaŭca" msgstr[1] "vykanaŭcy" msgstr[2] "vykanaŭcaŭ" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "dzień ščaścia" msgstr[1] "dni ščaścia" msgstr[2] "dzion ščaścia" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "hadzina ščaścia" msgstr[1] "hadziny ščaścia" msgstr[2] "hadzin ščaścia" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Zapišy śpis" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" "Što ty chočaš zrabić: zamianić dziejny śpis albo dadać da jaho hetyja pieśni?" #: .././sonata/playlists.py:120 #, fuzzy msgid "Existing Playlist" msgstr "Śpis" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Zamiani dziejny śpis" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Dadaj pieśni" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Śpis z takoj nazvaj užo isnuje. Chočaš zamianić jaho?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Nazva śpisu" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Źmiani nazvu śpisu" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Systemny tray" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Uviersie źleva" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Uviersie sprava" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Unizie źleva" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Unizie sprava" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Pasiaredzinie ekranu" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Spałučeńnie z MPD" #: .././sonata/preferences.py:76 #, fuzzy msgid "_Name" msgstr "Nazva" #: .././sonata/preferences.py:79 #, fuzzy msgid "_Host" msgstr "Host" #: .././sonata/preferences.py:82 #, fuzzy msgid "_Port" msgstr "Port" #: .././sonata/preferences.py:86 #, fuzzy msgid "_Music dir" msgstr "Kataloh z muzykaj" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:91 #, fuzzy msgid "Pa_ssword" msgstr "Parol" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Pakiń pustym, kali parol nie vymahajecca." #: .././sonata/preferences.py:95 #, fuzzy msgid "_Autoconnect on start" msgstr "Aŭtamatyčna spałučajsia pry ŭklučeńni" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Užyta MPD_HOST/PORT" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Dadatki" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 #, fuzzy msgid "_Username:" msgstr "Nazva karystalnika:" #: .././sonata/preferences.py:171 #, fuzzy msgid "_Password:" msgstr "Parol:" #: .././sonata/preferences.py:188 #, fuzzy msgid "Popup _notification on song changes" msgstr "Pakazvaj infarmavańni pry źmienie pieśni" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Praciahłaść pierachodu" #: .././sonata/preferences.py:211 #, fuzzy msgid "_Fade length" msgstr "Praciahłaść pierachodu" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sek" #: .././sonata/preferences.py:218 #, fuzzy msgid "C_rossfade" msgstr "Crossfade" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Pakažy" #: .././sonata/preferences.py:251 #, fuzzy msgid "_Album art" msgstr "Nazva albomu" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standartna" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Stylizavana" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Styl vokładki:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Tolki lakalna" #: .././sonata/preferences.py:258 #, fuzzy msgid "Local and remote" msgstr "Lakalna, paśla addalena" #: .././sonata/preferences.py:260 #, fuzzy msgid "Search locations:" msgstr "Paradak pošuku:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 msgid "custom" msgstr "asabliva" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Zachoŭvaj vokładki ŭ:" #: .././sonata/preferences.py:277 #, fuzzy msgid "_Playback/volume buttons" msgstr "Uklučy knopki hrańnia/kiravańnia hučnaściu" #: .././sonata/preferences.py:280 #, fuzzy msgid "Pr_ogressbar" msgstr "Uklučy panel prahresu" #: .././sonata/preferences.py:283 #, fuzzy msgid "_Statusbar" msgstr "Uklučy panel statusu" #: .././sonata/preferences.py:286 #, fuzzy msgid "Song Ly_rics" msgstr "Słovy" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Zachoŭvaj słovy ŭ:" #: .././sonata/preferences.py:297 #, fuzzy msgid "System _tray icon" msgstr "Systemny tray" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Pavodziny vakna" #: .././sonata/preferences.py:323 #, fuzzy msgid "_Show window on all workspaces" msgstr "Pakazvaj vakno na ŭsich rabočych abšaraŭ" #: .././sonata/preferences.py:326 #, fuzzy msgid "_Keep window above other windows" msgstr "Trymaj vakno pa-nad inšymi" #: .././sonata/preferences.py:329 #, fuzzy msgid "_Hide window titlebar" msgstr "Nazva vakna:" #: .././sonata/preferences.py:334 #, fuzzy msgid "_Minimize to system tray on close/escape" msgstr "Minimalizuj u systemny tray pry začynieńni/nacisku Escape" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Kali ŭklučana, začynienaja Sonata budzie minimalizavacca ŭ systemny tray. " "Pakul što niemahčyma vyznačyć, ci jość systemny tray, tamu ŭklučaj heta, " "tolki kali maješ jaho." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Roznaje" #: .././sonata/preferences.py:354 #, fuzzy msgid "_Update MPD library on start" msgstr "Aktualizuj biblijateku MPD pry ŭklučeńni" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Kali ŭklučana, Sonata budzie aŭtamatyčna aktualizoŭvać tvaju biblijateku MPD " "pry ŭklučeńni." #: .././sonata/preferences.py:358 #, fuzzy msgid "S_top playback on exit" msgstr "Pierastań hrać pry vychadzie" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD moža hrać, navat kali klijent začynieny. Kali ŭklučana, Sonata budzie " "bolš padobnaj da zvykłaha muzyčnaha playera, jaki spyniaje vykanańnie pry " "vychadzie." #: .././sonata/preferences.py:362 #, fuzzy msgid "_Write status file:" msgstr "Zapisvaj statusny fajł:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Kali ŭklučana, Sonata stvoryć fajł typu xmms-infopipe, sa źviestkami ab " "pieśni, jakaja ciapier hrajecca. Šmat aplikacyj pracujuć z takim fajłam " "(kamunikatary, klijenty IRC...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Farmat pieśniaŭ" #: .././sonata/preferences.py:397 #, fuzzy msgid "C_urrent playlist:" msgstr "Dziejny śpis:" #: .././sonata/preferences.py:398 #, fuzzy msgid "_Library:" msgstr "Biblijateka:" #: .././sonata/preferences.py:399 #, fuzzy msgid "_Window title:" msgstr "Nazva vakna:" #: .././sonata/preferences.py:400 #, fuzzy msgid "Current _song line 1:" msgstr "Radok 1 dziejnaj pieśni:" #: .././sonata/preferences.py:402 #, fuzzy msgid "Current s_ong line 2:" msgstr "Radok 2 dziejnaj pieśni:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Najaŭnyja opcyi" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Nazva vykanaŭcy" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Nazva albomu" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Nazva pieśni" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Numar pieśni" #: .././sonata/preferences.py:430 #, fuzzy msgid "Disc number" msgstr "Numar dysku" #: .././sonata/preferences.py:433 #, fuzzy msgid "File path" msgstr "ściežka_fajłu" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Nazva fajłu" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Nazva płyni" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Praciahłaść pieśni" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Adbyŭšy čas (tolki nazva)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Źviestki, jakija pakazvajucca, tolki kali ŭsie tagi akreślenyja" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Stvaraje kalony ŭ dziejnym śpisie" #: .././sonata/preferences.py:473 #, fuzzy msgid "_About" msgstr "_Ab prahramie..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "" #: .././sonata/preferences.py:521 msgid "Description" msgstr "" #. Set up table #: .././sonata/preferences.py:532 #, fuzzy msgid "MPD" msgstr "_MPD" #: .././sonata/preferences.py:534 #, fuzzy msgid "Behavior" msgstr "_Pavodziny" #: .././sonata/preferences.py:535 #, fuzzy msgid "Format" msgstr "_Farmat" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Novy profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Asablivaja vokładka" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Nazva fajłu z vokładkaj" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Redahuj płyń" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Novaja płyń" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL płyni" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Płyń z takoj nazvaj užo isnuje. Chočaš zamianić jaje?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Taglib i/ci tagpy nia znojdzienyja, redahavańnie tagaŭ vyklučanaje." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Redahuj tagi" #: .././sonata/tagedit.py:70 #, fuzzy msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "Taglib i/ci tagpy nia znojdzienyja, redahavańnie tagaŭ vyklučanaje." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Ściežka" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "nie isnuje. Akreśl u naładach kataloh z muzykaj." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Fajł " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " nia znojdzieny. Akreśl u naładach kataloh z muzykaj." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Muzyčnych fajłaŭ sa źmiennymi tagami nia znojdziena." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Kamentar" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Zapišy _ŭsio" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Pavialičyć kožny vybrany muzyčny fajł, pačaŭšy ad pieršaj pieśni dla hetaha " "fajłu." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Prymiani dla ŭsich zaznačanych muzyčnych fajłaŭ." #: .././sonata/tagedit.py:260 msgid "of" msgstr "vyklučana" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Niemahčyma zapisać tag u muzyčnym fajle." #: .././sonata/tagedit.py:366 #, fuzzy msgid "Hide file path" msgstr "ściežka_fajłu" #: .././sonata/tagedit.py:369 #, fuzzy msgid "Show file path" msgstr "ściežka_fajłu" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Arhument vypłyŭnoha akna vymahaje D-Bus. Abryŭ." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Aktualizuj" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Sajt: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Uklučy Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Uklučy Crossfade" #~ msgid "Enable album art" #~ msgstr "Uklučy vokładki" #~ msgid "Enable lyrics" #~ msgstr "Uklučy słovy" #~ msgid "Enable system tray icon" #~ msgstr "Uklučy ikonu ŭ systemnym trai" #~ msgid "_Display" #~ msgstr "_Pakažy" #~ msgid "_Extras" #~ msgstr "_Dadatki" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 ci gnome-python-extras nia znojdzienyja, systemny tray " #~ "vyklučany." #~ msgid "Reset to Default" #~ msgstr "Viarni zmoŭčanaje" #~ msgid "_New Playlist..." #~ msgstr "_Novy śpis..." #~ msgid "Notification" #~ msgstr "Nahadvańnie" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 ci python-elementtree nia znojdzienyja, audioscrobbler " #~ "vyklučany." #~ msgid "Audioscrobbler Verification" #~ msgstr "Pravierka Audioscrobblera" #~ msgid "Update library for selected item(s)" #~ msgstr "Aktualizuj biblijateku zaznačanymi pieśniami" #~ msgid "_Shuffle" #~ msgstr "_Tasuj" #~ msgid "Toggle shuffle mode" #~ msgstr "Źmiani režym tasavańnia" #~ msgid "Not connected" #~ msgstr "Nie spałučany" #~ msgid "Press enter to search for these terms." #~ msgstr "Naciśni Enter, kab šukać zhodna z hetymi kryterami." #~ msgid "Add new profile" #~ msgstr "Dadaj novy profil" #~ msgid "Remove current profile" #~ msgstr "Vydal dziejny profil" #~ msgid "Play enqueued files on activate" #~ msgstr "Hraj fajły z čarhi pry aktyvizacyi" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Aŭtamatyčna hraj pieśni ŭ čarzie pry aktyvizacyi dvuklikam albo Enteram." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Dadaj zaznačanyja pieśni ci katalohi" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Zamiani zaznačanyja pieśni ci katalohi" #~ msgid "Add to _Queue" #~ msgstr "Dadaj u _čarhu" #~ msgid "Remove from _Queue" #~ msgstr "Vydal z _čarhi" #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Dadaj zaznačanyja pieśni ŭ čarhu śpisu" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Vydal zaznačanyja pieśni z čarhi śpisu" #~ msgid "seconds" #~ msgstr "sekundaŭ" #~ msgid "Song Info..." #~ msgstr "Źviestki pieśni..." #~ msgid "Click to collapse the player" #~ msgstr "Klikni, kab zharnuć player" #~ msgid "Click to expand the player" #~ msgstr "Klikni, kab razharnuć player" #~ msgid "_Song Info" #~ msgstr "_Źviestki ab pieśni" #~ msgid "_Search..." #~ msgstr "_Šukaj..." #~ msgid "Remote only" #~ msgstr "Tolki addalena" #~ msgid "Remote, then local" #~ msgstr "Addalena, paśla lakalna" #~ msgid "To save artwork as" #~ msgstr "Zachoŭvać vokładki jak" #~ msgid "Artwork Verification" #~ msgstr "Pravierka vokładki" #~ msgid "Switch to current playlist" #~ msgstr "Pieraklučysia na dziejny śpis" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/ca.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000113713�11255764730�0014525�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Catalan translation of Sonata # Copyright (C) 2007 Scott Horowitz # This file is distributed under the same license as the Sonata package. # Scott Horowitz <stonecrest@gmail.com> 2007. # Franc Rodriguez <franc.rodriguez@tecob.com> # # msgid "" msgstr "" "Project-Id-Version: Sonata 1.6.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:00-0600\n" "PO-Revision-Date: 2009-03-23 14:30+0200\n" "Last-Translator: Franc Rodriguez <franc.rodriguez@tecob.com>\n" "Language-Team: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "En quan a Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Preferències" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Mode Art a pantalla completa" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Recórrer la [1ª-5ª] pestanya" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Conectar al servidor MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Desconectar del servidor MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Desordenar la llista de reproducció actual" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Expandir reproductor" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Canviar a la pestanya anterior" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Canviar a la pestanya següent" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Recollir reproductor" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Buscar a la biblioteca" #: .././sonata/about.py:64 msgid "Quit" msgstr "Sortir" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Actualitzar la biblioteca sencera" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Mostrar el menú contextual" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimitzar a l'àrea de notificació (si està actiu)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Cançó anterior" #: .././sonata/about.py:70 msgid "Next track" msgstr "Següent cançó" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Reproduïr/Pausar" #: .././sonata/about.py:72 msgid "Stop" msgstr "Aturar" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Baixar el volúm" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Pujar el volúm" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Reproduïr la cançó seleccionada " #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Esborrar les cançons seleccionades" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Centrar la cançó en reproducció" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Editar les etiquetes de las cançons seleccionades" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Guardar en una llista de reproducció nova" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Buidar la llista de reproducció" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Desordenar la llista de reproducció" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Afegir la/les canço/cançons seleccionada/es o entrar al directori" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Anar al directori superior" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Afegir el/els element/s seleccionat/s" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Reemplaçar amb el/els element/s seleccionat/s" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Afegir el/els element/s seleccionat/s i reproduir-los" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Reemplaçar amb el/els element/s seleccionat/s i reproduïr-lo/s" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Afegir el/els element/s seleccionat/s" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Afegir la/les llista/es de reproducció seleccionada/es" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Eliminar le/s lliste/s de reproducció seleccionat/s" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Reemplaçar amb la/les llista/es de reproduccin seleccionada/es" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Afegir la/es llista/es de reproducció seleccionada/es i reproducïr-la/es" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Reemplaçar amb la/les llista/es de reproducció seleccionada/es i reproduïr-la/les" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Afegir el/els flux/es seleccionat/s" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Esborrar el/els flux/es seleccionat/s" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Reemplaçar amb el/els flux/es seleccionat/s" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Afegir el/els flux/es seleccionat/s i reproduïr-lo/los" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Reemplaçar amb el/els flux/es seleccionat/s i reproduïr-lo/los" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Editar les etiquetes de la cançó en reproducció" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Principals" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Reproducció" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Llista de reproducció actual" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Biblioteca" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Llistes de reproducció" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Fluxes" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Informació de la cançó" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Dreceres del teclat" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Un client elegant de música per MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Dreceres del teclat" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "No es pot arrencar el navegador" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Arrenca el navegador" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "L'argument -t, --toggle i popup requereix D-Bus. Abortant." #: .././sonata/cli.py:97 msgid "Version" msgstr "Versió" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Ús: sonata [OPCIÓ]... [COMANDA]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Opcions" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Mostra aquest missatge d'ajuda i surt" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Mostra una notificació de cançó ( Requereix D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Mostra/Amaga l'aplicació en" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "a l'àrea de notificació (requereix D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "No iniciar l'aplicació si les comandes D-Bus fallen" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Mostra informació sobre la versió i surt" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Inicia l'aplicació amagada (requereix una área de notificació)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Inicia l' aplicació visible (requereix una área de notificació)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Iniciar amb el perfil [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Comandes" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Reprodueix la cançó en la llista de reproducció" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pausa la cançó actual en reproducció" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Atura la cançó actual en reproducció" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Reprodueix la següent cançó en la llista de reproducció" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Reprodueix la cançó anterior en la llista de reproducció" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Activa/Desactiva la reproducció/pausa; reprodueix si està aturat" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Activa/Desactiva el mode de repetició" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Activa/Desactiva el mode aleatori" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Motra l' informació de la cançó actual" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Mostra l' estat del servidor MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Iniciar Sonata amb el perfil %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d no és un número de perfil disponible" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "El número del perfil ha de ser entre 1 i %d" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python no pot interpretar %s com un número" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Perfil predeterminat" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "per" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "de" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "No ha estat possible conectar al servidor MPD.\n" "Si us plau, revisi les preferències de Sonata o les variables d'entorn " "MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Títol" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Artista" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Àlbum" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Data" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Pista" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Estil" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Fitxer" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Temps" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Tasa de bits" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD aturat" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Estat" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Reproduint" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Aturat" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Aturat" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Repetir" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Desactivat" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Activat" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Desordenar" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Volúm" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Esvair" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "segon" msgstr[1] "segons" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filtre" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "S'ha produit un error al connectar amb el transport de la sessió D-Bus:No " "s'ha pogut determinar l'adreça del missatge de transport (consulti el manual " "de 'dbus-launch'i de 'dbus-daemon' per obtenir ajuda)." #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Iniciant Sonata en lloc de ..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Potser sonata no està en marxa?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Ja s'està executant una instància de Sonata." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "L'execució remota de la comanda ha fallat." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Informació de la cançó" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Informació sobre l' artista en Wikipedia" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Informació sobre l' álbum en Wikipedia" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Mostra/Amaga informació extra" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Editar les etiquetes de la cançó" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Lletres" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Cerca les lletres de la cançó a Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Editar lletres a Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Informació de l' àlbum" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "meś" #: .././sonata/info.py:215 msgid "hide" msgstr "amagar" #: .././sonata/info.py:281 msgid "edit tags" msgstr "editar etiquetes" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "No s'ha trobat informació de l'àlbum" #: .././sonata/info.py:311 msgid "Album name not set." msgstr "No s'ha especificat un nom d'àlbum" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "" "No s'ha trobat ZSI, s' ha desactivat el suport per la descàrrega de lletres." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "No s'ha especificat cap artista o títol de la cançó" #: .././sonata/info.py:371 msgid "search" msgstr "Cerca" #: .././sonata/info.py:372 msgid "edit" msgstr "editar" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "No s'han trobat lletres" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Obtenint lletres" #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "No s'ha pogut connectar a LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Ha fallat la descàrrega de lletres" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Sense etiquetar" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Varis artistes" #: .././sonata/library.py:49 msgid "Filename" msgstr "Nom del fitxer" #: .././sonata/library.py:49 msgid "Everything" msgstr "Tot" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Sistema de fitxers" #: .././sonata/library.py:53 msgid "Artists" msgstr "Artistes" #: .././sonata/library.py:54 msgid "Albums" msgstr "Àlbums" #: .././sonata/library.py:55 msgid "Genres" msgstr "Estils" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Cercar termes" #: .././sonata/library.py:90 msgid "End Search" msgstr "Finalitzar recerca" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Vista de la biblioteca" #: .././sonata/library.py:96 msgid "Search" msgstr "Cercar" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "cançó" msgstr[1] "cançons" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minut" msgstr[1] "minuts" #: .././sonata/library.py:849 msgid "Song" msgstr "cançó" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Camí" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Actual" #: .././sonata/main.py:103 msgid "Library" msgstr "Biblioteca" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Llistes de reproducció" #: .././sonata/main.py:105 msgid "Streams" msgstr "Fluxes" #: .././sonata/main.py:106 msgid "Info" msgstr "Informació de la cançó" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Tota la cançó" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Ordenar llista de reproducció" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Gua_rdar llista de reproducció a" #: .././sonata/main.py:236 msgid "_Connection" msgstr "Connexió" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Rep_roduïr després" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Actualitzar" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Usar imatge _remota..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Usar Imatge _Local..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Reiniciar imatge" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Reproduïr" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "Pa_usar" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Aturar" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Anterior" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Següent" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Sortir" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Treure" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Netejar" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "_Biblioteca sencera" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "_Elements seleccionats" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Preferències..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_En quant a..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Editar etiquetes..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Afegir" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Reemplaçar" #: .././sonata/main.py:258 msgid "Add" msgstr "Afegir" #: .././sonata/main.py:259 msgid "Replace" msgstr "Reemplaçar" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Esborrar..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Mesclar" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "_Mostrar Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Repetir" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "Alea_tori" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Per artista" #: .././sonata/main.py:429 msgid "By Album" msgstr "Per álbum" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Per títol" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Per nom de fitxer" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Per directori i nom de fitxer" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Invertir llista" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Nou..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Editar..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Reanomenar..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Llista de reproducció" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Prémer per expandir" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Prémer per recollir" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "No connectat" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Sense permissos de lectura" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Portada" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Perfil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Desconnectar" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Any" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Fluxe" #: .././sonata/main.py:1193 msgid "Len" msgstr "Durada" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Desconegut" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "dia" msgstr[1] "dies" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "hora" msgstr[1] "hores" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "i" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(actualitzant biblioteca)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Recerca de lletres" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Cercar" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Nom de l' artista" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Títol de la cançó" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Obrir imatge" #: .././sonata/main.py:2379 msgid "Images" msgstr "Imatges" #: .././sonata/main.py:2383 msgid "All files" msgstr "Tots els fitxers" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Seleccionar portada" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "S_eleccioni" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Editar termes de la recerca" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "No s'ha trobat l'artista o el nom de l'àlbum" #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "No s'ha trobat la portada" #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Esborrar la llista de reproducció seleccionada?" msgstr[1] "Esborrar les llistes de reproducció seleccionades?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Esborrar llista de reproducció" msgstr[1] "Esborrar llistes de reproducció" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Esborrar el fluxe seleccionat?" msgstr[1] "Esborrar els fluxes seleccionats?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Esborrar fluxe" msgstr[1] "Esborrar fluxes" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Per a guardar les lletres en el directori de fitxers de música, ha de " "especificar un directori de música vàlid" #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Verificació del directori de música" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Per a guardar els fitxers de portades en el directori de música, ha " "d'especificar un directori de música vàlid." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "àlbum" msgstr[1] "àlbums" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "artista" msgstr[1] "artistes" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "dia de música" msgstr[1] "dies de música" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "hora de música." msgstr[1] "hores de música." #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Guardar llista de reproducció" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Vol reemplaçar la llista existent o afegir aquestes cançons?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Llistes de reproducció existents" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Substiuir la llista de reproducció" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Afegir cançons" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Existeix una llista de reproducció amb aquest nom. El vol reemplaçar?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Nom de la llista de reproducció" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Reanomenar la llista de reproducció" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "En l' àrea de notificació" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "A dalt a l'esquerra" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "A dalt a la dreta" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Abaix a l'esquerra" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Abaix a la dreta" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Al centre de la pantalla" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Connexió" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Nom" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Servidor" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_Directori de música" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Seleccioni un directori" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "Contra_senya" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Deixi en blanc si no es necessària la contrasenya" #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "_Connectar automàticament a l'inici" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Utilitzant el servidor/port de MPD" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Extres" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Nom d'usuari" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Contrasenya:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "M_ostrar una notificació al canviar de cançó" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Durada del esvaïment" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "_Durada del esvaïment" #: .././sonata/preferences.py:213 msgid "sec" msgstr "s" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "Es_vair" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Mostrar" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "_Nom de l'àlbum" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Normal" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Estilitzat" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Estil de la portada" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Només local" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Local i remota" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "llocs de recerca:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "SONG_DIR" #: .././sonata/preferences.py:269 msgid "custom" msgstr "personalitzat" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Guardar portada a:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Mostrar botons de reproducció/volum" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "Mos_trar barra de progrés" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "_Mostrar barra d'estat" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "Lletr_es" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Guardar lletres a:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "Icona de l' àrea de _notificació" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Comportament de la finestra" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "_Mostrar la finestra en totes les àrees de treball" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "M_antenir la finestra per sobre de la resta de finestres" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "_Amagar el títol de la finestra" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_Minimitzar a l' àrea de notificació quan es tanqui la finestra" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Si està activat, Sonata es minimitzarà a l'àrea de notificació quan es " "tanqui lafinestra. Actualment és impossible detectar si hi ha o no una àrea " "de notificació, per tant, comprovi que almenys en té una." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Miscel·lànea" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "A_ctualitzar la biblioteca a l'inici" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Si està activat, Sonata actualitzarà automaticament la biblioeca a l'inici " #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "A_turar la reproducció al sortir" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD permet continuar la reproducció encara que cap client estigui obert.Si " "està activat, Sonata es comportarà com un reproductor de música convencional " "y aturarà la reproducció al sortir" #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "_Escriure fitxer d'estat" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Si està activat, Sonata crearà un fitxer del tipus xmms-infopipe que tindrà " "informació sobre la cançó en reproducció. Moltes aplicacionstenen suport pel " "fitxer xmms-info (client de missatgeria instantània, clients de IRC, ...)." #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Format de la cançó" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "Ll_ista de reproducció actual" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "Biblioteca" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Títol de la finestra" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Linia 1 de la cançó actual" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Línia 2 de la cançó actual" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Opcions disponibles" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Nom de l'artista" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Nom de l'àlbum" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Nom de la pista" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Número de la pista" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Número de disc" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Camí del fitxer" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Nom del fitxer" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Nom del fluxe" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Durada" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Temps restant (només pel títol de la finestra)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "" "Informació mostrada només si totes les etiquetes tancades estan definides" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Crear columnes en la llista de reproducció actual" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_En quant a..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "Configurar..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Carregat" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Descripció" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Comportament" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Format" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Perfil nou" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Portada personalitzada" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Nom del fitxer de la portada" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Editar fluxe" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Nou fluxe" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL del fluxe" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Existeix un fluxe amb aquest nom. El vol reemplaçar?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "No s'ha trobat taglib i/o tagpy, s'ha desactivat el suport per l'edició " "d'etiquetes." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Editar etiquetes" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "Versió de Tagpy < 0.91, Si us plau actualitzi a una versió més nova, Suport per l'ediciió de tags desactivada" #: .././sonata/tagedit.py:75 msgid "The path" msgstr "El camí" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "" "No existeix. Si us plau especifiqui un directori de música vàlid en les " "preferències" #: .././sonata/tagedit.py:99 msgid "File " msgstr "Fitxer" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "" "no trobat. Si us plau, especifiqui un directori de música vàlid les " "preferències" #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "No s'han trobat fitxers amb les etiquetes editables." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Comentari" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Gu_ardar tot" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Incrementar en cada fitxer de música seleccionat, començant la pista 1 " "d'aquest fitxer" #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Aplicar a tots els fitxers de música seleccionats." #: .././sonata/tagedit.py:260 msgid "of" msgstr "de" #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "No s'ha pogut escriure l'etiqueta en el fitxer de música." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Amagar camí del fitxer" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Mostrar camí del fitxer" �����������������������������������������������������sonata-1.6.2.1/po/cs.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000120676�11255764730�0014555�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Czech translation of sonata. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Sonata package. # Jakub Adler <jakubadler@gmail.com>, 2007. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:00-0600\n" "PO-Revision-Date: 2009-03-25 21:15+0100\n" "Last-Translator: Jakub Adler <jakubadler@gmail.com>\n" "Language-Team: \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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "O programu Sonata" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "Nastavení" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Obrázek na celou obrazovku" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Přepnout na tab [1-5]" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Spojit s MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Odpojit od MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Náhodně seřadit aktuální seznam" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Zvětšit přehrávač" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Přejít na předchozí kartu" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Přejít na následující kartu" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Zmenšit přehrávač" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "Prohledat knihovnu" #: .././sonata/about.py:64 msgid "Quit" msgstr "Konec" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Aktualizovat celou knihovnu" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Zobrazit vyskakovací menu" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Skrýt do systémové oblasti (pokud je zapnuto)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Předchozí stopa" #: .././sonata/about.py:70 msgid "Next track" msgstr "Další stopa" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Play/Pause" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stop" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Snížit hlasitost" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Zvýšit hlasitost" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Přehrát vybranou skladbu" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Smazat vybrané skladby" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Umístit přehrávanou skladbu na střed" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Upravit tagy vybrané skladby" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Uložit do nového playlistu" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Vymazat seznam" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Náhodně seřadit seznam" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Přidat vybranou skladbu nebo vstoupit do adresáře" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Jít do nadřazeného adresáře" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Přidat vybrané položky" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Přepsat vybranými položkami" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Přidat vybrané položky a přehrát" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Přepsat vybranými položkami a přehrát" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Aktualizovat vybrané položky/cesty" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Přidat vybrané playlisty" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Smazat vybrané playlisty" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Přepsat vybranými playlisty" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Přidat vybrané playlisty a přehrát" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Přepsat vybranými playlisty a přehrát" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Přidat vybrané streamy" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Smazat vybrané streamy" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Přepsat vybranými streamy" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Přidat vybrané streamy a přehrát" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Přepsat vybranými streamy a přehrát" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Upravit tagy přehrávané skladby" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Hlavní zkratky" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Zkratky pro přehrávání" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Zkratky pro aktuální playlist" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Zkratky pro knihovnu" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Zkratky pro playlist" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Zkratky pro stream" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Zkratky pro informace" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Zkratky" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Elegantní klient pro MPD" #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Zkratky" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Nelze spustit vhodný prohlížeč." #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Spustit prohlížeč" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Parametr toggle a popup vyžadují D-Bus. Ruší se." #: .././sonata/cli.py:97 msgid "Version" msgstr "Verze" #: .././sonata/cli.py:98 msgid "Website" msgstr "Webová stránka" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Použití: sonata [VOLBA]... [PŘÍKAZ]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Volby" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Zobrazit tuto nápovědu a skončit" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Vyskakovací oznámení (potřebuje DBus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Přepíná, jestli je aplikace minimalizovaná" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "v systémové oblasti, nebo viditelná (potřebný D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Nespouštět aplikaci, pokud D-Bus příkaz selže" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Zobrazí informace o verzi a skončí" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Spustit aplikaci skrytou (potřebný systray)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Spustit aplikaci viditelnou (potřebný systray)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Spustit s profilem [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Příkazy" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Přehrát skladbu v playlistu" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pozastavit přehrávanou skladbu" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Zastavit přehrávanou skladbu" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Přehrát další skladbu v playlistu" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Přehrát předchozí skladbu v playlistu" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Změnit přehrávání/pauza; hraje když je zastaveno" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Přepnout do módu opakování" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Přepnout do náhodného módu" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Zobrazit informace o aktuální skladbě" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Zobrazit stav MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Spustit Sonatu s profilem %s" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d není dostupné číslo profilu." #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Číslo profilu musí být mezi 1 a %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python nemůže interpretovat %s jako číslo." #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "Výchozí profil" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr "od" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "z" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "Nelze se spojit s MPD.\n" "Prosím zkontrolujte nastavení Sonaty, nebo proměnné prostředí MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Název" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Umělec" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "Datum" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Stopa" #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Žánr" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Soubor" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "Čas" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "Datový tok" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD zastaveno" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "Stav" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Přehrávání" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pozastaveno" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "Zastaveno" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "Opakovat" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "Off" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "On" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "Náhodně" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Hlasitost" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Prolínání" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekunda" msgstr[1] "sekundy" msgstr[2] "sekund" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filtr" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Sonata selhala při spojování s D-BUS session bus: Nelze určit adresu zprávy bus (zkuste 'man dbus-launch a 'man dbus-daemon' pro nápovědu)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Selhalo spuštění vzdálených příkazů." #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Spustit Sonatu namísto..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Možná je už Sonata spuštěna" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Jedna instance Sonaty je již spuštěna. " #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Selhalo spuštění vzdáleného příkazu." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Informace o skladbě" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Přejít na umělce ve Wikipedii" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Přejít na album ve Wikipedii" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Přepnout dodatečné tagy" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Uložit playlist do" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Text skladby" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Hledat text na Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Upravit text na Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Informace o albu" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "více" #: .././sonata/info.py:215 msgid "hide" msgstr "skrýt" #: .././sonata/info.py:281 msgid "edit tags" msgstr "upravit tagy" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Informace o albu nejsou dostupné." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Jméno alba není nastaveno" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI není dostupný, získávání textů bude vypnuto." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Umělec nebo jméno skladby není nastaveno" #: .././sonata/info.py:371 msgid "search" msgstr "hledat" #: .././sonata/info.py:372 msgid "edit" msgstr "upravit" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Text není dostupný" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Získávám text..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Nelze se připojit k LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Získávání textu selhalo" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Bez tagů" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Různí umělci" #: .././sonata/library.py:49 msgid "Filename" msgstr "Jméno souboru" #: .././sonata/library.py:49 msgid "Everything" msgstr "Vše" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Systém souborů" #: .././sonata/library.py:53 msgid "Artists" msgstr "Umělci" #: .././sonata/library.py:54 msgid "Albums" msgstr "Alba" #: .././sonata/library.py:55 msgid "Genres" msgstr "Žánry" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Hledat výraz" #: .././sonata/library.py:90 msgid "End Search" msgstr "Ukončit hledání" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Prohlížení knihovny" #: .././sonata/library.py:96 msgid "Search" msgstr "Hledat" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "skladba" msgstr[1] "skladby" msgstr[2] "skladeb" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" msgstr[1] "minuty" msgstr[2] "minut" #: .././sonata/library.py:849 msgid "Song" msgstr "Skladba" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "Cesta" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Aktuální" #: .././sonata/main.py:103 msgid "Library" msgstr "Knihovna" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Playlisty" #: .././sonata/main.py:105 msgid "Streams" msgstr "Streamy" #: .././sonata/main.py:106 msgid "Info" msgstr "Informace" #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Celá skladba" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "Seřa_dit seznam" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Uložit playlist do" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Spojení" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Př_ehrát po" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "_Aktualizovat" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Použít _vzdálený obrázek..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Použít _lokální obrázek..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Celá obrazovka" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Vynulovat obrázek" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Play" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "Pau_za" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stop" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Předchozí" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Další" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Ukončit" #: .././sonata/main.py:249 msgid "_Remove" msgstr "S_mazat" #: .././sonata/main.py:250 msgid "_Clear" msgstr "Smazat _vše" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "_Celou knihovnu" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "_Vybrané položky" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Nastavení" #: .././sonata/main.py:254 msgid "_About..." msgstr "_O Sonatě" #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "Upravit _tagy" #: .././sonata/main.py:256 msgid "_Add" msgstr "Př_idat" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Přepsat" #: .././sonata/main.py:258 msgid "Add" msgstr "Přidat" #: .././sonata/main.py:259 msgid "Replace" msgstr "Přepsat" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "S_mazat..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Zamíchat" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "Zobrazit _Sonatu" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "Opa_kovat" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "Ná_hodně" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Podle umělce" #: .././sonata/main.py:429 msgid "By Album" msgstr "Podle alba" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Podle názvu skladby" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Podle jména souboru" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Podle jména souboru a adresáře" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Obrátit seznam" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "No_vý..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "Up_ravit..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "Pře_jmenovat..." #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "Playlist" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "Klikni pro rozšířené zobrazení" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Klikni pro kompaktní zobrazení" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "Nepřipojeno" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Chybí právo ke čtení" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Obrázek alba" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "Odpojit" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Rok" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Stream" #: .././sonata/main.py:1193 msgid "Len" msgstr "Délka" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Neznámý" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "den" msgstr[1] "dny" msgstr[2] "dní" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "hodina" msgstr[1] "hodiny" msgstr[2] "hodin" #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr "a" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(aktualizuje se mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Hledání textu" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Hledat" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Jméno umělce" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Název skladby" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Otevřít obrázek" #: .././sonata/main.py:2379 msgid "Images" msgstr "Obrázky" #: .././sonata/main.py:2383 msgid "All files" msgstr "Všechny soubory" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Vybrat obrázek alba" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "_Vybrat" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Upravit hledaný výraz" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Jméno umělce nebo alba není dostupné" #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Obrázek alba není dostupný" #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Smazat vybraný playlist?" msgstr[1] "Smazat vybrané playlisty?" msgstr[2] "Smazat vybrané playlisty?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Smazat playlist" msgstr[1] "Smazat playlisty" msgstr[2] "Smazat playlisty" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Smazat vybraný stream?" msgstr[1] "Smazat vybrané streamy?" msgstr[2] "Smazat vybrané streamy?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Smazat stream" msgstr[1] "Smazat streamy" msgstr[2] "Smazat streamy" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "Pro uložení textu do adresáře s hudbou musíte jeho platný název." #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Ověření adresáře s hudbou" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "Pro uložení obrázku do adresáře s hudbou musíte uvést platný adresář s hudbou" #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "alba" msgstr[2] "alb" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "umělec" msgstr[1] "umělci" msgstr[2] "umělců" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "den blaha" msgstr[1] "dny blaha" msgstr[2] "dní blaha" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "hodina blaha" msgstr[1] "hodiny blaha" msgstr[2] "hodin blaha" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Uložit playlist" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Chcete přepsat existující playlist nebo přidat tyto skladby?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Existující playlist" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Přepsat playlist" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Přidat skladby" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Playlist s tímto jménem už existuje. Chcete jej přepsat" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Jméno playlistu" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Přejmenovat playlist" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Systémová oblast" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Vlevo nahoře" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Vpravo nahoře" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Vlevo dole" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Vpravo dole" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Střed obrazovky" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Připojení k MPD" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Jméno" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Host" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "Adresář _s hudbou" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Vybrat adresář s hudbou" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "H_eslo" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Nechat prázdné, pokud heslo není potřeba." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "_Automaticky připojit při spuštění" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Používám MPD_HOST/PORT" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "Navíc" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Uživatelské jméno:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "He_slo:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "_Vyskakovací oznámení při změně skladby" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Délka přechodu" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "_Délka přechodu" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sec" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "P_rolínání" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "Zobrazení" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "Obrázek _alba" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standardní" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Stylizovaný" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Styl obrázku alba:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Pouze lokální" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Lokální a vzdálený" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Pořadí hledání:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "ADRESÁŘ_SE_SKLADBOU" #: .././sonata/preferences.py:269 msgid "custom" msgstr "vlastní" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Uložit obrázek alba jako:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Tlačítka přehrávání a hlasitosti" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "_Lišta průběhu" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "_Stavový řádek" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "T_ext skladby" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Uložit text do" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "_Ikona v systémové oblasti" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Chování okna" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "_Zobrazit okno na všech plochách" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "_Podržet okno nad ostatními okny" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "_Skrýt titulek okna" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "S_krýt do systémové oblasti při zavření" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "Pokud je zapnuto, při zavření bude Sonata pouze minimalizována do systémové oblasti. Nyní nejde zjistit, jestli je k dispozici systémová oblast, proto se ujistěte, že je možné systémovou oblast použít." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Různé" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "_Aktualizovat knihovnu MPD při spuštění" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "Pokud je zapnuto, Sonata bude automaticky aktualizovat knihovnu MPD při spuštění." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "Zas_tavit přehrávání při vypnutí" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD umožňuje přehrávání i když klient není spuštěn. Pokud je tato volba zapnuta, Sonata se může chovat jako běžné přehrávače a zastavit přehrávání při ukončení." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "Zapsat stav _do souboru:" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "Pokud je zapnuto, Sonata vytvoří xmms-infopipe jako soubor obsahující informace o aktuální skladbě. Mnoho aplikací soubor xmms-info podporuje (Instant messenger, IRC klienty...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Formát skladby" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "_Aktuální playlist" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Knihovna:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Titulek okna:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Aktuální skla_dba, řádek 1:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Aktuální sklad_ba, řádek 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Dostupné volby" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Jméno umělce" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Jméno alba" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Jméno stopy" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Číslo stopy" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Číslo disku" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Cesta k souboru" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Jméno souboru" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "Jméno streamu" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Délka skladby" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Uplynulý čas (pouze v názvu)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Informace zobrazeny pouze když jsou všechny přiložené tagy definovány" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Vytvoří sloupce v aktuálním playlistu" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_O Sonatě" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Nastavit" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Nahráno" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Popis" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Chování" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Formát" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Nový profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Vlastní obrázek alba" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Jméno obrázku alba" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Upravit stream" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "Nový stream" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL streamu" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Stream s tímto jménem už existuje. Chcete jej přepsat?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Knihovna taglib nebo tagpy není dostupná, podpora editace tagů vypnuta." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Upravit tagy" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Verze knihovny tagpy je nižší než 0.91, podpora editace tagů vypnuta. Prosím aktualizujte na novou verzi." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Cesta" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "neexistuje. Prosím zadejte platný adresář s hudbou v nastavení." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Soubor" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "neexistuje. Prosím zadejte platný adresář s hudbou v nastavení." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Nejsou dostupné soubory s editovatelnými tagy." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Komentář" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Uložit _Vše" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Přidat každý vybraný hudební soubor, začátek od stopy 1 pro tento soubor." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Použít na všechny vybrané hudební soubory" #: .././sonata/tagedit.py:260 msgid "of" msgstr "z" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Nelze uložit tag do hudebního souboru" #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Skrýt cestu k souboru" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Zobrazit cestu k souboru" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Parametr potřebuje D-Bus. Ruší se.+" #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Aktualizovat" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Webová stránka: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Povolit Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Zapnout prolínání" #~ msgid "Enable album art" #~ msgstr "Povolit obrázek alba" #~ msgid "Enable lyrics" #~ msgstr "Povolit text skladeb" #~ msgid "Enable system tray icon" #~ msgstr "Povolit ikonu v systémové oblasti" #~ msgid "_Display" #~ msgstr "_Zobrazení" #~ msgid "_Extras" #~ msgstr "_Navíc" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 nebo gnome-python-extras nebyly nalezeny, podpora systémové " #~ "oblasti vypnuta." #~ msgid "Reset to Default" #~ msgstr "Nastavit na původní" #~ msgid "_New Playlist..." #~ msgstr "_Nový playlist" #~ msgid "Notification" #~ msgstr "Oznamování" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 nebo python-elementtree nebyl nalezen, podpora pro " #~ "audioscrobbler vypnuta." #~ msgid "Audioscrobbler Verification" #~ msgstr "Ověření Audioscrobbleru" #~ msgid "Update library for selected item(s)" #~ msgstr "Aktualizovat knihovnu pro vybrané položky" #~ msgid "_Shuffle" #~ msgstr "_Zamíchat" #~ msgid "Toggle shuffle mode" #~ msgstr "Přepnout mód míchání" #, fuzzy #~ msgid "not found. Exiting..." #~ msgstr "Slova nejsou dostupná" #~ msgid "Add to _Queue" #~ msgstr "Přidat do _fronty" #~ msgid "Remove from _Queue" #~ msgstr "Odstranit z _fronty" #~ msgid "seconds" #~ msgstr "sekund" #~ msgid "Not connected" #~ msgstr "Odpojeno" #~ msgid "Press enter to search for these terms." #~ msgstr "Stiskněte enter pro hledání tohoto výrazu." #~ msgid "Add new profile" #~ msgstr "Přidat nový profil" #~ msgid "Remove current profile" #~ msgstr "Smazat aktuální profil" #~ msgid "Play enqueued files on activate" #~ msgstr "Přehrát zařazené soubory při aktivaci" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Automaticky přehrát zařazené položky pokud jsou aktivovány dvojitým " #~ "kliknutím nebo entrem." #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Přidat vybrané skladby do playlistu" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Smazat vybrané skladby z playlistu" #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Přidat vybrané skladby nebo adresáře" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Přepsat vybranými skladbami nebo adresáři" #~ msgid "Song Info..." #~ msgstr "Informace o skladbě..." #~ msgid "Click to collapse the player" #~ msgstr "Klikni pro kompaktní zobrazení" #~ msgid "Click to expand the player" #~ msgstr "Klikni pro rozšířené zobrazení" #~ msgid "_Song Info" #~ msgstr "Informace o _skladbě" #~ msgid "_Search..." #~ msgstr "_Hledat..." #~ msgid "Remote only" #~ msgstr "Pouze vzdálený" #~ msgid "Remote, then local" #~ msgstr "Vzdálený, poté lokální" #~ msgid "To save artwork as" #~ msgstr "Pro uložení obrázku alba jako" #~ msgid "Artwork Verification" #~ msgstr "Ověření obrázku alba" #~ msgid "Switch to current playlist" #~ msgstr "Přepnout na aktuální playlist" ������������������������������������������������������������������sonata-1.6.2.1/po/da.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000117255�11255764730�0014533�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Danish translation for Sonata. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the sonata package. # Martin Dybdal <dybber@dybber.dk>, 2007. # msgid "" msgstr "" "Project-Id-Version: sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:00-0600\n" "PO-Revision-Date: 2009-03-23 10:52+0100\n" "Last-Translator: Martin Dybdal <dybber@dybber.dk>\n" "Language-Team: LANGUAGE <LL@li.org>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Om Sonata" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "Indstillinger" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Pladeomslag i fuld skærm" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Skift til 1.-5. tab" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Forbind til MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Luk forbindelse til MPD." #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Bland nuværende afspilningsliste" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Udvid afspiller" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Skift til foregående faneblad" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Skift til næste faneblad" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Sammenfold afspiller" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "Søg i biblioteket" #: .././sonata/about.py:64 msgid "Quit" msgstr "Luk" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Opdater hele biblioteket" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Vis popup menu" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimer til statusfelt (hvis muligt)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Forrige sang" #: .././sonata/about.py:70 msgid "Next track" msgstr "Næste sang" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Afspil/Pause" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stop" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Sænk lydstyrken" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Hæv lydstyrken" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Afspil den valgte sang" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Fjern de valgte sange" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Centrer nuværende sang" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Rediger valgte sanges tags" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Gem som ny afspilningsliste" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Ryd liste" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Bland afspilningsliste" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Tilføj valgte sange eller gå ind i mappe" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Gå et mappeniveau op" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Tilføj det valgte" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Erstat med det valgte" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Tilføj det valgte og afspil" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Erstat med det valgte og afspil" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Opdater valgte elementer/stier" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Tilføj valgte afspilningslister" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Fjern valgte afspilningslister" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Erstat med valgte afspilningslister" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Tilføj de valgte afspilningslister og afspil" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Erstat med de valgte afspilningslister og afspil" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Tilføj valgte streams" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Fjern valgte streams" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Erstat med valgte streams" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Tilføj de valgte streams og afspil" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Erstat med de valgte streams og afspil" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Rediger den nuværende sangs tags" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Overordnede genveje" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Afspilningsgenveje" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Genveje i afspilningskø" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Genveje i bibliotek" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Genveje i afspilningslister" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Genveje i streams" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Info genveje" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Genveje" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "En elegant musikklient til MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "Genveje" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Ikke muligt at starte en browser" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Start browser" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "\"--toggle\" og \"--popup\" argumenterne kræver D-Bus. Afbryder." #: .././sonata/cli.py:97 msgid "Version" msgstr "Version" #: .././sonata/cli.py:98 msgid "Website" msgstr "Hjemmeside" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Brug: sonata [FLAG]... [KOMMANDO]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Flag" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Vis denne hjælp" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Vis sangnotifikation (kræver DBUS)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Skifter om programmet er minimeret" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "til statusfelt eller er synligt (kræver D-BUS)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Start ikke sonata hvis D-Bus kommandoer fejler" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Vis versions-information" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Start program minimeret til statusfelt" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Start program synligt" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Start med profil nummer [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Kommandoer" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Afspil sang i afspilningsliste" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pause nuværende sang" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Stop nuværende sang" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Afspil næste sang i afspilningslisten" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Afspil forrige sang i afspilningslisten" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Afspil/Pause; starter afspilning hvis stoppet" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Slå gentaget afspilning til eller fra" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Slå tilfældig afspilningsrækkefølge til eller fra" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Vis info om nuværende sang" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Vis MPD status" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Starter Sonata med profil %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d er ikke et tilgængeligt profilnummer." #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Ikke et gyldigt profilnummer. Profilnumre skal være imellem 1 og %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python kan ikke fortolke %s som et nummer." #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "Standard profil" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr "af" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "fra" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "Kunne ikke forbinde til MPD.\n" "Tjek dine Sonata indstillinger og MPD_HOST/MPD_PORT variabler." #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Titel" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Kunstner" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "Dato" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Nummer" #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Genre" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Fil" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "Tid" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitrate" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD stoppet" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "Status" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Afspiller" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pause" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "Stoppet" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "Gentag" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "Nej" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "Ja" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "Bland liste" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Lydstyrke" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Crossfade" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekund" msgstr[1] "sekunder" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Afvikling af fjernkommandoer fejlede." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Starter Sonata i stedet..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Der er allerede startet en instans af Sonata" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Der er allerede startet en instans af Sonata. Viser den..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Afvikling af fjernkommando fejlede." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Sanginformationer" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Vis kunsterne på Wikipedia" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Vis album på Wikipedia" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Vis/skjul ekstra tags" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Rediger tags" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Sangtekst" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Find sangtekster på Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Ret sangtekst på Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Albuminformationer" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "mere" #: .././sonata/info.py:215 msgid "hide" msgstr "skjul" #: .././sonata/info.py:281 msgid "edit tags" msgstr "rediger tags" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Ingen albuminformationer blev fundet." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Album navn ikke angivet" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI (Zolera Soap Infrastructure) blev ikke fundet, sangtekster vil ikke blive hentet." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Kunstner eller titel ikke angivet" #: .././sonata/info.py:371 msgid "search" msgstr "søg" #: .././sonata/info.py:372 msgid "edit" msgstr "rediger" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Der blev ikke fundet nogen sangtekst." #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Henter sangtekst.." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Kunne ikke forbinde til LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Kunne ikke hente sangtekst" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Tags mangler" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Diverse kunstnere" #: .././sonata/library.py:49 msgid "Filename" msgstr "Filnavn" #: .././sonata/library.py:49 msgid "Everything" msgstr "Alt" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Filsystem" #: .././sonata/library.py:53 msgid "Artists" msgstr "Kunstnere" #: .././sonata/library.py:54 msgid "Albums" msgstr "Albums" #: .././sonata/library.py:55 msgid "Genres" msgstr "Genrer" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Søgeord" #: .././sonata/library.py:90 msgid "End Search" msgstr "Afslut søgning" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Bibliotek visningsmåde" #: .././sonata/library.py:96 msgid "Search" msgstr "Søg" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "sang" msgstr[1] "sange" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minut" msgstr[1] "minutter" #: .././sonata/library.py:849 msgid "Song" msgstr "Sang" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "Sti" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Afspilningskø" #: .././sonata/main.py:103 msgid "Library" msgstr "Bibliotek" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Afspilningslister" #: .././sonata/main.py:105 msgid "Streams" msgstr "Streams" #: .././sonata/main.py:106 msgid "Info" msgstr "Info" #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Hele sangen" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Sorter liste" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Ge_m liste som" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Forbindelse" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Afspi_l efter" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "_Opdater" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Brug _online billede" #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Brug _lokalt billede" #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "Vis i _fuld skærm" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Nulstil billede" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Afspil" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "_Pause" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stop" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Forrige" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Næste" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Luk" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Fjern" #: .././sonata/main.py:250 msgid "_Clear" msgstr "R_yd" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "_Hele biblioteket" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "Valgte elementer" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Indstillinger" #: .././sonata/main.py:254 msgid "_About..." msgstr "_Om" #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Rediger tags" #: .././sonata/main.py:256 msgid "_Add" msgstr "_Tilføj" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Erstat" #: .././sonata/main.py:258 msgid "Add" msgstr "Tilføj" #: .././sonata/main.py:259 msgid "Replace" msgstr "Erstat" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Slet" #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Bland" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "_Vis Sonata-vinduet" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Gentag" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "Tilfældig _rækkefølge" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Efter _kunstner" #: .././sonata/main.py:429 msgid "By Album" msgstr "Efter _album" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Efter _titel" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Efter _filnavn" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Efter mappe og filnavn" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Omvendt rækkefølge" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "_Ny..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Rediger" #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Omdøb" #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "Afspilningsliste" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "Klik for at folde ud" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Klik for at folde sammen" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "Ikke forbundet" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Ingen læserettigheder" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Pladeomslag" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "Ingen forbindelse" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "Nr." #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "År" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Stream" #: .././sonata/main.py:1193 msgid "Len" msgstr "Længde" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Ukendt" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "dag" msgstr[1] "dage" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "time" msgstr[1] "timer" #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr "og" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(opdaterer MPD database)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Sangtekst søgning" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Søg" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Kunstner navn" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Sangtitel" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Åben billede" #: .././sonata/main.py:2379 msgid "Images" msgstr "Billeder" #: .././sonata/main.py:2383 msgid "All files" msgstr "Alle filer" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Vælg pladeomslag" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "Væl_g" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Rediger søgeord" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Ingen kunstner eller album fundet." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Intet pladeomslag" #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Slet den valgte afspilningsliste?" msgstr[1] "Slet de valgte afspilningslister?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Slet afspilningsliste" msgstr[1] "Slet afspilningslister" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Slet den valgte stream?" msgstr[1] "Slet de valgte streams?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Slet stream" msgstr[1] "Slet Streams" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "For at gemme sangtekster til musikfilens mappe, skal du angive en gyldig musikmappe." #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Musikmappe verifikation" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "For at gemme albumcovers til musikfilens mappe, skal du angive en gyldig musikmappe." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "albums" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "kunstner" msgstr[1] "kunstner" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "lyksalig dag" msgstr[1] "lyksalige dage" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "lyksalig time" msgstr[1] "lyksalige timer" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Gem afspilningsliste" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Vil du tilføje disse sange til den nuværende afspilningskø eller erstatte den?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Eksisterende afspilningsliste" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Erstat afspilningsliste" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Tilføj sange" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "En afspilningsliste med dette navn eksisterer allerede. Vil du erstatte den? " #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Listenavn" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Omdøb afspilningsliste" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Statusfelt" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Øverst til venstre" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Øverst til højre" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Nederst til venstre" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Nederst til højre" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Midt på skærmen" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD forbindelse" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Navn" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Server" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_Musikmappe" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Vælg en musikmappe" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "Pass_word" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Efterlad tom hvis serveren ikke er beskyttet med password." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "Forbind _automatisk ved programstart" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Bruger MPD_HOST/PORT" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "Ekstra" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Brugernavn:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Password:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "Vis _notifikationer ved sangskift" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Fadelængde" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "_Fadelængde" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sek" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "C_rossfade" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "Visning" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "Plade_omslag" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standard" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Med CD-kant" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Omslags udseende:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Kun lokalt" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Lokalt og online" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Søge placeringer:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "SANGENS_MAPPE" #: .././sonata/preferences.py:269 msgid "custom" msgstr "selvvalgt" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Gem omslag som:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Afspilnings- og lydstyrkeknapper" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "_Progressbar" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "_Statusbar" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "Sang_tekst" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Gem tekster som:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "_Ikon i statusfeltet" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Vindues opførsel" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "Vis vindue på alle _arbejdsområder" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "_Hæv vindue over andre vinduer" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "Skjul vinduets _titellinje" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_Minimer til statusfeltet ved lukning eller ved tryk på escape" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "Hvis dette er slået til vil Sonata blive minimeret til statusfeltet ved lukning og tryk på escape tasten.Det er på nuværende tidspunkt ikke muligt at kontrollere om der er et statusfelt, så slå kun dette til hvis du har et." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Diverse" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "_Opdater MPD biblioteket ved programstart" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "Hvis dette er slået til vil Sonata automatisk opdatere dit MPD bibliotek ved programstart." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "_Stop afspilning ved lukning" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD tillader afspilning selv når klienten ikke er åben. Sonata vil opføre sig mere som en konventionel musikafspiller vis dette slås til og stoppe afspilningen når Sonata lukkes." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "Lav status_fil:" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "Lader Sonata lave en xmms-infopipe lignende fil der indeholder informationer om den nuværende sang. Mange programmer understøtter xmms-info filer (Instant Messengers, IRC Klienter...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Sangformattering" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "_Afspilningskøen:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "I _biblioteket:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Vindues titel:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "_Nuværende sang, linje 1:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "N_uværende sang, linje 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Tilgængelige erstatninger" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Kunstner navn" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Album titel" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Sangens navn" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Sangens nummer" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Disk nummer" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Filsti" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Filnavn" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "Stream navn" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Sanglængde" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Forløbet tid (kun i vinduestitel)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Bliver kun vist hvis all tags imellem paranteserne er defineret." #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Opdeler den nuværende afspilningsliste i kolonner." #: .././sonata/preferences.py:473 msgid "_About" msgstr "_Om" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Konfigurer..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Indlæst" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Forklaring" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Opførsel" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Format" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Ny profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Vælg placering/filnavn for pladeomslag" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Omslags filnavn" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Rediger stream" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "Ny stream" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "Stream URL" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "En stream med dette navn eksisterer allerede. Vil du erstatte den?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Hverken Taglib og/eller tagpy blev fundet, tagredigering deaktiveret." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Rediger tags" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Den installerede tagpy version er < 0.91. Opgrader venligst til en nyere version for at få mulighed for redigering af tags." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Stien" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "eksisterer ikke. Vælg venligst en gyldig musikmappe under indstillinger." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Filen" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " blev ikke fundet. Vælg venligst en gyldig musikmappe under indstillinger." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Ingen musikfiler med redigerbare tags fundet." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Kommentar" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Gem _Alle" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Giv alle de valgte sange et fortløbende nummer startende med denne, som får nummer 1." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Anvend på alle de valgte musikfiler." #: .././sonata/tagedit.py:260 msgid "of" msgstr "af" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Umuligt at skrive tag til musikfil." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Skjul filsti" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Vis filsti" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "\"--popup\"-argumentet kræver D-Bus. Afbryder." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Opdater" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Hjemmeside: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Brug Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Brug crossfade" #~ msgid "Enable album art" #~ msgstr "Hent og vis pladeomslag" #~ msgid "Enable lyrics" #~ msgstr "Hent sangtekster" #~ msgid "Enable system tray icon" #~ msgstr "Vis ikon i statusfelt" #~ msgid "_Display" #~ msgstr "_Visning" #~ msgid "_Extras" #~ msgstr "_Ekstra" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "Hverken PyGTK+ 2.10 eller gnome-python-extras blev fundet, mulighed for " #~ "ikon i statusfeltet deaktiveret." #~ msgid "Reset to Default" #~ msgstr "Sæt tilbage til standard" #~ msgid "_New Playlist..." #~ msgstr "Ny afspilnings_liste" #~ msgid "Notification" #~ msgstr "Notifikation" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Hverken Python 2.5 eller python-elementtree blev fundet, audioscrobbler " #~ "understøttelse deaktiveret." #~ msgid "Audioscrobbler Verification" #~ msgstr "Audioscrobbler verifikation" #~ msgid "Update library for selected item(s)" #~ msgstr "Opdater bibliotek for de valgte mapper" #~ msgid "_Shuffle" #~ msgstr "Tilfæl_dig rækkefølge" #~ msgid "Toggle shuffle mode" #~ msgstr "Slå tilfældig rækkefølge til eller fra" #~ msgid "Not connected" #~ msgstr "Ikke forbundet" #~ msgid "Press enter to search for these terms." #~ msgstr "Tryk enter for at søge efter disse ord." #~ msgid "Add new profile" #~ msgstr "Tilføj ny profil" #~ msgid "Remove current profile" #~ msgstr "Slet nuværende profil" #~ msgid "Play enqueued files on activate" #~ msgstr "Afspil filer når de bliver indsat i afspilningskøen." #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "Afspil automatisk sange når de bliver indsat i afspilningskøen." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Tilføj valgte sange eller mapper" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Erstat med valgte sange eller mapper" #~ msgid "Add to _Queue" #~ msgstr "Tilføj til _afspilningskø" #~ msgid "Remove from _Queue" #~ msgstr "Fjern fra _afspilningskø" #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Tilføj valgte sange til afspilningskøen" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Fjern de valgte sange fra afspilningskøen" #~ msgid "seconds" #~ msgstr "sekunder" #~ msgid "Song Info..." #~ msgstr "_Sanginformationer" #~ msgid "Click to collapse the player" #~ msgstr "Klik for at folde afspilleren sammen" #~ msgid "Click to expand the player" #~ msgstr "Klik for at folde afspilleren ud" #~ msgid "_Song Info" #~ msgstr "_Sanginformationer" #~ msgid "_Search..." #~ msgstr "Sø_g" #~ msgid "Remote only" #~ msgstr "Kun online" #~ msgid "Remote, then local" #~ msgstr "Online, derefter lokalt" #~ msgid "To save artwork as" #~ msgstr "For at gemme pladeomslag som" #~ msgid "Artwork Verification" #~ msgstr "Pladeomslags verifikation" #~ msgid "Switch to current playlist" #~ msgstr "Gå til nuværende afspilningsliste" #~ msgid "Toggle filter bar for jumping straight to track" #~ msgstr "" #~ "Vis eller skjul filterbar, beregnet på at kunne hoppe direkte til en sang." ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/de.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000113226�11255764730�0014531�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# translation of sonata.po to # German translations for Sonata package. # Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as Sonata package. # # Paul Johnson <thrillerator@googlemail.com>, 2007. # Sebastian Kemper <sebastian_ml@gmx.net>, 2007. # Sebastian Wicki <gandro@gmx.net>, 2008, 2009. msgid "" msgstr "" "Project-Id-Version: sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-03-23 19:23+0100\n" "Last-Translator: Sebastian Wicki <gandro@gmx.net>\n" "Language-Team: <de@li.org>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Über Sonata" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "Einstellungen" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Albumcover-Vollbildmodus" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Zum [1.-5.] Tab wechseln" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Mit MPD verbinden" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Von MPD trennen" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Aktuelle Wiedergabeliste zufällig anordnen" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Ansicht erweitern" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Zum vorherigen Tab wechseln" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Zum nächsten Tab wechseln" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Ansicht reduzieren" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "Bibliothek durchsuchen" #: .././sonata/about.py:64 msgid "Quit" msgstr "Beenden" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Gesamte Bibliothek aktualisieren" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Kontextmenü anzeigen" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Ins Benachrichtigungsfeld minimieren (falls aktiviert)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Vorheriger Titel" #: .././sonata/about.py:70 msgid "Next track" msgstr "Nächster Titel" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Abspielen/Anhalten" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stopp" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Lautstärke verringern" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Lautstärke erhöhen" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Markiertes Lied abspielen" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Markierte(s) Lied(er) entfernen" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Zum aktuellen Lied springen" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Metadaten der ausgewählten Lieder bearbeiten" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Als neue Wiedergabeliste speichern" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Wiedergabeliste leeren" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Wiedergabeliste zufällig anordnen" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Markierte(s) Lied(er) hinzufügen oder Verzeichnis öffnen" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Ins übergeordnete Verzeichnis gehen" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Markierte(s) Element(e) entfernen" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Mit markierten Element(en) ersetzten" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Markierte(s) Element(e) hinzufügen und abspielen" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Mit markierten Element(en) ersetzen und abspielen" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Markierte Element(e)/Pfad(e) aktualisieren" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Markierte Wiedergabeliste(n) hinzufügen" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Markierte Wiedergabeliste(n) entfernen" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Mit markierten Wiedergabeliste(n) ersetzen" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Markierte Wiedergabeliste(n) hinzufügen und abspielen" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Mit markierten Wiedergabeliste(n) ersetzen und abspielen" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Markierte(r) Audio-Stream(s) hinzufügen" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Markierte(r) Audio-Stream(s) entfernen" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Mit markierten Audio-Stream(s) ersetzen" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Markierte(r) Audio-Stream(s) hinzufügen und abspielen" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Mit markierten Audio-Stream(s) ersetzen und abspielen" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Metadaten des aktuellen Liedes bearbeiten" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Wichtigste Tastenkürzel" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Tastenkürzel für die Wiedergabe" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Tastenkürzel für die aktuelle Wiedergabeliste" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Tastenkürzel für die Bibliothek" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Tastenkürzel für Wiedergabelisten" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Tastenkürzel für Audio-Streams" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Tastenkürzel für die Titelinfo" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Tastenkürzel" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Ein eleganter MPD-Client." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Tastenkürzel" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Es konnte keinen passender Browser gestartet werden." #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Browser starten" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Das toggle- und das popup-Argument benötigen D-Bus. Abbruch." #: .././sonata/cli.py:97 msgid "Version" msgstr "Version" #: .././sonata/cli.py:98 msgid "Website" msgstr "Webseite" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Aufruf: sonata [OPTION]... [BEFEHL]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Optionen" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Diese Meldung anzeigen und beenden" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Benachrichtigung bei Liedwechsel (benötigt D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Wechselt zwischen Minimierung ins Benachrichtigungsfeld" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "und der Anzeige auf der Arbeitsfläche (benötigt D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Nicht starten, wenn D-Bus-Befehle fehlschlagen" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Versionsnummer anzeigen und beenden" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Anwendung versteckt starten (benötigt Benachrichtigungsfeld)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Anwendung sichtbar starten (benötigt Benachrichtigungsfeld)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Starte mit Profil [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Befehle" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Titel in der Wiedergabeliste abspielen" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Aktuellen Titel anhalten" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Wiedergabe beenden" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Nächsten Titel der Wiedergabelist abspielen" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Vorherigen Titel der Wiedergabeliste abspielen" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Zwischen Wiedergabe und Pause umschalten; startet Wiedergabe falls gestoppt" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Wiederholen umschalten" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Zufällige Wiedergabe umschalten" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Informationen über aktuellen Titel anzeigen" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "MPD-Status anzeigen" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Starte Sonata mit Profil %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d ist keine verfügbare Profilnummer" #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Profilnummern müssen zwischen 1 und %d liegen." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python ist nicht in der Lage %s als Nummer zu interpretieren." #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "Standard-Profil" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr "von" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "aus" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "Keine Verbindung zu MPD möglich.\n" "Bitte überprüfen Sie ihre Einstellungen oder die MPD_HOST/MPD_PORT Umgebungsvariablen." #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Titel" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Künstler" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "Jahr" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Titel-Nr." #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Genre" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Datei" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "Dauer" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitrate" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD gestoppt" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "Status" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Wiedergabe" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pause" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "Angehalten" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "Wiederholen" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "Aus" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "An" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "Zufällige Wiedergabe" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Lautstärke" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Crossfade" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "Sekunde" msgstr[1] "Sekunden" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Sonata konnte sich nicht mit D-Bus verbinden: Die Adresse des D-Bus wurde nicht gefunden. Hilfe finden Sie in den Handbüchern zu \"dbus-launch\" und \"dbus-daemon\"" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Konnte entfernten Befehl nicht ausführen." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Starte Sonata stattdessen..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Möglicherweise läuft Sonata nicht?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Eine Instanz von Sonata läuft bereits. Zeige sie..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Konnte entfernte Befehle nicht ausführen." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Liedinfo" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Öffne Künstler in Wikipedia" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Öffne Album in Wikipedia" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Zusätzliche Metadaten umschalten" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Metadaten bearbeiten" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Liedtext" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Lyricwiki.org nach Liextexten durchsuchen" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Liedtexte auf Lyricwiki.org bearbeiten" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Albuminfo" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "mehr" #: .././sonata/info.py:215 msgid "hide" msgstr "verstecken" #: .././sonata/info.py:281 msgid "edit tags" msgstr "Metadaten bearbeiten" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Albumname fehlt." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Albumname nicht gesetzt." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI nicht gefunden, das Laden der Liedtexte ist deaktiviert." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Künstler- oder Titelname fehlt." #: .././sonata/info.py:371 msgid "search" msgstr "suchen" #: .././sonata/info.py:372 msgid "edit" msgstr "bearbeiten" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Liedtext nicht gefunden" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Lade Liedtext ..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Keine Verbindung zu LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Laden des Liedtextes fehlgeschlagen" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Unmarkiert" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Verschiedene Künstler" #: .././sonata/library.py:49 msgid "Filename" msgstr "Dateiname" #: .././sonata/library.py:49 msgid "Everything" msgstr "Alles" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Dateisystem" #: .././sonata/library.py:53 msgid "Artists" msgstr "Künstler" #: .././sonata/library.py:54 msgid "Albums" msgstr "Alben" #: .././sonata/library.py:55 msgid "Genres" msgstr "Genres" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Suchkriterien" #: .././sonata/library.py:90 msgid "End Search" msgstr "Suche beenden" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Ansicht der Bibliothek" #: .././sonata/library.py:96 msgid "Search" msgstr "Suchen" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "Lied" msgstr[1] "Lieder" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "Minute" msgstr[1] "Minuten" #: .././sonata/library.py:849 msgid "Song" msgstr "Lied" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "Pfad" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Aktuell" #: .././sonata/main.py:103 msgid "Library" msgstr "Bibliothek" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Wiedergabelisten" #: .././sonata/main.py:105 msgid "Streams" msgstr "Audio-Streams" #: .././sonata/main.py:106 msgid "Info" msgstr "Info" #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Gesamtes Lied" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Liste sortieren" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Wiedergabeliste _speichern" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Verbindung" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Abspielen _nach" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "Akt_ualisieren" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "_Entferntes Cover verwenden..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "_Lokales Cover verwenden..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Vollbild-Modus" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Bild zurücksetzen" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Wiedergabe" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "Pa_use" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stopp" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Vorheriges" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Nächster" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Beenden" #: .././sonata/main.py:249 msgid "_Remove" msgstr "Ent_fernen" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Alle entfernen" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "_Gesamte Bibliothek" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "_Markierte Elemente" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Einstellungen..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_Über..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Metadaten bearbeiten..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Hinzufügen" #: .././sonata/main.py:257 msgid "_Replace" msgstr "Er_setzen" #: .././sonata/main.py:258 msgid "Add" msgstr "_Hinzufügen" #: .././sonata/main.py:259 msgid "Replace" msgstr "Ersetzen" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "Ent_fernen..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Zufällig" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "Sonata _anzeigen" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Wiederholen" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "_Zufällige Wiedergabe" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Nach Künstler" #: .././sonata/main.py:429 msgid "By Album" msgstr "Nach Album" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Nach Titel" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Nach Dateiname" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Nach Ordner- & Dateiname" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Invers" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "_Neu..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "Be_arbeiten..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Umbenennen..." #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "Wiedergabeliste" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "Mausklick für erweiterte Ansicht" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Mausklick für reduzierte Ansicht" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "Nicht verbunden" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Keine Lese-Berechtigung" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Album-Cover" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "Verbindung trennen" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Jahr" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Audio-Streams" #: .././sonata/main.py:1193 msgid "Len" msgstr "Länge" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Unbekannt" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "Tag" msgstr[1] "Tage" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "Stunde" msgstr[1] "Stunden" #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr "und" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(aktualisiere Datenbank)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Nach Liedtext suchen" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Suchen" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Künstler" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Liedtitel" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Bild öffnen" #: .././sonata/main.py:2379 msgid "Images" msgstr "Bilder" #: .././sonata/main.py:2383 msgid "All files" msgstr "Alle Dateien" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Cover auswählen" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "Aus_wählen" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Suchkriterien ändern" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Kein Künstler- oder Albumname gefunden." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Kein Cover gefunden." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Markierte Wiedergabeliste entfernen?" msgstr[1] "Markierte Wiedergabelisten entfernen?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Wiedergabeliste entfernen" msgstr[1] "Wiedergabelisten entfernen" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Markierter Audio-Stream entfernen?" msgstr[1] "Markierte Audio-Streams entfernen?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Audio-Stream entfernen" msgstr[1] "Audio-Streams entfernen" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "Um die Liedtexte im Musikordner zu speichern, müssen Sie einen gültigen Musikordner angeben." #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Musikordner-Überprüfung" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "Um die Cover im Musikordner zu speichern, müssen Sie einen gültigen Musikordner angeben." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "Album" msgstr[1] "Alben" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "Künstler" msgstr[1] "Künstler" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "Stunde Glückseligkeit" msgstr[1] "Stunden Glückseligkeit" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "Stunde Glückseligkeit" msgstr[1] "Stunden Glückseligkeit" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Wiedergabeliste speichern" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Möchten Sie die bestehende Wiedergabeliste ersetzen oder diese Lieder hinzufügen?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Existierende Wiedergabeliste" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Wiedergabeliste ersetzen" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Lieder hinzufügen" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Eine Wiedergabeliste mit diesem Namen existiert bereits. Möchten Sie diese ersetzen?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Name der Wiedergabeliste" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Wiedergabeliste umbenennen" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Benachrichtigungsfeld" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Oben links" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Oben rechts" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Unten links" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Unten rechts" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Bildschirmmitte" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD-Verbindung" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Name" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Host" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_Musikverzeichnis" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Musikverzeichnis auswählen" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "Pa_sswort" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Nur ausfüllen, falls ein Kennwort benötigt wird." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "_Automatisch beim Start verbinden" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "MPD_HOST/PORT verwenden" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "Extras" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "Ben_utzername:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Passwort:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "_Benachrichtigung bei Liedwechsel" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Übergangsdauer" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "Übergangs_dauer" #: .././sonata/preferences.py:213 msgid "sec" msgstr "s" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "C_rossfade" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "Anzeige" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "_Album-Cover" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standard" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Dekoriert" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Cover-Stil:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Nur lokal" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Lokal und entfernt" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Suchorte:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "LIED_VERZ" #: .././sonata/preferences.py:269 msgid "custom" msgstr "benutzerdefiniert" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Cover speichern in:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Wiedergabe-/Lautstärkeknöpfe" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "F_ortschrittsbalken" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "_Statusleiste" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "_Liedtexte" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Liedtexte speichern in:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "_Benachrichtigungsfeld-Symbol" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Fensterverhalten" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "Fenster auf a_llen Arbeitsflächen anzeigen" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "Fenster immer im _Vordergrund behalten" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "Fenstertitel ve_rstecken" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "Bei Schließen/Escape ins Benachrichtigungsfeld _minimieren" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "Falls aktiviert, wird Sonata beim Schließen des Fensters ins Benachrichtigungsfeld minimiert. Leider hat Sonata derzeit keine Möglichkeit, um herauszufinden, ob ein Benachrichtigungsfeld existiert. Aktivieren Sie diese Einstellung deshalb nur dann, wenn Ihre Arbeitsfläche ein solches besitzt." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Verschiedenes" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "_Bibliothek beim Start aktualisieren" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "Falls aktiviert, wird Sonata die Bibliothek automatisch nach jedem Start aktualisieren" #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "Wiedergabe beim Beenden s_toppen" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD erlaubt die Wiedergabe auch dann, wenn kein Client verbunden ist. Falls Sie diese Option aktivieren, verhält sich Sonata wie eine normale Audio-Anwendung, d.h. die Wiedergabe wird zeitgleich mit Sonata beendet." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "Status_datei schreiben:" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "Falls aktiviert, wird Sonata eine XMMS-Infopipe-ähnliche Datei erstellen, welche Informationen über den aktuellen Titel beinhaltet. Viele Anwendungen unterstützen dieses Format (Instant Messenger, IRC-Clients, ...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Formatierung der Titel" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "A_ktuelle Wiedergabeliste:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Bibliothek:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Fenstertitel:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Aktueller _Titel Zeile 1:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Aktueller T_itel Zeile 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Verfügbare Platzhalter" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Künstler" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Album" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Liedname" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Titel-Nr." #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "CD Nr." #: .././sonata/preferences.py:433 msgid "File path" msgstr "Dateipfad" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Dateiname" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "Stream-Name" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Dauer" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Abgelaufene Zeit (nur Fenstertitel)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Nur angezeigen, wenn alle eingeschlossenen Daten vorhanden" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Erzeugt Spalten in der Wiedergabeliste" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_Über..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Konfigurieren..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Geladen" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Beschreibung" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Verhalten" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Format" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Neues Profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Eigenes Cover" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Cover-Dateiname" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Stream bearbeiten" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "Neuer Stream" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "Stream-URL" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Ein Stream mit diesem Namen existiert bereits. Möchten Sie ihn ersetzen?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Taglib und/oder tagpy nicht gefunden. Bearbeiten der Metadaten deaktiviert." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Metadaten bearbeiten" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Taglib Version < 0.91. Bitte auf neuere Version aktualisieren, Metadaten-Bearbeitung deaktiviert." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Der Pfad" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "existiert nicht. Bitte in den Einstellungen einen gültigen Musikordner eintragen." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Datei " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "existiert nicht. Bitte in den Einstellungen einen gültigen Musikordner eintragen." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Keine Musikdateien mit editierbaren Metadaten gefunden." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Kommentar" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "_Alle speichern" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Alle ausgewählten Dateien, beginnend mit dieser Datei, inkrementell nummerieren." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Auf alle ausgewählten Dateien anwenden." #: .././sonata/tagedit.py:260 msgid "of" msgstr "von" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Konnte Metadaten nicht speichern." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Dateipfad verstecken" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Dateipfad anzeigen" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/el_GR.po��������������������������������������������������������������������������0000664�0000000�0000000�00000136270�11255764730�0015135�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Greek translation of sonata music client for musicpd. # Copyright (C) 2008 Lazaros Koromilas. # This file is distributed under the same license as the sonata package. # Lazaros Koromilas <koromilaz@gmail.com>, 2008. # msgid "" msgstr "" "Project-Id-Version: sonata-1.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-04-06 17:42+0300\n" "PO-Revision-Date: 2009-04-06 17:35+0200\n" "Last-Translator: Lazaros Koromilas <koromilaz@gmail.com>\n" "Language-Team: noteam\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-Language: Greek\n" "X-Poedit-Country: Greece\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:54 msgid "About Sonata" msgstr "Σχετικά με το Sonata" #: .././sonata/about.py:55 .././sonata/preferences.py:96 msgid "Preferences" msgstr "Προτιμίσεις" #: .././sonata/about.py:56 msgid "Fullscreen Artwork Mode" msgstr "Λειτουργία Πλήρους Οθόνης Εξωφύλλου" #: .././sonata/about.py:57 msgid "Switch to [1st-5th] tab" msgstr "Αλλαγή στην [1η-5η] καρτέλα" #: .././sonata/about.py:58 msgid "Connect to MPD" msgstr "Σύνδεση με το MPD" #: .././sonata/about.py:59 msgid "Disconnect from MPD" msgstr "Αποσύνδεση από το MPD" #: .././sonata/about.py:60 msgid "Randomize current playlist" msgstr "Ανακάτεμα τρέχουσας λίστας κομματιών" #: .././sonata/about.py:61 msgid "Expand player" msgstr "Επέκταση προγράμματος αναπαραγωγής" #: .././sonata/about.py:62 msgid "Switch to previous tab" msgstr "Εναλλαγή στην προηγούμενη καρτέλα" #: .././sonata/about.py:63 msgid "Switch to next tab" msgstr "Εναλλαγή στην επόμενη καρτέλα" #: .././sonata/about.py:64 msgid "Collapse player" msgstr "Αναδίπλωση προγράμματος αναπαραγωγής" #: .././sonata/about.py:65 .././sonata/library.py:79 msgid "Search library" msgstr "Αναζήτηση στη βιβλιοθήκη" #: .././sonata/about.py:66 msgid "Quit" msgstr "Κλείσιμο" #: .././sonata/about.py:67 msgid "Update entire library" msgstr "Ανανέωση ολόκληρης της βιβλιοθήκης" #: .././sonata/about.py:68 msgid "Display popup menu" msgstr "Εμφάνιση αναδυώμενων μενού" #: .././sonata/about.py:69 msgid "Minimize to system tray (if enabled)" msgstr "Ελαχιστοποίηση στην μπάρα εργασιών (εάν είναι ενεργοποιημένη)" #: .././sonata/about.py:71 msgid "Previous track" msgstr "Προηγούμενο κομμάτι" #: .././sonata/about.py:72 msgid "Next track" msgstr "Επόμενο κομμάτι" #: .././sonata/about.py:73 msgid "Play/Pause" msgstr "Αναπαραγωγή/Παύση" #: .././sonata/about.py:74 msgid "Stop" msgstr "Διακοπή" #: .././sonata/about.py:75 msgid "Lower the volume" msgstr "Μείωση της έντασης" #: .././sonata/about.py:76 msgid "Raise the volume" msgstr "Αύξηση της έντασης" #: .././sonata/about.py:78 msgid "Play selected song" msgstr "Αναπαραγωγή επιλεγμένου τραγουδιού" # translating to plural only because conditional singular is optically ugly: # `Αφαίρεση επιλεγμέν-ου/-ων κοματι-ού/-ών' #: .././sonata/about.py:79 msgid "Remove selected song(s)" msgstr "Αφαίρεση επιλεγμένων κοματιών" #: .././sonata/about.py:80 msgid "Center currently playing song" msgstr "Τοποθέτηση τρέχοντος τραγουδιού στο κέντρο" #: .././sonata/about.py:81 .././sonata/about.py:90 msgid "Edit selected song's tags" msgstr "Επεξεργασία ετικετών των επιλεγμένων κομματιών" #: .././sonata/about.py:82 msgid "Save to new playlist" msgstr "Αποθήκευση σε νέα λίστα κομματιών" #: .././sonata/about.py:83 msgid "Clear list" msgstr "Καθαρισμός λίστας" #: .././sonata/about.py:84 msgid "Randomize list" msgstr "Ανακάτεμα λίστας" #: .././sonata/about.py:86 msgid "Add selected song(s) or enter directory" msgstr "Προσθήκη επιλεγμένων τραγουδιών ή είσοδος στον κοτάλογο" # free interpretation, translated as `up one dir' #: .././sonata/about.py:87 msgid "Go to parent directory" msgstr "Επάνω κατα έναν κατάλογο" #: .././sonata/about.py:88 msgid "Add selected item(s)" msgstr "Προσθήκη επιλεγμένων αντικειμένων" #: .././sonata/about.py:89 msgid "Replace with selected item(s)" msgstr "Αντικατάσταση με τα επιλεγμένα αντικείμενα" #: .././sonata/about.py:91 msgid "Add selected item(s) and play" msgstr "Προσθήκη επιλεγμένων αντικειμένων και αναπαραγωγή" #: .././sonata/about.py:92 msgid "Replace with selected item(s) and play" msgstr "Αντικατάσταση με τα επιλεγμένα αντικείμενα και αναπαραγωγή" #: .././sonata/about.py:93 msgid "Update selected item(s)/path(s)" msgstr "Ανανέωση επιλεγμένων αντικειμένων/μονοπατιών" #: .././sonata/about.py:95 .././sonata/about.py:97 msgid "Add selected playlist(s)" msgstr "Προσθήκη επιλεγμένων λιστών κομματιών" #: .././sonata/about.py:96 msgid "Remove selected playlist(s)" msgstr "Αφαίρεση επιλεγμένων λιστών κομματιών" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s)" msgstr "Αντικατάσταση με τις επιλεγμένες λίστες κομματιών«" #: .././sonata/about.py:99 msgid "Add selected playlist(s) and play" msgstr "Προσθήκη επιλεγμένων λιστών κομματιών και αναπαραγωγή" #: .././sonata/about.py:100 msgid "Replace with selected playlist(s) and play" msgstr "Αντικατάσταση με τις επιλεγμένες λίστες κομματιών και αναπαραγωγή" #: .././sonata/about.py:102 .././sonata/about.py:104 msgid "Add selected stream(s)" msgstr "Προσθήκη επιλεγμένων μεταδόσεων" #: .././sonata/about.py:103 msgid "Remove selected stream(s)" msgstr "Αφαίρεση επιλεγμένων μεταδόσεων" #: .././sonata/about.py:105 msgid "Replace with selected stream(s)" msgstr "Αντικατάσταση με τις επιλεγμένες μεταδόσεις" #: .././sonata/about.py:106 msgid "Add selected stream(s) and play" msgstr "Προσθήκη επιλεγμένων μεταδόσεων και αναπαραγωγή" #: .././sonata/about.py:107 msgid "Replace with selected stream(s) and play" msgstr "Αντικατάσταση με τις επιλεγμένες μεταδόσεις και αναπαραγωγή" #: .././sonata/about.py:109 msgid "Edit playing song's tags" msgstr "Επεξεργασία ετικετών αναπαραγώμενων τραγουδιών" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:112 msgid "Main Shortcuts" msgstr "Κύριες Συντομεύσεις" #: .././sonata/about.py:113 msgid "Playback Shortcuts" msgstr "Συντομεύσεις Αναπαραγωγής" #: .././sonata/about.py:114 msgid "Current Shortcuts" msgstr "Συντομεύσεις Τρέχουσας Λίστας" #: .././sonata/about.py:115 msgid "Library Shortcuts" msgstr "Συντομεύσεις Βιβλιοθήκης" #: .././sonata/about.py:116 msgid "Playlist Shortcuts" msgstr "Συντομεύσεις Λιστών Κομματιών" #: .././sonata/about.py:117 msgid "Stream Shortcuts" msgstr "Συντομεύσεις Μεταδόσεων" #: .././sonata/about.py:118 msgid "Info Shortcuts" msgstr "Συντομεύσεις Πληροφοριών" #: .././sonata/about.py:119 msgid "Shortcuts" msgstr "Συντομεύσεις" #. XXX translate expressions, not words #. Show text: #: .././sonata/about.py:147 .././sonata/library.py:859 #: .././sonata/main.py:1744 msgid "song" msgid_plural "songs" msgstr[0] "τραγούδι" msgstr[1] "τραγούδια" # decided to use the foreign word, so no plural in greek #: .././sonata/about.py:148 msgid "album" msgid_plural "albums" msgstr[0] "άλμπουμ" msgstr[1] "άλμπουμ" #: .././sonata/about.py:149 msgid "artist" msgid_plural "artists" msgstr[0] "καλλιτέχνης" msgstr[1] "καλλιτέχνες" #: .././sonata/about.py:156 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "μέρα ευτυχίας" msgstr[1] "μέρες ευτυχίας" #: .././sonata/about.py:158 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "ώρα ευτυχίας" msgstr[1] "ώρες ευτυχίας" #: .././sonata/about.py:172 msgid "An elegant music client for MPD." msgstr "Ένα κομψό πρόγραμμα/πελάτης μουσικής για το MPD." #. Add button to show keybindings: #: .././sonata/about.py:185 msgid "_Shortcuts" msgstr "_Συντομεύσεις" #: .././sonata/about.py:196 .././sonata/main.py:3091 #: .././sonata/preferences.py:871 msgid "Unable to launch a suitable browser." msgstr "Δεν ήταν δυνατή η εκκίνηση ενός κατάλληλου περιηγητή." #: .././sonata/about.py:196 .././sonata/main.py:3091 #: .././sonata/preferences.py:871 msgid "Launch Browser" msgstr "Εκκίνηση Περιηγητή" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "" "Οι παράμετροι εναλλαγής και ανάδυσης προϋποθέτουν την ύπαρξη του D-Bus. " "Αποτυχία." #: .././sonata/cli.py:97 msgid "Version" msgstr "Έκδοση" #: .././sonata/cli.py:98 msgid "Website" msgstr "Ιστοσελίδα" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Χρήση: sonata [ΕΠΙΛΟΓΗ]... [ΕΝΤΟΛΗ]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Επιλογές" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Εμφάνιση της βοήθειας και έξοδος" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Ανάδυση ειδοποίησης τραγουδιού (προϋποθέτει το D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Εναλλαγή της εφαρμογής σε ελαχιστοποιημένη" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "στην μπάρα εργασών ή ορατή (προϋποθέτει το DBus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Μη εκκίνηση της εφαρμογής αν οι D-Bus εντολές αποτυγχάνουν" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Εμφάνιση πληροφοριών έκδοσης και έξοδος" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Εκκίνηση σε απόκρυψη (προϋποθέτει μπάρα εργασιών)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Εκκίνηση ορατό (προϋποθέτει μπάρα εργασιών)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Εκκίνηση με προφίλ [ΑΡΙΘΜΟΣ]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Εντολές" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Αναπαραγωγή τραγουδιού στην λίστα κομματιών" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Παύση τρέχοντος αναπαραγώμενου τραγουδιού" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Διακοπή τρέχοντος αναπαραγώμενου τραγουδιού" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Αναπαραγωγή του επόμενου τραγουδιού στην λίστα κομματιών" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Αναπαραγωγή του προηγούμενου τραγουδιού στην λίστα κομματιών" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Εναλλαγή αναπαραγωγής/παύσης. Αναπαραγωγή από στάσιμο" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Εναλλαγή λειτουργίας επανάληψης" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Εναλλαγή λειτουργίας επανάληψης" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Εμφάνιση πληροφοριών τρέχοντος τραγουδιού" # status tretated as `state' #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Εμφάνιση κατάστασης του MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Εκκίνηση του Sonata με το προφίλ %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "Το %d δεν είναι διαθέσιμος αριθμός προφίλ." #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Οι αριθμοί προφίλ πρέπει να είναι μεταξύ του 1 και %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Ήταν αδύνατη η μεταγλώτιση του %s ως αριθμού." #: .././sonata/cli.py:154 .././sonata/main.py:177 msgid "Default Profile" msgstr "Προεπιλεγμένο Προφίλ" #: .././sonata/cli.py:154 .././sonata/main.py:177 msgid "by" msgstr "από" #: .././sonata/cli.py:154 .././sonata/main.py:177 msgid "from" msgstr "στο" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Αδύνατη η σύνδεση στο MPD.\n" "Παρακαλώ ελέγξτε τις ρυθμίσεις του Sonata ή τις μεταβλητές περιβάλλοντος " "MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 .././sonata/info.py:90 .././sonata/library.py:45 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Τίτλος" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/library.py:45 #: .././sonata/main.py:1168 .././sonata/tagedit.py:126 msgid "Artist" msgstr "Καλλιτέχνης" #: .././sonata/cli.py:210 .././sonata/info.py:93 .././sonata/library.py:45 #: .././sonata/main.py:1169 .././sonata/main.py:2420 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Άλμπουμ" #: .././sonata/cli.py:211 .././sonata/info.py:95 msgid "Date" msgstr "Ημερομηνία" #: .././sonata/cli.py:212 .././sonata/info.py:96 .././sonata/main.py:1170 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Κομμάτι" #: .././sonata/cli.py:213 .././sonata/info.py:97 .././sonata/library.py:45 #: .././sonata/main.py:1173 .././sonata/preferences.py:557 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Είδος" #: .././sonata/cli.py:214 .././sonata/info.py:98 .././sonata/main.py:1175 msgid "File" msgstr "Αρχείο" # meaning length #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Διάρκεια" #: .././sonata/cli.py:222 .././sonata/info.py:99 msgid "Bitrate" msgstr "Ρυθμός Δεδομένων" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD στάσιμο" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Κατάσταση" # like `in play' #: .././sonata/cli.py:228 msgid "Playing" msgstr "Σε αναπαραγωγή" # like `in pause' #: .././sonata/cli.py:230 msgid "Paused" msgstr "Σε παύση" #: .././sonata/cli.py:232 .././sonata/main.py:561 .././sonata/main.py:566 #: .././sonata/main.py:1817 .././sonata/main.py:1828 msgid "Stopped" msgstr "Στάσιμο" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Επανάληψη" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Ανενεργό" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Ενεργό" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Τυχαία" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Ένταση" # descriptive translation #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Ομαλή μετάβαση κομματιών" #: .././sonata/cli.py:242 .././sonata/preferences.py:277 msgid "second" msgid_plural "seconds" msgstr[0] "δευτερόλεπτο" msgstr[1] "δευτερόλεπτα" #: .././sonata/current.py:64 msgid "Filter" msgstr "Φίλτρο" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Το Sonata απέτυχε να συνδεθεί με τη λεωφόρο του D-BUS: Δεν ήταν δυνατός ο " "προσδιορισμός της διεύθυνσης της λεωφόρου μηνυμάτων (δοκιμάστε 'man dbus-" "launch' και 'man dbus-daemon' για βοήθεια)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Αποτυχία εκτέλεσης απομακρυσμένων εντολής." #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Εκκίνηση του Sonata στη θέση του..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Ίσως ένα στιγμιότυπο του Sonata τρέχει ήδη?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Ίσως ένα στιγμιότυπο του Sonata τρέχει ήδη." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Αποτυχία εκτέλεσης απομακρυσμένων εντολών." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Πληροφορίες Τραγουδιού" #: .././sonata/info.py:92 msgid "Launch artist in Wikipedia" msgstr "Άνοιγμα καλλιτέχνη στην Wikipedia" #: .././sonata/info.py:94 msgid "Launch album in Wikipedia" msgstr "Άνοιγμα άλμπουμ στην Wikipedia" #: .././sonata/info.py:128 msgid "Toggle extra tags" msgstr "Εναλλαγή επιπλέον ετικετών" #: .././sonata/info.py:131 msgid "Edit song tags" msgstr "Επεξεργασία ετικετών τραγουδιού" #. Lyrics #: .././sonata/info.py:141 msgid "Lyrics" msgstr "Στίχοι" #: .././sonata/info.py:153 msgid "Search Lyricwiki.org for lyrics" msgstr "Αναζήτηση στο Lyricwiki.org για στίχους" #: .././sonata/info.py:154 msgid "Edit lyrics at Lyricwiki.org" msgstr "Επεξεργασία στίχων στο Lyricwiki.org" #. Album info #: .././sonata/info.py:162 msgid "Album Info" msgstr "Πληροφορίες Άλμπουμ" #: .././sonata/info.py:214 .././sonata/info.py:219 msgid "more" msgstr "περισσότερα" #: .././sonata/info.py:216 msgid "hide" msgstr "απόκρυψη" #: .././sonata/info.py:282 msgid "edit tags" msgstr "επεξεργασία ετικετών" #: .././sonata/info.py:309 msgid "Album info not found." msgstr "Δεν βρέθηκαν πληροφορίες άλμπουμ." #: .././sonata/info.py:312 msgid "Album name not set." msgstr "Δεν αποδόθηκε όνομα άλμπουμ." #: .././sonata/info.py:326 msgid "ZSI not found, fetching lyrics support disabled." msgstr "Δεν βρέθηκε το ZSI, η προσκόμιση στίχων απενεργοποιήθηκε." #: .././sonata/info.py:331 msgid "Artist or song title not set." msgstr "Δεν αποδόθηκε καλλιτέχνης ή τίτλος τραγουδιού." #: .././sonata/info.py:373 msgid "search" msgstr "αναζήτηση" #: .././sonata/info.py:374 msgid "edit" msgstr "επεξεργασία" #: .././sonata/info.py:383 .././sonata/info.py:438 msgid "Lyrics not found" msgstr "Δεν βρέθηκαν στίχοι" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:403 msgid "Fetching lyrics..." msgstr "Προσκόμιση στίχων..." #: .././sonata/info.py:413 msgid "Couldn't connect to LyricWiki" msgstr "Αδύνατη η σύνδεση με το LyricWiki" #: .././sonata/info.py:441 msgid "Fetching lyrics failed" msgstr "Προσκόμιση στίχων απέτυχε" #: .././sonata/library.py:43 msgid "Untagged" msgstr "Χωρίς Ετικέτες" #: .././sonata/library.py:44 msgid "Various Artists" msgstr "Διάφοροι Καλλιτέχνες" #: .././sonata/library.py:45 msgid "Filename" msgstr "Όνομα αρχείου" #: .././sonata/library.py:45 msgid "Everything" msgstr "Όλα" #: .././sonata/library.py:77 msgid "Search terms" msgstr "Όροι αναζήτησης" #: .././sonata/library.py:83 msgid "End Search" msgstr "Τέλος Αναζήτησης" #: .././sonata/library.py:85 msgid "Library browsing view" msgstr "Όψη περιήγησης βιβλιοθήκης" #. disabled as breadcrumbs replace this: #. self.searchbox.pack_start(self.libraryview, False, False, 1) #. self.searchbox.pack_start(gtk.VSeparator(), False, False, 2) #: .././sonata/library.py:89 msgid "Search" msgstr "Αναζήτηση" #: .././sonata/library.py:110 msgid "Filesystem" msgstr "Σύστημα Αρχείων" #: .././sonata/library.py:112 msgid "Albums" msgstr "Άλμπουμ" #: .././sonata/library.py:114 msgid "Artists" msgstr "Καλλιτέχνες" #: .././sonata/library.py:116 msgid "Genres" msgstr "Είδη" #. add the views button first #: .././sonata/library.py:376 msgid " v " msgstr " v " #: .././sonata/library.py:859 .././sonata/main.py:1738 msgid "minute" msgid_plural "minutes" msgstr[0] "λεπτό" msgstr[1] "λεπτά" #: .././sonata/library.py:947 msgid "Song" msgstr "Τραγούδι" #: .././sonata/library.py:947 .././sonata/main.py:1174 msgid "Path" msgstr "Μονοπάτι" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Τρέχουσα Λίστα" #: .././sonata/main.py:103 msgid "Library" msgstr "Βιβλιοθήκη" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Λίστες Κομματιών" #: .././sonata/main.py:105 msgid "Streams" msgstr "Μεταδώσεις" #: .././sonata/main.py:106 msgid "Info" msgstr "Πληροφορίες" #: .././sonata/main.py:137 .././sonata/preferences.py:278 #: .././sonata/preferences.py:279 msgid "Entire song" msgstr "Ολόκληρο τραγούδι" #: .././sonata/main.py:235 msgid "_Sort List" msgstr "_Ταξινόμηση Λίστας" #: .././sonata/main.py:236 msgid "Sa_ve List to" msgstr "Α_ποθήκευση Λίστας σε" #: .././sonata/main.py:237 msgid "_Connection" msgstr "_Σύνδεση" #: .././sonata/main.py:238 msgid "P_lay after" msgstr "Αναπαραγωγή _μετά" #: .././sonata/main.py:239 .././sonata/main.py:2434 msgid "_Update" msgstr "Α_νανέωση" #: .././sonata/main.py:240 msgid "Use _Remote Image..." msgstr "Χρήση _Απομακρυσμένης Εικόνας..." #: .././sonata/main.py:241 msgid "Use _Local Image..." msgstr "Χρήση _Τοπικής Εικόνας..." #: .././sonata/main.py:242 msgid "_Fullscreen Mode" msgstr "Λειτουργία _Πλήρους Οθόνης" #: .././sonata/main.py:243 msgid "Reset Image" msgstr "Επαναφορά Εικόνας" #: .././sonata/main.py:244 msgid "_Play" msgstr "_Αναπαραγωγή" #: .././sonata/main.py:245 msgid "Pa_use" msgstr "Παύση" #: .././sonata/main.py:246 msgid "_Stop" msgstr "_Διακοπή" #: .././sonata/main.py:247 msgid "Pre_vious" msgstr "Προηγούμενο" #: .././sonata/main.py:248 msgid "_Next" msgstr "_Επόμενο" #: .././sonata/main.py:249 msgid "_Quit" msgstr "Έξο_δος" #: .././sonata/main.py:250 msgid "_Remove" msgstr "_Αφαίρεση" #: .././sonata/main.py:251 msgid "_Clear" msgstr "Κα_θαρισμός" #: .././sonata/main.py:252 msgid "_Entire Library" msgstr "_Ολόκληρη Βιβλιοθήκης" #: .././sonata/main.py:253 msgid "_Selected Items" msgstr "Ε_πιλεγμένα Αντικείμενα" #: .././sonata/main.py:254 msgid "_Preferences..." msgstr "_Επιλογές..." #: .././sonata/main.py:255 msgid "_About..." msgstr "_Περί..." #: .././sonata/main.py:256 msgid "_Edit Tags..." msgstr "_Επεξεργασία Ετικετών..." #: .././sonata/main.py:257 msgid "_Add" msgstr "_Προσθήκη" #: .././sonata/main.py:258 msgid "_Replace" msgstr "_Αντικατάσταση" #: .././sonata/main.py:259 msgid "Add" msgstr "Προσθήκη" #: .././sonata/main.py:260 msgid "Replace" msgstr "Αντικατάσταση" #: .././sonata/main.py:261 msgid "_Delete..." msgstr "_Διαγραφή..." #: .././sonata/main.py:262 msgid "Shuffle" msgstr "Ανακάτεμα" #: .././sonata/main.py:287 msgid "S_how Sonata" msgstr "_Εμφάνιση του Sonata" #: .././sonata/main.py:288 msgid "_Repeat" msgstr "Επανά_ληψη" #: .././sonata/main.py:289 msgid "Rando_m" msgstr "Τ_υχαία" #: .././sonata/main.py:430 msgid "By Artist" msgstr "Ανά Καλλιτέχνη" #: .././sonata/main.py:431 msgid "By Album" msgstr "Ανά Δίσκο" #: .././sonata/main.py:432 msgid "By Song Title" msgstr "Ανά Τίτλο Τραγουδιού" #: .././sonata/main.py:433 msgid "By File Name" msgstr "Ανά Όνομα Αρχείου" #: .././sonata/main.py:434 msgid "By Dir & File Name" msgstr "Ανά Όνομα Καταλόγου & Αρχείου" #: .././sonata/main.py:435 msgid "Reverse List" msgstr "Αντιστροφή Λίστας" #: .././sonata/main.py:458 .././sonata/main.py:469 msgid "_New..." msgstr "_Νέο..." #: .././sonata/main.py:459 msgid "_Edit..." msgstr "_Επεξεργασία..." #: .././sonata/main.py:470 msgid "_Rename..." msgstr "_Μετονομασία..." #: .././sonata/main.py:532 .././sonata/main.py:599 .././sonata/main.py:600 msgid "Playlist" msgstr "Λίστα Κομματιών" #: .././sonata/main.py:562 .././sonata/main.py:1821 .././sonata/main.py:2030 msgid "Click to expand" msgstr "Κλικ για επέκταση" # using a word similar to unfold #: .././sonata/main.py:567 .././sonata/main.py:1819 .././sonata/main.py:2028 msgid "Click to collapse" msgstr "Κλικ για αναδίπλωση" #: .././sonata/main.py:572 .././sonata/main.py:1713 .././sonata/main.py:1824 msgid "Not Connected" msgstr "Μη Συνδεδεμένο" #: .././sonata/main.py:574 .././sonata/main.py:1711 .././sonata/main.py:1826 msgid "No Read Permission" msgstr "Χωρίς Δικαίωμα Ανάγνωσης" #: .././sonata/main.py:647 msgid "Cover Art" msgstr "Εξώφυλλο" #: .././sonata/main.py:860 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 msgid "Disconnect" msgstr "Αποσύνδεση" #: .././sonata/main.py:1171 .././sonata/main.py:1178 msgid "#" msgstr "Α/Α" #: .././sonata/main.py:1172 .././sonata/preferences.py:556 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Έτος" #: .././sonata/main.py:1176 msgid "Stream" msgstr "Μετάδωση" # length #: .././sonata/main.py:1177 msgid "Len" msgstr "Διάρκεια" #: .././sonata/main.py:1198 .././sonata/main.py:1205 .././sonata/main.py:1246 #: .././sonata/main.py:1253 msgid "Unknown" msgstr "Άγνωστο" #: .././sonata/main.py:1734 msgid "day" msgid_plural "days" msgstr[0] "μέρα" msgstr[1] "μέρες" #: .././sonata/main.py:1742 msgid "hour" msgid_plural "hours" msgstr[0] "ώρα" msgstr[1] "ώρες" #: .././sonata/main.py:1747 .././sonata/main.py:1749 msgid "and" msgstr "και" #: .././sonata/main.py:1757 msgid "(updating mpd)" msgstr "(ανανέωση του mpd)" #: .././sonata/main.py:2097 msgid "Lyrics Search" msgstr "Αναζήτηση Στίχων" #: .././sonata/main.py:2098 msgid "_Search" msgstr "Ανα_ζήτηση" #: .././sonata/main.py:2101 msgid "Artist Name" msgstr "Όνομα Καλλιτέχνη" #: .././sonata/main.py:2106 msgid "Song Title" msgstr "Τίτλος Τραγουδιού" #: .././sonata/main.py:2358 msgid "Open Image" msgstr "Άνοιγμα Εικόνας" #: .././sonata/main.py:2360 msgid "Images" msgstr "Εικόνες" #: .././sonata/main.py:2364 msgid "All files" msgstr "Όλα τα αρχεία" #: .././sonata/main.py:2406 msgid "Choose Cover Art" msgstr "Επιλογή Εξωφύλλου" #: .././sonata/main.py:2407 msgid "C_hoose" msgstr "Ε_πιλογή" #: .././sonata/main.py:2439 msgid "Edit search terms" msgstr "Επεξεργασία όρων αναζήτησης" #: .././sonata/main.py:2496 msgid "No artist or album name found." msgstr "Δεν βρέθηκε όνομα καλλιτέχνη ή άλμπουμ." #: .././sonata/main.py:2499 msgid "No cover art found." msgstr "Δεν βρέθηκε εξώφυλλο." #: .././sonata/main.py:2823 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Διαγραφή της επιλεγμένης λίστας κομματιών;" msgstr[1] "Διαγραφή των επιλεγμένων λιστών κομματιών;" #: .././sonata/main.py:2823 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Διαγραφή λίστας κομματιών" msgstr[1] "Διαγραφή λιστών κομματιών" #: .././sonata/main.py:2831 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Διαγραφή της επιλεγμένης μετάδοσης;" msgstr[1] "Διαγραφή των επιλεγμένων μεταδόσεων;" #: .././sonata/main.py:2831 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Διαγραφή μετάδοσης" msgstr[1] "Διαγραφή μεταδόσεων" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Αποθήκευση Λίστας Κομματιών" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" "Θα θέλατε να αντικαταστήσετε τιν υπάρχουσα λίστα κομματιών ή να προσθέσετε " "αυτά τα κομμάτια;" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Υπάρχουσα Λίστα Κομματιών" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Αντικατάσταση Λίστας Κομματιών" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Προσθήκη κομματιών" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "" "Μια λίστα κομματιών με αυτό το όνομα υπάρχει ήδη. Θέλετε να την " "αντικαταστήσετε;" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Όνομα λίστας κομματιών" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Μετονομασία Λίστας Κομματιών" #: .././sonata/preferences.py:27 msgid "System tray" msgstr "Μπάρα εργασιών" #: .././sonata/preferences.py:27 msgid "Top Left" msgstr "Πάνω Αριστερά" #: .././sonata/preferences.py:27 msgid "Top Right" msgstr "Πάνω Δεξιά" #: .././sonata/preferences.py:28 msgid "Bottom Left" msgstr "Κάτω Αριστερά" #: .././sonata/preferences.py:28 msgid "Bottom Right" msgstr "Κάτω Δεξιά" #: .././sonata/preferences.py:29 msgid "Screen Center" msgstr "Κέντρο Οθόνης" #: .././sonata/preferences.py:99 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:100 .././sonata/preferences.py:343 msgid "Display" msgstr "Εμφάνιση" #: .././sonata/preferences.py:101 msgid "Behavior" msgstr "Συμπεριφορά" #: .././sonata/preferences.py:102 msgid "Format" msgstr "Μορφοποίηση" #: .././sonata/preferences.py:103 .././sonata/preferences.py:245 msgid "Extras" msgstr "Πρόσθετα" #: .././sonata/preferences.py:128 msgid "MPD Connection" msgstr "Σύνδεση με το MPD" #: .././sonata/preferences.py:141 msgid "_Name" msgstr "Ό_νομα" #: .././sonata/preferences.py:144 msgid "_Host" msgstr "_Διακομιστής" #: .././sonata/preferences.py:147 msgid "_Port" msgstr "_Θύρα" #: .././sonata/preferences.py:151 msgid "_Music dir" msgstr "_Κατάλογος μουσικής" #: .././sonata/preferences.py:152 msgid "Select a Music Directory" msgstr "Επιλογή Καταλόγου Μουσικής" #: .././sonata/preferences.py:158 msgid "Pa_ssword" msgstr "Κω_δικός" # `required' translated as `needed' #: .././sonata/preferences.py:161 msgid "Leave blank if no password is required." msgstr "Κενό εάν ο κωδικός δεν είναι αναγκαίος." #: .././sonata/preferences.py:162 msgid "_Autoconnect on start" msgstr "_Αυτόματη σύνδεση κατα την εκκίνηση" #: .././sonata/preferences.py:182 msgid "Using MPD_HOST/PORT" msgstr "Χρήση " #: .././sonata/preferences.py:250 msgid "_Audioscrobbling (Last.fm)" msgstr "_Ανέβασμα επιλογών (Last.fm)" #: .././sonata/preferences.py:252 msgid "_Username:" msgstr "Όνομα _χρήστη:" #: .././sonata/preferences.py:253 msgid "_Password:" msgstr "Κω_δικός:" #: .././sonata/preferences.py:273 msgid "Popup _notification on song changes" msgstr "Ανάδυση ειδο_ποίησης σε αλλαγές τραγουδιού" #: .././sonata/preferences.py:299 msgid "Fade length" msgstr "Διάρκεια μετάβασης" #: .././sonata/preferences.py:300 msgid "_Fade length" msgstr "Διά_ρκεια μετάβασης" # abbreviation #: .././sonata/preferences.py:302 msgid "sec" msgstr "δευτ" # descriptive translation #: .././sonata/preferences.py:307 msgid "C_rossfade" msgstr "Ο_μαλή μετάβαση κομματιών" #: .././sonata/preferences.py:348 msgid "_Album art" msgstr "Ε_ξώφυλλο άλμπουμ" #: .././sonata/preferences.py:350 msgid "Standard" msgstr "Βασική" #: .././sonata/preferences.py:351 msgid "Stylized" msgstr "Μορφοποιημένη" #: .././sonata/preferences.py:356 msgid "Artwork style:" msgstr "Μορφή εξωφύλλων:" #: .././sonata/preferences.py:358 msgid "Local only" msgstr "Μόνο τοπικά" #: .././sonata/preferences.py:359 msgid "Local and remote" msgstr "Τοπικά και απομακρυσμένα" #: .././sonata/preferences.py:362 msgid "Search locations:" msgstr "Αναζήτηση τοποθεσιών:" #: .././sonata/preferences.py:369 .././sonata/preferences.py:396 msgid "SONG_DIR" msgstr "ΚΑΤΑΛΟΓΟΣ_ΤΡΑΓΟΥΔΙΩΝ" #: .././sonata/preferences.py:371 msgid "custom" msgstr "παραμετροποίηση" #: .././sonata/preferences.py:378 msgid "Save art to:" msgstr "Αποθήκευση εξωφύλλων σε:" #: .././sonata/preferences.py:383 msgid "_Playback/volume buttons" msgstr "_Κουμπιά αναπαραγωγής/έντασης" #: .././sonata/preferences.py:386 msgid "Pr_ogressbar" msgstr "Μπάρα _προόδου" #: .././sonata/preferences.py:389 msgid "_Statusbar" msgstr "Μπάρα _κατάστασης" #: .././sonata/preferences.py:392 msgid "Song Ly_rics" msgstr "Στί_χοι Τραγουδιού" #: .././sonata/preferences.py:394 msgid "Save lyrics to:" msgstr "Αποθήκευση στίχων σε:" #: .././sonata/preferences.py:405 msgid "System _tray icon" msgstr "Εικο_νίδιο μπάρας εργασιών" #: .././sonata/preferences.py:429 msgid "Window Behavior" msgstr "Συμπεριφορά Παραθύρου" #: .././sonata/preferences.py:433 msgid "_Show window on all workspaces" msgstr "Εμφάνιση παραθύρου σε όλες τις επιφάνειες εργασίας" #: .././sonata/preferences.py:436 msgid "_Keep window above other windows" msgstr "Παραμονή παραθύρου πάνω από τα άλλα παράθυρα" #: .././sonata/preferences.py:439 msgid "_Hide window titlebar" msgstr "Α_πόκρυψη τίτλου παραθύρου" # `escape' translated as `pressing Escape' #: .././sonata/preferences.py:442 msgid "_Minimize to system tray on close/escape" msgstr "" "Ε_λαχιστοπίηση στην μπάρα εργασιών κατά το κλείσιμο ή πάτημα του escape" #: .././sonata/preferences.py:444 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Εάν είναι ενεργοποιημένο, το κλείσιμο του Sonata θα το ελαχιστοποιεί στην " "μπάρα εργασιών. Σημειώστε ότι αυτή την στιγμή είναι αδύνατο να εντοπιστεί η " "ύπαρξη μπάρας εργασιών, οπότε επιλέξτε το άν έχετε μία." #: .././sonata/preferences.py:460 msgid "Miscellaneous" msgstr "Λοιπά" #: .././sonata/preferences.py:464 msgid "_Update MPD library on start" msgstr "_Ανανέωση της βιβλιοθήκης του MPD κατά την εκκίνηση" #: .././sonata/preferences.py:466 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Εάν είναι ενεργοποιημένο, το Sonata θα ανανεώνει την βιβλιοθήκη του MPD όταν " "ξεκινά." #: .././sonata/preferences.py:469 msgid "S_top playback on exit" msgstr "_Διακοπή αναπαραγωγής κατά την έξοδο" #: .././sonata/preferences.py:471 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "Το MPD επιτρέπει την αναπαραγωγή ακόμη κι αν το πρόγραμμα-πελάτης δεν είναι " "ανοιχτό. Εάν είναι ενεργοποιημένο, το Sonata θα συμπεριφέρεται σαν ένα " "περισσότερο συμβατικό πρόγραμμα αναπαραγωγής μουσικής και, αντιθέτως, θα " "σταματά την αναπαραγωγή με το που κλείνει." #: .././sonata/preferences.py:474 msgid "_Write status file:" msgstr "Εγγραφή αρχείου κατάστασης:" #: .././sonata/preferences.py:476 .././sonata/preferences.py:478 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Εάν είναι ενεργό, το Sonata θα δημιουργήσει ένα αρχείο xmms-infopipe το " "οποίο θα περιέχει πληροφορίες σχετικά με το τρέχον κομμάτι. Πολλές εφαρμογές " "υποστηρίζουν το αρχείο xmms-info (Προγράμματα Άμεσης Συνομιλίας, Προγράμματα-" "πελάτες IRC...)" #: .././sonata/preferences.py:512 msgid "Song Formatting" msgstr "Μορφοποίηση Τραγουδιού" #: .././sonata/preferences.py:517 msgid "C_urrent playlist:" msgstr "Τ_ρέχουσα λίστα κομματιών:" #: .././sonata/preferences.py:518 msgid "_Library:" msgstr "_Βιβλιοθήκη:" #: .././sonata/preferences.py:519 msgid "_Window title:" msgstr "_Τίτλος παραθύρου:" #: .././sonata/preferences.py:520 msgid "Current _song line 1:" msgstr "Γραμμή _τρέχοντος τραγουδιού 1:" #: .././sonata/preferences.py:522 msgid "Current s_ong line 2:" msgstr "Γραμμή τ_ρέχοντος τραγουδιού 2:" #: .././sonata/preferences.py:547 msgid "Available options" msgstr "Διαθέσιμες επιλογές" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:551 msgid "Artist name" msgstr "Όνομα καλλιτέχνη" #: .././sonata/preferences.py:552 msgid "Album name" msgstr "Όνομα άλμπουμ" #: .././sonata/preferences.py:553 msgid "Track name" msgstr "Όνομα κομματιού" #: .././sonata/preferences.py:554 msgid "Track number" msgstr "Αριθμός κομματιού" #: .././sonata/preferences.py:555 msgid "Disc number" msgstr "Αριθμός Δίσκου" #: .././sonata/preferences.py:558 msgid "File path" msgstr "Mονοπάτι αρχείου" #: .././sonata/preferences.py:559 msgid "File name" msgstr "Όνομα αρχείου" #: .././sonata/preferences.py:560 .././sonata/streams.py:107 msgid "Stream name" msgstr "Όνομα μετάδωσης" # translated as `duration' #: .././sonata/preferences.py:561 msgid "Song length" msgstr "Διάρκεια τραγουδιού" # descriptive translation #: .././sonata/preferences.py:562 msgid "Elapsed time (title only)" msgstr "Χρόνος που έχει αναπαραχθεί (μόνο στον τίτλο)" #: .././sonata/preferences.py:572 msgid "Info displayed only if all enclosed tags are defined" msgstr "" "Πληροφορίες που εμφανίζονται μόνο εάν όλες οι εσωκλειώμενες ετικέτες έχουν " "οριστεί" #: .././sonata/preferences.py:572 msgid "Creates columns in the current playlist" msgstr "Δημιουργεί στήλες στην τρέχουσα λίστα κομματιών" #: .././sonata/preferences.py:598 msgid "_About" msgstr "_Περί" #: .././sonata/preferences.py:601 msgid "_Configure..." msgstr "_Ρυθμίσεις..." #: .././sonata/preferences.py:641 msgid "Loaded" msgstr "Φορτώθηκε" #: .././sonata/preferences.py:649 msgid "Description" msgstr "Περιγραφή" #: .././sonata/preferences.py:666 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Για αποθήκευση στίχων στον κατάλογο του μουσικού αρχείου, πρέπει να " "προσδιοριστεί ένας νόμιμος μουσικός κοτάλογος." #: .././sonata/preferences.py:666 .././sonata/preferences.py:673 msgid "Music Dir Verification" msgstr "Επιβεβαίωση Μουσικού Καταλόγου" #: .././sonata/preferences.py:673 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Για αποθήκευση εξωφύλλων στον κατάλογο του μουσικού αρχείου, πρέπει να " "προσδιοριστεί ένας νόμιμος μουσικός κοτάλογος." #: .././sonata/preferences.py:738 msgid "New Profile" msgstr "Νέο Προφίλ" #. Prompt user for playlist name: #: .././sonata/preferences.py:792 msgid "Custom Artwork" msgstr "Παραμετροποιημένο Εξώφυλλο" #: .././sonata/preferences.py:794 msgid "Artwork filename" msgstr "Όνομα αρχείου εξωφύλλου" #: .././sonata/streams.py:103 msgid "Edit Stream" msgstr "Επεξεργασία" #: .././sonata/streams.py:105 .././sonata/streams.py:136 msgid "New Stream" msgstr "Νέα Μετάδωση" #: .././sonata/streams.py:114 msgid "Stream URL" msgstr "URL Μετάδωσης" #: .././sonata/streams.py:136 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "" "Μια μετάδωση με αυτό το όνομα υπάρχει ήδη. Θέλετε να την αντικαταστήσετε;" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "Το Taglib και/ή το tagpy δεν βρέθηκαν, η υποστήριξη επεξεργασίας ετικετών " "απενεργοποιήθηκε." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Επεξεργασία Ετικετών" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Η έκδοση του Tagpy είναι < 0.91. Παρακαλώ αναβαθμίστε σε νεότερη, η " "υποστήριξη επεξεργασίας ετικετών απενεργοποιήθηκε." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Το μονοπάτι" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "" "δεν υπάρχει. Παρακαλώ, προσδιορίστε έναν νόμιμο μουσικό κατάλογο στις " "προτιμήσεις." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Το αρχείο " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "" " δεν βρέθηκε. Παρακαλώ, προσδιορίστε έναν νόμιμο μουσικό κατάλογο στις " "προτιμήσεις." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Δεν βρέθηκαν μουσικά αρχεία με επεξεργάσιμες ετικέτες." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Σχόλιο" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Αποθήκευση Ό_λων" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Επαύξηση κάθε επιλεγμένου μουσικού αρχείου, ξεκινώντας από το κομμάτι 1 για " "αυτό το αρχείο." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Εφαρμογή σε όλα τα επιλεγμένα μουσικά αρχεία." #: .././sonata/tagedit.py:260 msgid "of" msgstr "από" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Αδύνατη η αποθήκευση ετικέτας στο μουσικό αρχείο." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Απόκρυψη μονοπατιού αρχείου" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Εμφάνιση μονοπατιού αρχείου" #~ msgid "Profile" #~ msgstr "Προφίλ" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Η επιλογή ανάδυσης προϋποθέτει την ύπαρξη του D-Bus. Αποτυχία." #~ msgid "_Update Path" #~ msgstr "Α_νανέωση Μονοπατιού" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Ιστοσελίδα: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Ενεργοποίηση του Audioscrobbler" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/es.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000125157�11255764730�0014556�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Spanish translation of Sonata # Copyright (C) 2007 Scott Horowitz # This file is distributed under the same license as the Sonata package. # Scott Horowitz <stonecrest@gmail.com> 2007. # Xoan Sampaiño <xoansampainho@gmail.com> # # msgid "" msgstr "" "Project-Id-Version: Sonata 1.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-03-24 10:01+0100\n" "Last-Translator: Xoan Sampaiño <xoansampainho@gmail.com>\n" "Language-Team: Spanish <es@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "A_cerca de Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Preferencias" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Modo pantalla completa con arte de portada" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Recorrer la [1ª-5ª] pestaña" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Conectar al servidor MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Desconectar del servidor MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Desordenar la lista de reproducción actual" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Expandir reproductor" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Cambiar a la pestaña anterior" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Cambiar a la pestaña siguiente" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Colapsar reproductor" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Buscar en la biblioteca" #: .././sonata/about.py:64 msgid "Quit" msgstr "Salir" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Actualizar la biblioteca completa" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Mostrar el menú contextual" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimizar al área de notificación (si está activado)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Canción anterior" #: .././sonata/about.py:70 msgid "Next track" msgstr "Siguiente canción" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Reproducir/Pausar" #: .././sonata/about.py:72 msgid "Stop" msgstr "Detener" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Bajar el volúmen" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Subir el volúmen" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Reproducir la canción seleccionada " #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Borrar las canciones seleccionadas" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Centrar la canción en reproducción" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Editar las etiquetas de las canciones seleccionadas" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Guardar en una lista de reproducción nueva" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Vaciar la lista de reproducción" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Desordenar la lista de reproducción" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Añadir la/s canción/es seleccionada/s o entrar al directorio" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Ir al directorio superior" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Añadir el/los elemento/s seleccionado/s" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Reemplazar con el/los elemento/s seleccionado/s" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Añadir el/los elemento/s seleccionado/s y reproducirlo/s" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Reemplazar con el/los elemento/s seleccionado/s y reproducirlo/s" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Actualizar el/los elemento/s seleccionado/s" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Añadir la/s lista/s de reproducción seleccionada/s" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Eliminar la/s lista/s de reproducción seleccionada/s" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Reemplazar con la/s lista/s de reproducción seleccionada/s" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Añadir la/s lista/s de reproducción seleccionada/s y reproducirla/s" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "" "Reemplazar con la/s lista/s de reproducción seleccionada/s y reproducirla/s" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Añadir el/los flujo/s seleccionado/s" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Borrar el/los flujo/s seleccionado/s" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Reemplazar con el/los flujo/s seleccionado/s" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Añadir el/los flujo/s seleccionado/s y reproducirlo/s" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Reemplazar con el/los flujo/s seleccionado/s y reproducirlo/s" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Editar las etiquetas de la canción en reproducción" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Principales" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Reproducción" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Lista de reproducción actual" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Biblioteca" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Listas de reproducción" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Flujos" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Información de la canción" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Atajos del teclado" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Un cliente elegante de música para MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Atajos del teclado" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "No se ha podido ejecutar ningún navegador." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Abrir navegador" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Los argumentos «toogle» y «popup» requieren «D-Bus». " "Abortando." #: .././sonata/cli.py:97 msgid "Version" msgstr "Versión" #: .././sonata/cli.py:98 msgid "Website" msgstr "Sitio web" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Uso: sonata [OPCIÓN]... [ORDEN]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Opciones" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Muestra este mensaje de ayuda y sale" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Mostrar una notificación con la canción (requiere D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Muestra/Oculta la aplicación en" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "el área de notificación (requiere D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "No iniciar la aplicación si fallan las órdenes de D-Bus" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Mustra información sobre la versión y sale" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Inicia la aplicación oculta (requiere un área de notificación)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Inicia la aplicación visible (requiere un área de notificación)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Iniciar con el perfil [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Órdenes" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Reproduce la canción en la lista de reproducción" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pausa la canción actual en reproducción" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Detiene la canción actual en reproducción" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Reproduce la siguiente canción en la lista de reproducción" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Reproduce la canción anterior en la lista de reproducción" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Activa/Desactiva la reproducción/pausa; reproduce si está detenido" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Activa/Desactiva el modo de repetición" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Activa/Desactiva el modo aleatorio" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Muestra la información de la canción actual" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Muestra el estado del servidor MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Iniciar Sonata usando el perfil %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "No hay un perfil disponible con el número %d." #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Los números de perfil deben estar comprendidos entre 1 y %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python no es capaz de interpretar %s como un número." #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Perfil predeterminado" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "por" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "de" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "No ha sido posible conectar con el servidor MPD.\n" "Por favor, revise las preferencias de Sonata o las variables de entorno " "MPD_HOST y MPD_PORT." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Título" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Artista" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Álbum" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Fecha" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Pista" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Estilo" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Fichero" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Tiempo" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Tasa de bits" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD parado" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Estado" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Reproduciendo" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pausado" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Detenido" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Repetir" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Desactivado" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Activado" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Aleatorio" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Volúmen" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Desvanecimiento" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "segundo" msgstr[1] "segundos" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filtro" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Se ha producido un error al conectar con el transporte de la sesión D-Bus: " "No se ha podido determinar la dirección del mensaje de transporte (intente " "'man dbus-launch' y 'man dbus-daemon' para obtener ayuda)." #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Ha fallado la ejecución de las órdenes remotas." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Iniciar Sonata en vez de..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Es posible que Sonata no se esté ejecutando." #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Ya se está ejecutando una instancia de Sonata. Mostrar..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Ha fallado la ejecución de la orden remota." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Información de la canción" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Información sobre el artista en Wikipedia" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Información sobre el álbum en Wikipedia" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Muestra/Oculta información extra" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Editar las etiquetas de la canción" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Letras" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Buscar letras de la canción en Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Editar la letra de la canción en Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Información del álbum" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "más" #: .././sonata/info.py:215 msgid "hide" msgstr "menos" #: .././sonata/info.py:281 msgid "edit tags" msgstr "editar etiquetas" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "No se ha encontrado información del álbum." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "No se ha especificado un nombre del álbum." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "" "No se ha encontrado ZSI, se ha desactivado el soporte para la descarga de " "letras." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "No se han especificado ningún artista o título de la canción." #: .././sonata/info.py:371 msgid "search" msgstr "buscar" #: .././sonata/info.py:372 msgid "edit" msgstr "editar" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "No se han encontrado letras" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Obteniendo letras..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "No se ha podido conectar a LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Ha fallado la obtención de letras" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Sin etiquetar" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Varios artistas" #: .././sonata/library.py:49 msgid "Filename" msgstr "Nombre del fichero" #: .././sonata/library.py:49 msgid "Everything" msgstr "Todo" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Sistema de ficheros" #: .././sonata/library.py:53 msgid "Artists" msgstr "Artistas" #: .././sonata/library.py:54 msgid "Albums" msgstr "Álbumes" #: .././sonata/library.py:55 msgid "Genres" msgstr "Estilos" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Términos de búsqueda" #: .././sonata/library.py:90 msgid "End Search" msgstr "Finalizar búsqueda" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Vista de la biblioteca" #: .././sonata/library.py:96 msgid "Search" msgstr "Buscar" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "canción" msgstr[1] "canciones" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuto" msgstr[1] "minutos" #: .././sonata/library.py:849 msgid "Song" msgstr "canción" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Ruta" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Actual" #: .././sonata/main.py:103 msgid "Library" msgstr "Biblioteca" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Listas de reproducción" #: .././sonata/main.py:105 msgid "Streams" msgstr "Flujos" #: .././sonata/main.py:106 msgid "Info" msgstr "Información de la canción" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Toda la canción" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Ordenar lista de reproducción" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Guardar lista de reproducción en" #: .././sonata/main.py:236 msgid "_Connection" msgstr "Conexión" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Reproducir después" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Actualizar" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Usar imagen _remota..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Usar imagen _local..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Pantalla completa" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Revertir imagen" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Reproducir" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "Pa_usar" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Detener" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Anterior" #: .././sonata/main.py:247 msgid "_Next" msgstr "Si_guiente" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Salir" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Quitar" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Limpiar" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "Toda la bibliot_eca" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "Elementos _seleccionados" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Preferencias..." #: .././sonata/main.py:254 msgid "_About..." msgstr "A_cerca de..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Editar etiquetas..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Añadir" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Reemplazar" #: .././sonata/main.py:258 msgid "Add" msgstr "Añadir" #: .././sonata/main.py:259 msgid "Replace" msgstr "Reemplazar" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Borrar..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Mezclar" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "_Mostrar Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Repetir" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "Alea_torio" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Por artista" #: .././sonata/main.py:429 msgid "By Album" msgstr "Por álbum" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Por título" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Por nombre del fichero" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Por directorio y nombre del fichero" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Invertir" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Nuevo..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Editar..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Renombrar..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Lista de reproducción" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Pulsar para expandir" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Pulsar para colapsar" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "No conectado" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Sin permisos de lectura" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Arte de _portada" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Perfil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "Servidor y puerto de MPD" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Desconectar" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Año" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Flujo" #: .././sonata/main.py:1193 msgid "Len" msgstr "Duración" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Desconocido" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "día" msgstr[1] "días" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "hora" msgstr[1] "horas" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "y" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(actualizando biblioteca)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Búsqueda de letras" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Buscar" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Nombre del artista" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Título de la canción" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Abrir imagen" #: .././sonata/main.py:2379 msgid "Images" msgstr "Imágenes" #: .././sonata/main.py:2383 msgid "All files" msgstr "Todos los ficheros" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Seleccione arte de portada" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "S_eleccione" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Editar términos de búsqueda" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "No se han encontrado artista o nombre del álbum." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "No se ha encontrado arte de portada." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "¿Borrar la lista de reproducción seleccionada?" msgstr[1] "¿Borrar las listas de reproducción seleccionadas?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Borrar lista de reproducción" msgstr[1] "Borrar listas de reproducción" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "¿Borrar el flujo seleccionado?" msgstr[1] "¿Borrar los flujos seleccionados?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Borrar flujo" msgstr[1] "Borrar flujos" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Para guardar las letras en el directorio de los ficheros de música, debe " "especificar un directorio de música válido." #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Verificación del directorio de música" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Para guardar los ficheros de arte de portada en el directorio de los " "ficheros de música, debe especificar un directorio de música válido." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "álbum" msgstr[1] "álbumes" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "artista" msgstr[1] "artistas" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "día de música" msgstr[1] "días de música" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "hora de música." msgstr[1] "horas de música." #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Guardar lista de reproducción" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" "¿Desea reempleazar la lista de reproducción existente o añadirle estas " "canciones?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Lista de reproducción existente" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Reemplazar lista de reproducción" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Añadir canciones" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "" "Ya existe una lista de reproducción con ese nombre. ¿Desea reemplazarla?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Nombre de la lista de reproducción" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Renombrar lista de reproducción" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "En el área de notificación" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Arriba a la izquierda" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Arriba a la derecha" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Abajo a la izquierda" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Abajo a la derecha" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "En el centro de la pantalla" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Conexión" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Nombre" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "Ser_vidor" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Puerto" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "Directorio de _música" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Seleccione un directorio de música" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "Contra_seña" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Deje en blanco si no se requiere contraseña." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "Conectar _automáticamente al iniciar" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Usando el servidor/puerto de MPD" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Extras" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Informe de canción en Last.fm" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "Nombre de _usuario:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Contraseña:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "Mostrar una _notificación al cambiar de canción" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Duración del desvanecimiento" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "Duración del _desvanecimiento" #: .././sonata/preferences.py:213 msgid "sec" msgstr "segundos" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "D_esvanecimiento" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Mostrar" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "_Arte de portada" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Normal" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Estilizado" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Estilo del arte de portada" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Sólo local" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Local y remota" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Lugares de búsqueda:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "SONG_DIR" #: .././sonata/preferences.py:269 msgid "custom" msgstr "personalizado" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Guardar arte de portada en:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "Botones de re_producción/volúmen" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "Barra de pr_ogreso" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "Barra de e_stado" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "Let_ras de la canción" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Guardar letras en:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "Icono del área de no_tificación" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Comportamiento de la ventana" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "Mo_strar la ventana en todas las áreas de trabajo" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "_Mantener la ventana por encima del resto de ventanas" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "_Ocultar la barra de título de la ventana" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_Minimizar al área de notificación al cerrar la ventana" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Si está activado, Sonata se minimizará al área de notificación al cerrar la " "ventana. Actualmente es imposible detectar si hay o no un área de " "notificación, por lo tanto, compruebe que al menos tiene una." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Miscelánea" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "Act_ualizar la biblioteca al iniciar" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Si está activado, Sonata actualizará automáticamente su biblioteca cuando se " "inicie." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "De_tener la reproducción al salir" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD permite que continúe la reproducción aunque ningún cliente esté abierto. " "Si está activado, Sonata se comportará como un reproductor de música " "convencional y detendrá la reproducción al salir." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "_Escribir fichero de estado:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Si está activado, Sonata creará un fichero del tipo xmms-infopipe que " "contendrá información sobre la canción en reproducción. Muchas aplicaciones " "tienen soporte para el fichero xmms-info (cliente de mensajería instantánea, " "clientes de IRC, ...)." #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Formato de la canción" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "Lista de reproducción act_ual" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "Bib_lioteca" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "Título de la _ventana:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Primera línea de la _canción actual:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Segunda línea de la c_anción actual:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Opciones disponibles" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Nombre del artista" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Nombre del álbum" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Nombre de pista" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Número de pista" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Número de disco" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Ruta del fichero" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Nombre del fichero" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Nombre del flujo" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Duración" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Tiempo restante (sólo para el título de la ventana)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "" "Información mostrada sólo si todas las etiquetas encerradas están definidas" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Crear columnas en la lista de reproducción actual" #: .././sonata/preferences.py:473 msgid "_About" msgstr "A_cerca de..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Configurar..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Cargado" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Descripción" #. Set up table #: .././sonata/preferences.py:532 msgid "_MPD" msgstr "_MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Comportamiento" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Formato" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Perfil nuevo" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Arte de portada personalizado" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Nombre del fichero del arte de portada" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Editar flujo" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Nuevo flujo" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL del flujo" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Ya existe un flujo con ese nombre. ¿Desea reemplazarlo?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "No se han encontrado taglib y/o tagpy, se ha desactivado el soporte para la " "edición de etiquetas." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Editar etiquetas" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Versión de Tagpy < 0.91. Por favor, actualice a una versión superior. " "El soporte para la edición de etiquetas ha sido desactivado." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "La ruta" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "" "no existe. Por favor, especifique un directorio de música válido en las " "preferencias." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Fichero" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "" " no encontrado. Por favor, especifique un directorio de música válido en las " "preferencias." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "No se han encontrado ficheros con etiquetas editables." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Comentario" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Gu_ardar todo" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Incrementar en cada fichero de música seleccionado, comenzando con la pista " "1 para este fichero." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Aplicar a todos los ficheros de música seleccionados." #: .././sonata/tagedit.py:260 msgid "of" msgstr "de" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "No se ha podido escribir la etiqueta en el fichero de música." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Ocultar la ruta al fichero" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Mostrar la ruta al fichero" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "El argumento -p, --popup requiere D-Bus. Abortando." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Actualizar" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Sitio web: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Habilitar informe de canción" #~ msgid "Enable Crossfade" #~ msgstr "Habilitar desvanecimiento" #~ msgid "Enable album art" #~ msgstr "Mostrar arte de portada" #~ msgid "Enable lyrics" #~ msgstr "Mostrar letras" #~ msgid "Enable system tray icon" #~ msgstr "Mostrar icono en el área de notificación" #~ msgid "_Display" #~ msgstr "_Mostrar" #~ msgid "_Extras" #~ msgstr "_Extras" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "No se ha encontrado PyGTK+2.10 o gnome-python-extras, se ha desactivado " #~ "el soporte para el icono del área de notificación." #~ msgid "Reset to Default" #~ msgstr "Restaurar imagen original" #~ msgid "_New Playlist..." #~ msgstr "Lista de reproducción _nueva..." #~ msgid "Notification" #~ msgstr "Notificación" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "No se ha encontrado Python 2.5 o python-elementree, se ha desactivado el " #~ "soporte para el informe de canción." #~ msgid "Audioscrobbler Verification" #~ msgstr "Verificación del informe de canción" #~ msgid "Update library for selected item(s)" #~ msgstr "Actualizar la biblioteca para el/los elemento/s seleccionado/s" #~ msgid "_Shuffle" #~ msgstr "_Mezclar" #~ msgid "Toggle shuffle mode" #~ msgstr "Activa/Desactiva el modo de mezclado" #~ msgid "Not connected" #~ msgstr "No conectado" #~ msgid "Press enter to search for these terms." #~ msgstr "Pulse Intro para buscar por estos términos." #~ msgid "Add new profile" #~ msgstr "Añadir un perfil nuevo" #~ msgid "Remove current profile" #~ msgstr "Eliminar el perfil actual" #~ msgid "Play enqueued files on activate" #~ msgstr "Reproducir los ficheros añadidos al activar" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Reproducir automáticamente los ficheros de música añadidos al hacer doble " #~ "click o pulsar Intro." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Añadir la/s canción/es o directorio/s seleccionada/do/s" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Reemplazar con la/s canción/es o directorio/s seleccionada/do/s" #, fuzzy #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Añadir la/s lista/s de reproducción seleccionada/s" #, fuzzy #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Borrar las canciones seleccionadas" #~ msgid "seconds" #~ msgstr "segundos" #~ msgid "Song Info..." #~ msgstr "Información de la canción..." #~ msgid "Click to collapse the player" #~ msgstr "Pulsar para colapsar el reproductor" #~ msgid "Click to expand the player" #~ msgstr "Pulsar para expandir el reproductor" #~ msgid "_Song Info" #~ msgstr "_Información de la canción" #, fuzzy #~ msgid "_Search..." #~ msgstr "_Finalizar búsqueda" #~ msgid "Remote only" #~ msgstr "Sólo remota" #~ msgid "Remote, then local" #~ msgstr "Remota, y luego local" #~ msgid "To save artwork as" #~ msgstr "Para guardar el arte de portada como" #~ msgid "Artwork Verification" #~ msgstr "Verificación del arte de portada" #~ msgid "Switch to current playlist" #~ msgstr "Cambiar vista a la lista de reproducción actual" #~ msgid "Toggle filter bar for jumping straight to track" #~ msgstr "Mostrar/Ocultar la barra de filtro" #~ msgid "Song name" #~ msgstr "Nombre de la canción" #~ msgid "songs." #~ msgstr "canciones." #~ msgid "Enable" #~ msgstr "Habilitar" #~ msgid "C_onnect" #~ msgstr "C_onectar" #~ msgid "last.fm" #~ msgstr "Last.fm" #~ msgid "Dis_play" #~ msgstr "Mo_strar" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/et.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000110532�11255764730�0014546�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Song - lugu # Track - rada # # Estonian translation of Sonata. # Copyright (C) 2008 THE Sonata'S COPYRIGHT HOLDER # This file is distributed under the same license as the Sonata package. # mihkel <turakas@gmail.com>, 2008. msgid "" msgstr "" "Project-Id-Version: Sonata 1.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-03-23 12:33+0200\n" "Last-Translator: mihkel <turakas@gmail.com>\n" "Language-Team: Estonian <et@li.org>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Sonatast" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Seaded" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Täisekraan kaanepiltidega" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Vaheta kaarte [1-5]" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Ühenda MPD-ga" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Ühenda MPD-st lahti" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Aktiivne esitusloend juhuslikuks" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Laienda mängija akent" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Mine eelmisele kaardile" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Mine järgmisele kaardile" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Ahenda mängija akent" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Otsi muusikakogust" #: .././sonata/about.py:64 msgid "Quit" msgstr "Sulge" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Värskenda muusikakogu" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Kuva hüpikmenüüd" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimeeri salve (kui lubatud)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Eelmine rada" #: .././sonata/about.py:70 msgid "Next track" msgstr "Järgmine rada" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Esita/Paus" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stop" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Helitase madalamaks" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Helitase valjemaks" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Esita valitud lugu" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Eemalda valitud lugu/lood" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Hetkel mängiv lugu alati keskele" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Muuda valitud lugude silte" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Salvesta uude esitusloendisse" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Puhasta nimekiri" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Juhuslik esitusloend" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Lisa valitud lood või sisesta kataloog" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Mine ülemisse kataloogi" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Lisa valitud vood" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Asenda valitud voogudega" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Lisa valitud vood ja esita" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Asenda valitud voogudega ja esita" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Uuenda valitud elementide radu" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Lisa valitud esitusloendid" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Eemalda valitud esitusnimekirjad" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Asenda valitud esitusnimekirjadega" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Lisa valitud esitusloendid ja esita" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Asenda valitud esitusloenditega ja esita" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Lisa valitud vood" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Eemalda valitud vood" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Asenda valitud voogudega" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Lisa valitud vood ja esita" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Asenda valitud voogudega ja esita" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Muuda esitatavate lugude silte" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Üldised kiirklahvid" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Taasesituse kiirklahvid" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Aktiivsed kiirklahvid" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Muusikakogu kiirklahvid" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Esitussloendi kiirklahvid" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Voo kiirklahvid" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Kiirklahvide info" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Kiirklahvid" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Elegantne klient MPD-le." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Kiirklahvid" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Sobiva sirvija käivitamine nurjus." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Käivita sirvija" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Antud lüliti argument nõuab D-Bus-i. Katkestan." #: .././sonata/cli.py:97 msgid "Version" msgstr "Versioon" #: .././sonata/cli.py:98 msgid "Website" msgstr "Veebileht" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Kasutamine: sonata [VALIK]... [KÄSK]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Valikud" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Näita abiteksti ja välju" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Loo info teavitus hüpikuna (vajalik D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Rakenduse minimeerimise lüliti" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "süsteemsesse salve või nähtavale (D-Bus vajalik)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Ära käivita programmi, kui D-Bus käsud nurjuvad" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Näita versiooni infot ja välju" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Käivita rakendus peidetult (vajalik süsteemne salv)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Käivita rakendus nähtavana (vajalik süsteemne salv)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Käivita, kasutades profiili [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Käsud" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Esita lugu esitusloendis" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Seiska hetkel mängiv lugu" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Katkest hetkel mängiv lugu" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Esita järgmine lugu esitusloendist" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Esita eelmine lugu esitusloendist" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Lülita esita/paus; esitab kui on peatatud" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Lülita kordusrežiim" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Lülita juhuslik režiim" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Näita esitatava loo infot" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Näita MPD staatust" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Käivitan Sonata profiiliga %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d ei ole ühegi profiili number." #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Profiili number peab jääma vahemikku 1 ja %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python ei suutnud tõlgendada %s kui numbrit." #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Vaikimisi profiil" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "esitaja" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "albumilt" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Ei saa MPD-ga ühendust.\n" "Kontrolli Sonata seadeid või MPD_HOST/MPD_PORT keskonnamuutujaid." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Pealkiri" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Esitaja" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Kuupäev" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Rada" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Stiil" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Fail" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Aeg" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitikiirus" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD peatatud" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Olek" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Esitan" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Paus" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Peatatud" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Korda" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Väljas" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Sees" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Juhuslik" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Helitase" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Siire" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekund" msgstr[1] "sekundit" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonatal ei õnnestunud D-Bus-ga ühendust saada: Ei suudetud määrata sõnumite " "siini aadressi (ehk ütleb 'man dbus-launch' või 'man-daemon' midagi tarka)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Käskude käivitamine ebaõnnestus." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Käivitan Sonata..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Võib-olla Sonata ei ole käivitatud?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata on juba kävitatud. Näitan..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Käsku käivitamine ebaõnnestus." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Loo info" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Esitaja info Wikipediast" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Albumi info Wikipediast" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Lülita ekstra sildid" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Muuda loo silte" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Sõnad" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Otsi sõnu Lyricwiki.org-st" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Muuda laulusõnu Lyricwiki.org-s" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Albumi info" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "veel" #: .././sonata/info.py:215 msgid "hide" msgstr "peida" #: .././sonata/info.py:281 msgid "edit tags" msgstr "muuda silte" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Albumi infot ei leitud." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Albumi nimi seadistamata." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "Ei leitud ZSI-d, sõnade alla laadimine välja lülitatud." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Esitaja või loo nimi seadistamata" #: .././sonata/info.py:371 msgid "search" msgstr "otsi" #: .././sonata/info.py:372 msgid "edit" msgstr "muuda" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Sõnu ei leitud" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Otsin sõnu..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Ei saanud ühendust LyricWiki-ga" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Sõndade laadimine nurjus" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Siltideta" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Erinevad esitajad" #: .././sonata/library.py:49 msgid "Filename" msgstr "Faili nimi" #: .././sonata/library.py:49 msgid "Everything" msgstr "Kõik" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Failisüsteem" #: .././sonata/library.py:53 msgid "Artists" msgstr "Esitajad" #: .././sonata/library.py:54 msgid "Albums" msgstr "Albumid" #: .././sonata/library.py:55 msgid "Genres" msgstr "Stiilid" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Otsingu termineid" #: .././sonata/library.py:90 msgid "End Search" msgstr "Lõpeta otsing" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Muusikakogu lehitsemise vaade" #: .././sonata/library.py:96 msgid "Search" msgstr "Otsi" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "lugu" msgstr[1] "lugu" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minut" msgstr[1] "minutit" #: .././sonata/library.py:849 msgid "Song" msgstr "Lugu" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Asukoht" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Aktiivne" #: .././sonata/main.py:103 msgid "Library" msgstr "Muusikakogu" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Esitusloend" #: .././sonata/main.py:105 msgid "Streams" msgstr "Vood" #: .././sonata/main.py:106 msgid "Info" msgstr "Info" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Terve lugu" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Sorteeri nimekirja" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Sa_lvesta nimekiri" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Ühendus" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "E_sita hiljem" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Värskenda" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Kasuta _pilti võrgust..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Kasuta _kohalikku pilti..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Täisekraan" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Tühista pilt" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Esita" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "Pa_us" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stop" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Eelmine" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Järgmine" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Lõpeta" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Eemalda" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Puhasta" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "_Terve muusikakogu" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "_Valitud vood" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Eelistused..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_Programmist..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Muuda silte..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Lisa" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Asenda" #: .././sonata/main.py:258 msgid "Add" msgstr "Lisa" #: .././sonata/main.py:259 msgid "Replace" msgstr "Asenda" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Kustuta..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Sega" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "_Näita Sonatat" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Korda" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "_Juhuslik" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Esitaja järgi" #: .././sonata/main.py:429 msgid "By Album" msgstr "Albumi järgi" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Loo nime järgi" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Faili nime järgi" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Kausta ja faili nime järgi" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Tagurpidi nimekiri" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Uus..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Muuda..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Nimeta ümber..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Esitusloend" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Klõpsa, et laiendada" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Klõpsa, et sulgeda" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Ei ole ühendatud" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Lugemisõigus puudub" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Kaanepilt" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Profiil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Ühenda lahti" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Aasta" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Voog" #: .././sonata/main.py:1193 msgid "Len" msgstr "Aeg" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Tundmatu" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "päev" msgstr[1] "päeva" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "tund" msgstr[1] "tundi" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "ja" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(värskendan mpd-d)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Sõnade otsing" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Otsi" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Esitaja nimi" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Loo pealkiri" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Ava pilt" #: .././sonata/main.py:2379 msgid "Images" msgstr "Pildid" #: .././sonata/main.py:2383 msgid "All files" msgstr "Kõik failid" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Vali kaanepilt" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "V_ali" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Muuda otsingu termineid" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Esitajat ega albumi nime ei leitud." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Kaanepilti ei leitud." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Kustuta valitud esitusnimekiri?" msgstr[1] "Kustuta valitud esitusnimekirjad?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Kustuta esitusnimekiri" msgstr[1] "Kustuta esitusnimekirjad" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Kustuta valitud voog?" msgstr[1] "Kustuta valitud vood?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Kustuta voog" msgstr[1] "Kustuta vood" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Salvestamaks sõnad oma muusika kataloogi, pead määrama kehtiva " "muusikakataloogi" #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Muusika kataloogi kontrollimine" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Salvestamaks kaanepilte muusika kataloogi, pead määrama kehtiva " "muusikakataloogi" #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "albumit" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "esitaja" msgstr[1] "esitajat" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "päev õnnistust" msgstr[1] "päeva õnnistust" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "tund õnnistust" msgstr[1] "tundi õnnistust" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Salvesta esitusloend" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Kas soovid asendada olemasolevat esitusloendit või lisada need lood?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Olemasolev esitusloend" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Asenda esitusloend" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Lisa lood" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Sellenimeline esitusloend on juba olemas. Kas soovid seda asendada?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Esitusloendi nimi" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Nimeta esitusloend ümber" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Süsteemne salv" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Üleval vasakul" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Üleval paremal" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "All vasakul" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "All paremal" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Ekraani keskel" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD ühendus" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Nimi" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Server" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_Muusika kataloog" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Vali muusika kataloog" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "Sala_sõna" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Jäta tühjaks, kui salasõna pole vajalik." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "Käivit_amisel ühenda automaatselt" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Kasutan MPD_HOST/PORT" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Lisad" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "Kas_utajanimi:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Salasõna:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "_Teavita, kui lugu muutub" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Siirde pikkus" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "S_iirde pikkus" #: .././sonata/preferences.py:213 msgid "sec" msgstr "s" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "S_iire" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Kuva" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "_Albumi nimi" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standard" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Stiliseeritud" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Kaanepildi stiil:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Ainult kohalikud" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Kohalik ja võrgust" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Otsimise asukohad:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "LOO_KAUST" #: .././sonata/preferences.py:269 msgid "custom" msgstr "kohandatud" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Salvesta pildid:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Esita/helitaseme nupud" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "_Edenemisriba" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "_Olekuriba" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "Loo s_õnad" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Salvesta sõnad:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "Süsteemse salve _ikoon" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Akna käitumine" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "_Näita akent kõikidel tööaladel" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "_Hoia aken teiste kohal" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "_Peaida akna tiitliriba" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_Minimeeri salve sulgemisel või Esc vajutamisel" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Kui lubatud, Sonata minimeerib end süsteemsesse salve. Kahjuks hetkel on " "võimatu tuvastada, kas süsteemne salv on ka olemas, niiet luba ainult siis," "kui tead, et su töölaual on salv." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Mitmesugust" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "_Värskenda MPD teek käivitamisel" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "Kui lubatud, siis Sonata uuendab käivitamisel automaatselt MPD teeke." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "Väljumisel lõpe_ta mängimine" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD võimaldab taasesitamist ka siis, kui klient tööta. Kui lubatud, siis " "Sonata käitub rohkem nagu tavaline muusikamängija ja muusika mängimine " "peatatakse rakendusest väljumisel." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "_Kirjuta olekufail:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Kui lubatud, Sonata loob xmms-infopipe-i sarnase faili, mis sisaldab infot " "hetke loo kohta. Paljud rakendused toetavad xmms-info faili (Kiirsuhtlus, " "IRC kliendid...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Loo vormindamine" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "A_ktiivses esitusloendis:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Muusikakogu:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Akna pealkiri:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Aktiivse _loo rida 1:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Aktiivse l_oo rida 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Võimalikud valikud" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Esitaja nimi" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Albumi nimi" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Raja nimi" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Raja number" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Plaadid number" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Faili asukoht" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Faili nimi" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Voo nimi" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Loo pikkus" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Järelejäänud aeg (ainult pealkirjas)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Infot näidatakse ainult siis, kui kõik sildid on määratud" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Loob veerge aktiivsesse esitusloendisse" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_Programmist" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Seadista..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Laetud" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Kirjeldus" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Käitumine" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Vorming" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Uus profiil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Kohandatud kaanepilt" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Kaanepildi faili nimi" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Muuda voogu" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Uus voog" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "Voo URL" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Sellenimeline voog on juba olemas. Kas soovid seda asendada?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Ei leitud taglib-i ja/või tagpy-d, siltide muutmine välja lülitatud." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Muuda silte" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "Tagpy versioon < 0.91. Palun paigalda värskem versioon, siltide muutmine välja lülitatud." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Asukoht" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "pole olemas. Palun määra eelistuste alt õige muusika kataloog." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Fail " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " ei leitud. Palun määra eelistuste alt õige muusika kataloog." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Ei leitud ühtegi muudetavate siltidega muusika faili." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Kommentaar" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Salvesta _kõik" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Suurenda väärtust iga valitud muusika faili puhul." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Rakenda kõikide valitud failide puhul." #: .././sonata/tagedit.py:260 msgid "of" msgstr "/" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Siltide salvestamine faili nurjus." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Peida faili rada" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Näita faili rada" #~ msgid "_Update Path" #~ msgstr "_Värskenda" #~ msgid "Enable Audioscrobbler" #~ msgstr "Kasuta Audioscrobbler-it" #~ msgid "Enable Crossfade" #~ msgstr "Kasuta siiret" #~ msgid "Enable album art" #~ msgstr "Kasuta kaanepilte" #~ msgid "file_path" #~ msgstr "faili_asukoht" #~ msgid "Enable lyrics" #~ msgstr "Kasuta laulusõnu" #~ msgid "Enable system tray icon" #~ msgstr "Kasuta süsteemse salve ikooni" #~ msgid "_Display" #~ msgstr "_Kuva" #~ msgid "_Extras" #~ msgstr "_Lisad" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/fi.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000114603�11255764730�0014537�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Finnish translation of sonata. # Copyright (C) 2007-2009 Ilkka Tuohela. # This file is distributed under the same license as the sonata package. # Ilkka Tuohela <hile@iki.fi>, 2007-2009. # msgid "" msgstr "" "Project-Id-Version: sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-23 07:25+0300\n" "PO-Revision-Date: 2009-03-23 08:35+0300\n" "Last-Translator: Ilkka Tuohela <hile@iki.fi>\n" "Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Tietoja _sonatasta" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Asetukset" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Kansikuvien näyttö kokoruututilassa" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Siirry [1.-5.] välilehteen" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Yhdistä MPD-palvelimeen" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "_Katkaise MPD-yhteys" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Sekoita nykyinen soittolista" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Laajenna soitin" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Siirry edelliseen välilehteen" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Siirry seuraavaan välilehteen" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Pienennä soitin" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Etsi kirjastosta" #: .././sonata/about.py:64 msgid "Quit" msgstr "Lopeta" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Päivitä koko kirjasto" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Näytä ponnahdusikkuna" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Pienennä ilmoitusalueelle (jos käytössä)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Edellinen kappale" #: .././sonata/about.py:70 msgid "Next track" msgstr "Seuraava kappale" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Soita/Keskeytä" #: .././sonata/about.py:72 msgid "Stop" msgstr "Pysäytä" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Hiljennä äänenvoimakkuutta" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Kasvata äänenvoimakkuutta" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Soita valittu kappale" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Poista valitut kappaleet" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Keskitä soiva kappale" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Muokkaa soivan kappaleen merkintöjä" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Tallenna uuteen soittolistaan" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Tyhjennä lista" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Sekoita soittlista" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Lisää valitut kappaleet tai koko kansio" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Siirry yläkansioon" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Lisää valitut kohdat" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Korvaa valituilla kohdilla" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Lisää valitut kohdat ja soita" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Korvaa valituilla kohdilla ja soita" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Päivitä valitut kohdat tai polut" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Lisää valitut soittolistat" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Poista valitut soittolistat" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Korvaa valituilla soittolistoilla" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Lisää valitut soittolistat ja soita" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Korvaa valituilla soittolistoilla ja soita" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Lisää valitut virrat" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Poista valitut virrat" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Korvaa valituilla virroilla" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Lisää valitut virrat ja soita" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Korvaa valituilla virroilla ja soita" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Muokkaa soivan kappaleen merkintöjä" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Yleiset pikanäppäimet" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Soiton pikanäppäimet" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Nykyisen listan pikanäppäimet" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Kirjaston pikanäppäimet" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Soittolistojen pikanäppäimet" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Virtojen pikanäppäimet" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Merkintöjen pikanäppäimet" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Pikanäppäimet" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Näppärä asiakaohjelma MPD:lle." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Pikanäppäimet" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Selainta ei voitu käynnistää." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Käynnistä selain" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Toggle- ja ponnahdusikkuna-valitsimet vaativat D-Bus:in, keskeytetään." #: .././sonata/cli.py:97 msgid "Version" msgstr "Versio" #: .././sonata/cli.py:98 msgid "Website" msgstr "WWW-sivut" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Käyttö: sonata [VALITSIN]... [KOMENTO]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Valitsimet" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Näytä tämä ohje ja sulje" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Ponnahdusikkuna kappaleen vaihtuessa (vaatii DBus:in)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Vaihtelee onko ohjelma pienennetty" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "Ilmoitusalueelle tai näkyviin (vaatii dbusin)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Älä käynnistä ohjelmaa, jos D-Bus -komennot epäonnistuvat" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Näytä versiotiedot ja sulje" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Käynnistä piilotettuna (vaatii ilmoitusalueen)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Käynnistä näkyvissä (vaatii ilmoitusalueen)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Käynnistä profiili [NUMERO]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Komennot" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Soita kappale soittolistalta" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pysäytä soiva kappale" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Keskeytä soiva kappale" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Soita seuraava kappale soittolistalta" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Soita edellinen kappale soittolistalta" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Vaihda toistoa/pysäytystä; toista, jos pysäytetty" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Vaihda kertaustilaa" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Vaihda satunnaistilaa" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Näytä tietoja tämänhetkisestä kappaleesta" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Näytä MPD:n tila" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Käynnistetään sonata profiililla %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d ei ole saatavilla oleva profiilinumero." #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Profiilinumeron täytyy olla väliltä 1 ja %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python ei voi tulkita arvoa %s numeroksi." #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Oletusprofiili" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "esittäjältä" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "levyltä" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "MPD-palvelimeen ei saatu yhteyttä.\n" "Tarkista sonatan asetuksesi tai MPD_HOST/MPD_PORT -ympäristömuutujat.." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Kappale" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Esittäjä" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Levy" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Päiväys" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Kappale" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Tyyli" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Tiedosto" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Kesto" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Bittinopeus" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD pysäytetty" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Tila" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Soittaa" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Keskeytetty" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Pysäytetty" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Kertaus" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Päällä" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Pois" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Satunnaistoisto" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Äänenvoimakkuus" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Ristiinhäivytys" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekunti" msgstr[1] "sekuntia" #: .././sonata/current.py:64 msgid "Filter" msgstr "Suodatin" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonata ei saanut yhteyttä D-Bus -istuntoväylään: viestiväylän osoitetta ei " "voitu selvittää. Lue lisää komennoilla 'man dbus-launch' ja 'man dbus-" "daemon'." #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Etäkomentoja ei voitu suorittaa." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Käynnistetään sonata ..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Ehkä sonata ei ole käynnissä?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata on jo käynnissä, näytetään ikkuna..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Etäkomentoa ei voitu suorittaa." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Tietoja kappaleesta" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Näytä esittäjä wikipediassa" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Näytä levy wikipediassa" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Näytetäänkö lisämerkinnät" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Muokkaa kappaleen merkintöjä" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Sanoitukset" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Etsi sanoituksia Lyricwiki.org-sivustolta" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Muokkaa sanoituksia lyricwiki.org-sivustolla" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Tietoja levystä" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "lisää" #: .././sonata/info.py:215 msgid "hide" msgstr "piilota" #: .././sonata/info.py:281 msgid "edit tags" msgstr "muokkaa merkintöjä" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Levyn tietoja ei löytynyt." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Levyn nimeä ei ole asetettu." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI-kirjastoa ei löydy, sanoitusten haku ei ole käytössä." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Esittäjää kappaleen nimeä ei ole asetettu." #: .././sonata/info.py:371 msgid "search" msgstr "etsi" #: .././sonata/info.py:372 msgid "edit" msgstr "muokkaa" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Sanoituksia ei löytynyt" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Haetaan sanoituksia..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "LyricWikiin ei saatu yhteyttä" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Sanoitusten haku ei onnistunut" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Merkitsemätön" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Useita esittäjiä" #: .././sonata/library.py:49 msgid "Filename" msgstr "Tiedostonimi" #: .././sonata/library.py:49 msgid "Everything" msgstr "Kaikki" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Tiedostojärjestelmä" #: .././sonata/library.py:53 msgid "Artists" msgstr "Esittäjät" #: .././sonata/library.py:54 msgid "Albums" msgstr "Levyt" #: .././sonata/library.py:55 msgid "Genres" msgstr "Tyylit" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Hakuehdot" #: .././sonata/library.py:90 msgid "End Search" msgstr "Lopeta haku" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Kirjaston selausnäkymä" #: .././sonata/library.py:96 msgid "Search" msgstr "Etsi" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "kappale" msgstr[1] "kappaletta" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuutti" msgstr[1] "minuuttia" #: .././sonata/library.py:849 msgid "Song" msgstr "Kappale" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Polku" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Soiva lista" #: .././sonata/main.py:103 msgid "Library" msgstr "Kirjasto" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Soittolistat" #: .././sonata/main.py:105 msgid "Streams" msgstr "Musiikkivirrat" #: .././sonata/main.py:106 msgid "Info" msgstr "Tietoja" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Koko kappale" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Järjestä lista" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "_Tallenna lista nimellä" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Yhteys" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Soita s_euraavaksi" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Päivitä" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Käytä kuvaa _verkosta..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Käytä kuvaa _levyltä..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Kokoruututila" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Nollaa kuva" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Soita" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "_Keskeytä" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Pysäytä" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Edellinen" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Seuraava" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Lopeta" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Poista" #: .././sonata/main.py:250 msgid "_Clear" msgstr "Ty_hjennä" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "_Koko kirjasto" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "_Valitut kohdat" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Asetukset..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_Tietoja..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Muokkaa merkintöjä" #: .././sonata/main.py:256 msgid "_Add" msgstr "_Lisää" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Korvaa" #: .././sonata/main.py:258 msgid "Add" msgstr "Lisää" #: .././sonata/main.py:259 msgid "Replace" msgstr "Korvaa" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Poista..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Sekoitustila" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "Näytä _sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Kertaus" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "Sa_tunnaistoisto" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Esittäjän mukaan" #: .././sonata/main.py:429 msgid "By Album" msgstr "Levyn mukaan" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Kappaleen nimen mukaan" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Tiedostonimen mukaan" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Kansion ja tiedoston mukaan" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Käännä listan suunta" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Uusi..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Muokkaa..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Nimeä uudestaan..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Soittolista" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Laajenna napsauttamalla" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Pienennä napsauttamalla" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Ei yhteyttä" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Ei lukuoikeutta" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Kansikuva" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Profiili" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Katkaise yhteys" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Vuosi" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Virta" #: .././sonata/main.py:1193 msgid "Len" msgstr "Pituus" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Tuntematon" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "päivä" msgstr[1] "päivää" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "tunti" msgstr[1] "tuntia" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "ja" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(päivitetään mpd-tietokantaa)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Sanoitusten haku" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Etsi" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Esittäjän nimi" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Kappaleen nimi" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Avaa kuva" #: .././sonata/main.py:2379 msgid "Images" msgstr "Kuvat" #: .././sonata/main.py:2383 msgid "All files" msgstr "Kaikki tiedostot" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Valitse kansikuva" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "_Valitse" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Muokkaa hakuehtoja" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Esittäjää tai levyn nimeä ei löydy." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Kansikuvaa ei löydy." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Poistetaanko valittu soittolista?" msgstr[1] "Poistetaanko valitut soittolistat?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Poista soittolista" msgstr[1] "Poista soittolistat" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Poistetaanko valittu virta?" msgstr[1] "Poistetaanko valitut virrat?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Poista virta" msgstr[1] "Poista virrat" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Jotta voit tallentaa sanoituksia musiikkikansioon, sinun täytyy antaa " "kelvollinen musiikkikansio." #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Musiikkikansion vahvistus" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Jotta voit tallentaa kansikuvia musiikkikansioon, sinun täytyy antaa " "kelvollinen musiikkikansio." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "levy" msgstr[1] "levyä" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "esittäjä" msgstr[1] "esittäjää" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "päivä poppista" msgstr[1] "päivää poppista" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "tunti poppista" msgstr[1] "tuntia poppista" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Tallenna soittolista" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Haluatko korvata nykyisen soittolistan tai lisätä nämä kappaleet?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Nykyinen soittolista" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Korvaa soittolista" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Lisää kappaleet" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Tämänniminen soittolista on jo olemassa. Haluatko korvata sen?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Soittolistan nimi" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Nimeä soittolista uudestaan" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Ilmoitusalue" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Ylhäällä vasemmalla" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Ylhäällä oikealla" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Alhaalla vasemmalla" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Alhaalla oikealla" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Näytön keskellä" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD-yhteys" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Nimi" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Palvelin" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Portti" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_Musiikkikansio" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Valitse musiikkikansio" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "_Salasana" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Jätä tyhjäksi, jos sanaa ei vaadita." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "_Yhdistä käynnistettäessä" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Käytetään MPD_HOST/PORT-muuttujia" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Lisäosat" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbler (last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Käyttäjätunnus:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Salasana:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "Po_nnahdusikkuna kappaleen vaihtuessa" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Häivytyksen kesto" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "_Häivytyksen kesto" #: .././sonata/preferences.py:213 msgid "sec" msgstr "s" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "_Ristiinhäivytys" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Ulkoasu" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "K_ansikuva" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Tavallinen" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Tyylitelty" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Kansikuvan tyyli:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Vain paikalliset kuvat" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Paikalliset ja verkko" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Etsinnän kohteet:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "KAPPELEEN_KANSIO" #: .././sonata/preferences.py:269 msgid "custom" msgstr "oma" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Tallenna kansikuvat kohteeseen:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Toisto- ja äänenvoimakkusnapit" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "_Edistymispalkki" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "_Tilarivi" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "_Sanoitukset" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Tallenna sanoitukset kansioon:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "Ilmoi_tusalueen kuvake" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Ikkunan toiminta" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "_Näytä ikkuna kaikilla työpöydillä" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "Pi_dä ikkuna aina päällimmäisenä" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "P_iilota ikkunan otsikko" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_Pienennä ilmoitusalueelle suljettaessa" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Jos käytössä, sonatan sulkeminen pienentää ohjelman ilmoitusalueelle. " "Huomaa, että tällä ohjelma ei voi tietää, onko ilmoitusaluetta olemassa, " "joten valitse tämä vain jos sinulla on ilmoitusalue." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Lisäasetukset" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "Päi_vitä MPD-kirjasto käynnistettäessä" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Jos käytössä, MPD-kirjaston päivitys aloitetaan automaattisesti sonatan " "käynnistyessä." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "_Pysäytä toisto suljettaessa" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD voi soittaa musiikkia, vaikka asiakasta ei ole auki. Jos tämä on " "käytössä, sonata toimii kuten perinteinen musiikkisoitin ja lopettaa " "musiikin soiton sulkeutuessaan." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "_Kirjoita tilatiedosto:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Jos käytössä, Sonata luo xmms-infopipe -tyylisen tiedoston, joka sisältää " "tietoja soivasta kappaleesta. Monet ohjelmat, esimerkiksi pikaviestimet ja " "IRC-asiakkaat, osaavat lukea xmms-info -tiedostoa." #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Kappaletietojen muotoilu" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "_Nykyinen soittolista:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Kirjasto:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Ikkunan otsikko:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Soiva _kappale, rivi 1:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Soiva k_appale, rivi 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Mahdolliset valitsimet" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Esittäjän nimi" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Levyn nimi" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Kappalenumero" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Kappalenumero" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Levyn numero" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Tiedoston polku" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Tiedostonimi" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Virran nimi" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Kappaleen pituus" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Kulunut aika (vain otsikko)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Tiedot näytetään vain, jos kaikki merkinnät on määritelty" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Luo sarakkeita nykyiseen soittolistaan" #: .././sonata/preferences.py:473 msgid "_About" msgstr "Tietoja" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Asetukset..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Ladattu" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Kuvaus" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Toiminta" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Muotoilu" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Uusi profiili" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Omat kansikuvat" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Kansikuvan tiedostonimi" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "muokkaa virtaa" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Uusi virta" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "Virran URL" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Tämänniminen virta on jo olemassa. Haluatko korvata sen?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "Taglib tai tagpy-kirjastoja ei löydy, merkintöjen muokkaus ei ole käytössä." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Muokkaa merkintöjä" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Tagpy-versio on < 0.91. Päivitä uudempaan versioon, merkintöjen muokkaus ei " "ole nyt käytössä." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Polku" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "ei ole olemassa. Anna asetuksista olemassaoleva musiikkikansio." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Tiedosto" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "ei löytynyt. Anna olemassaoleva musiikkikansio asetuksissa." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Muokattavia merkintöjä sisältäviä musiikkitiedostoja ei löytynyt." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Kommentti" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Tallenna K_aikki" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Kasvata kappalenumeroa kullekin tiedostolle, alkaen numerosta yksi tämän " "tiedoston kohdalta." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Toteuta kaikkiin valittuihin tiedostoihin" #: .././sonata/tagedit.py:260 msgid "of" msgstr "/" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Merkintää ei voitu tallentaa musiikkitiedostoon." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Piilota tiedoston polku" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Näytä tiedoston polku" #~ msgid "_Update Path" #~ msgstr "_Päivitä polku" #~ msgid "Enable Audioscrobbler" #~ msgstr "Käytä Audioscrobbleria" #~ msgid "Enable Crossfade" #~ msgstr "Käytä ristiinhäivytystä" #~ msgid "Enable album art" #~ msgstr "Näytä kansikuvat" #~ msgid "file_path" #~ msgstr "tiedosto_polku" #~ msgid "Enable lyrics" #~ msgstr "Näytä sanat" #~ msgid "Enable system tray icon" #~ msgstr "Käytä ilmoitusaluetta" #~ msgid "_Display" #~ msgstr "_Näyttö" #~ msgid "_Extras" #~ msgstr "_Lisäosat" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Ponnahdusikkunat vaativat D-Bus:in, keskeytetään." #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Www-sivusto: http://sonata.berlios.de/" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 tai gnome-python-extras -kirjastoa ei löytynyt, ilmoitusalue " #~ "ei ole käytössä." #~ msgid "Reset to Default" #~ msgstr "Käytä oletusasetuksia" #~ msgid "_New Playlist..." #~ msgstr "_Uusi soittolista..." #~ msgid "Notification" #~ msgstr "Huomautukset" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python-versiota 2.5 tai python-elementtree -kirjastoa ei löytynyt, " #~ "audioscrobbler-tuki ei ole käytössä." #~ msgid "Audioscrobbler Verification" #~ msgstr "Audioscrobblerin vahvistus" #~ msgid "Update library for selected item(s)" #~ msgstr "Päivitä kirjasto valittujen kohtien osalta" �����������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/fr.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000114561�11255764730�0014553�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# French translations for sonata package. # Copyright (C) 2007 THE sonata'S COPYRIGHT HOLDER # This file is distributed under the same license as the sonata package. # # Floréal M <somewhere@webend.net>, 2006-2007. # Cyril Brulebois <cyril.brulebois@enst-bretagne.fr>, 2007. # Mike Massonnet <mmassonnet@gmail.com>, 2007-2009. # msgid "" msgstr "" "Project-Id-Version: Sonata 1.6.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-04-07 21:59+0200\n" "Last-Translator: Mike Massonnet <mmassonnet@gmail.com>\n" "Language-Team: Sonata-translations <sonata-translations@lists.berlios.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-Language: French\n" "X-Poedit-Country: FRANCE\n" "X-Poedit-SourceCharset: utf-8\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "À propos de Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Préférences" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Mode pochette plein écran" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Passer aux onglets [1-5]" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Connecter à MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Déconnecter de MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Mélanger la liste courante" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Étendre le client" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Passer à l'onglet précédent" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Passer à l'onglet suivant" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Réduire le client" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Rechercher dans la bibliothèque" #: .././sonata/about.py:64 msgid "Quit" msgstr "Quitter" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Mettre à jour la bibliothèque entière" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Afficher un menu contextuel" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Réduire dans la zone de notification (si activé)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Morceau précédent" #: .././sonata/about.py:70 msgid "Next track" msgstr "Nouveau morceau" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Lecture/Pause" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stop" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Baisser le volume" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Augmenter le volume" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Jouer le morceau sélectionné" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Supprimer le(s) morceau(x) sélectionné(s) ?" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Centrer sur la chanson courante" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Éditer l'étiquette du (des) morceau(x) sélectionné(s)" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Sauvegarder dans une nouvelle liste de lecture" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Nettoyer la liste de lecture" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Mélanger la liste" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Ajouter le(s) morceau(x) sélectionné(s) ou indiquer un répertoire" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Aller au répertoire parent" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Ajouter le(s) élément(s) sélectionné(s)" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Remplacer par le(s) élément(s) sélectionné(s)" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Ajouter le(s) élément(s) sélectionné(s) et lire" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Remplacer par le(s) élément(s) sélectionné(s) et lire" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Mettre à jour le(s) élément(s) sélectionné(s)" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Supprimer la (les) liste(s) de lecture sélectionnée(s)" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Supprimer la (les) liste(s) de lecture sélectionnée(s)" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Remplacer par la (les) liste(s) de lecture sélectionnée(s)" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Ajouter la (les) liste(s) de lecture sélectionnée(s) et lire" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Remplacer par la (les) liste(s) de lecture sélectionnée(s) et lire" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Ajouter le(s) flux sélectionné(s)" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Supprimer le(s) flux sélectionné(s)" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Remplacer par le(s) flux sélectionné(s)" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Ajouter le(s) flux sélectionné(s) et lire" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Remplacer par le(s) flux sélectionné(s) et lire" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Éditer les étiquettes du morceau courant" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Raccourcis principaux" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Raccourcis pour la lecture" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Raccourcis courants" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Raccourcis pour la bibliothèque" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Raccourcis pour les listes de lecture" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Raccourcis pour les flux" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Raccourcis pour les informations" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Raccourcis" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Un client élégant pour MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "Raccourcis" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Impossible de lancer un navigateur compatible." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Lancer le navigateur" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Les paramètres « toggle » et « popup » nécessitent D-Bus. Abandon." #: .././sonata/cli.py:97 msgid "Version" msgstr "Version" #: .././sonata/cli.py:98 msgid "Website" msgstr "Site internet" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Utilisation : sonata [OPTION]... [COMMANDE]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Options" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Montrer ce message et quitter" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Popup de notification (nécessite D-BUS)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Alterner l'état de visibilité de l'application entre" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "réduit dans la zone de notification et visible (nécessite D-BUS)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Ne pas exécuter l'application si les commandes D-Bus échouent" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Montrer le numéro de version et quitter" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "" "Démarrer en mode invisible (nécessite la gestion de la zone de notification)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "" "Démarrer en mode visible (nécessite la gestion de la zone de notification)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Démarrer avec le profil [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Commandes" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Lire la chanson de la liste" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Mettre en pause la chanson courante" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Stopper la chanson courante" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Lire la chanson suivante" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Lire la chanson précédente" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Alterner lecture/pause ; mettre lecture si stoppé" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Alterner le mode répétition" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Alterner le mode aléatoire" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Afficher les informations sur la chanson courante" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Afficher le statut de MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Démarrage de Sonata avec le profil %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d n'est pas un numéro de profil disponible." #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Le numéro de profil doit être entre 1 et %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python est incapable d'interpréter %s en tant que chiffre." #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Profil par défaut" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "par" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "de" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Impossible de se connecter à MPD.\n" "Vérifiez vos paramètres dans les préférences de Sonata ou les variables " "d'environnement MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Titre" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Artiste" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Date" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Piste" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Genre" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Fichier" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Temps" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Débit" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD est stoppé" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "État" #: .././sonata/cli.py:228 msgid "Playing" msgstr "En cours de lecture" #: .././sonata/cli.py:230 msgid "Paused" msgstr "En pause" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Stoppé" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Répéter" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Off" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "On" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Aléatoire" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Volume" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Fondu enchaîné" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "seconde" msgstr[1] "secondes" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filtre" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonata n'a pas pu se connecter à la session D-BUS : Impossible de déterminer " "l'adresse du bus (essayez « man dbus-launch » et « man dbus-daemon » pour " "obtenir de l'aide sur son fonctionnement)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Échec de l'exécution des commandes à distance." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Démarrage de Sonata à la place..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Peut-être Sonata n'est pas en cours d'exécution ?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Une instance de Sonata est déjà en cours d'exécution. Affichage de l'instance..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Impossible d'exécuter les commandes distantes." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Informations sur la chanson" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Lancer l'artiste sur Wikipedia" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Lancer l'album sur Wikipedia" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Permuter les étiquettes supplémentaires" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Éditer les étiquettes" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Paroles" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Rechercher les paroles sur Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Editer les paroles sur Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Informations sur l'album" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "plus" #: .././sonata/info.py:215 msgid "hide" msgstr "cacher" #: .././sonata/info.py:281 msgid "edit tags" msgstr "éditer les Étiquettes" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Informations sur l'album non trouvées." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Nom de l'album non spécifié." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI non trouvé, support du téléchargement des paroles désactivé." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Artiste ou titre non spécifié." #: .././sonata/info.py:371 msgid "search" msgstr "rechercher" #: .././sonata/info.py:372 msgid "edit" msgstr "éditer" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Paroles non trouvées" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Récupération des paroles..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Impossible de se connecter à LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Impossible de récupérer les paroles" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Aucune étiquette" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Artistes divers" #: .././sonata/library.py:49 msgid "Filename" msgstr "Nom du fichier" #: .././sonata/library.py:49 msgid "Everything" msgstr "Tout" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Système de fichiers" #: .././sonata/library.py:53 msgid "Artists" msgstr "Artistes" #: .././sonata/library.py:54 msgid "Albums" msgstr "Albums" #: .././sonata/library.py:55 msgid "Genres" msgstr "Genres" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Termes de recherche" #: .././sonata/library.py:90 msgid "End Search" msgstr "Fin de recherche" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Parcours de la bibliothèque" #: .././sonata/library.py:96 msgid "Search" msgstr "Rechercher" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "chanson" msgstr[1] "chansons" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minute" msgstr[1] "minutes" #: .././sonata/library.py:849 msgid "Song" msgstr "Chanson" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Chemin" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "En cours" #: .././sonata/main.py:103 msgid "Library" msgstr "Bibliothèque" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Listes de lecture" #: .././sonata/main.py:105 msgid "Streams" msgstr "Flux" #: .././sonata/main.py:106 msgid "Info" msgstr "Infos" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Chanson entière" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "Trier la li_ste" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Sauver la liste vers" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Connexion" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "L_ire après" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "Mettre à jo_ur" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Utilise_r une image distante..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Utiliser une image _locale..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "Mode _plein écran" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Réinitialiser l'image" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Lecture" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "Pa_use" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stop" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Précédent" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Suivant" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Quitter" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Retirer" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Vider" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "Bibliothèque _entière" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "Élément(s) _sélectionné(s)" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Préférences..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_À propos..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Éditer les étiquettes..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Ajouter" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Remplacer" #: .././sonata/main.py:258 msgid "Add" msgstr "Ajouter" #: .././sonata/main.py:259 msgid "Replace" msgstr "Remplacer" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Supprimer..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Aléatoire" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "_Montrer Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Répéter" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "_Aléatoire" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Par artiste" #: .././sonata/main.py:429 msgid "By Album" msgstr "Par album" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Par titre de chanson" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Par nom de fichier" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Par chemin et nom de fichier" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Renverser la liste" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Nouveau..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Éditer..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Renommer..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Liste de lecture" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Cliquer pour étendre" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Cliquer pour réduire" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Non connecté" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Aucune permission en lecture" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Pochette" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Déconnecter" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Année" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Flux" #: .././sonata/main.py:1193 msgid "Len" msgstr "Durée" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Inconnu" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "jour" msgstr[1] "jours" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "heure" msgstr[1] "heures" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "et" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(mise à jour de mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Recherche de paroles" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Rechercher" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Artiste" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Titre de la chanson" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Ouvrir image" #: .././sonata/main.py:2379 msgid "Images" msgstr "Images" #: .././sonata/main.py:2383 msgid "All files" msgstr "Tous les fichiers" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Choisir une pochette" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "C_hoisir" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Éditer les termes de la recherche" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Pas d'artiste ou de nom d'album trouvé." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Aucune pochette n'a été trouvée." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Supprimer la liste de lecture sélectionnée ?" msgstr[1] "Supprimer les listes de lecture sélectionnées ?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Supprimer la liste de lecture" msgstr[1] "Supprimer les listes de lecture" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Supprimer le flux sélectionné ?" msgstr[1] "Supprimer les flux sélectionnés ?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Supprimer le flux" msgstr[1] "Supprimer les flux" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Pour sauver les paroles, vous devez indiquer un chemin « music » valable dans " "les préférences." #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Vérification du répertoire de musique" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Pour sauver les pochettes, vous devez indiquer un chemin « music » valable " "dans les préférences." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album." msgstr[1] "albums." #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "artiste." msgstr[1] "artistes." #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "jour de bonheur" msgstr[1] "jours de bonheur" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "heure de bonheur" msgstr[1] "heures de bonheur" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Sauvegarder la liste" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" "Voulez-vous remplacer la liste de lecture existante ou ajouter ces chansons ?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Liste de lecture existante" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Remplacer la liste de lecture" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Ajouter les chansons" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Une liste de lecture homonyme existe déjà. Voulez-vous la remplacer ?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Nom de la liste" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Renommer la liste de lecture" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Zone de notification" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Haut gauche" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Haut droit" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Bas gauche" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Bas droite" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Centre de l'écran" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Connexion à MPD" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Nom" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Hôte" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_Répertoire de musique" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Sélectionnez le répertoire de musique" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "_Mot de passe" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Laisser vide si le mot de passe n'est pas nécessaire." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "_Connexion automatique au démarrage" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Utilisation de MPD_HOST/PORT" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Extras" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Identifiant :" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Mot de passe :" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "Popup de _notification au changement de chanson" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Durée du fondu enchaîné" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "_Durée du fondu enchaîné" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sec." #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "_Fondu enchaîné" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Affichage" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "_Pochette" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standard" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Boîtier" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Style de la pochette :" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "En local seulement" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Local et à distance" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Chemins de recherche :" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "SONG_DIR" #: .././sonata/preferences.py:269 msgid "custom" msgstr "personnalisé" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Sauver la pochette vers :" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Afficher les boutons de lecture/volume" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "Activer la _barre de progression" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "Afficher la barre de _statut" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "_Paroles" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Sauver les paroles vers :" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "_Zone de notification" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Comportement de la fenêtre" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "Montrer la fenêtre sur tous les _espaces de travail" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "Toujours _au-dessus des autres fenêtres" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "_Masquer la décoration de la fenêtre" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_Réduire dans la zone de notification à la fermeture" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Si activé, à la fermeture, Sonata se minimisera dans la zone de " "notification. NB : il est impossible de détecter la présence d'une zone de " "notification. Vérifiez que vous en avez une." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Divers" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "Mettre à jour la _bibliothèque de MPD au démarrage" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Si activé, Sonata mettra à jour automatiquement votre bibliothèque MPD lors " "de son démarrage." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "Arrêter la lecture en _quittant" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD permet d'écouter de la musique même quand le client n'est pas lancé. Si " "cette option est activée, Sonata se comportera comme un lecteur traditionnel " "et stoppera la lecture à sa fermeture." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "Écrire dans le _fichier d'état :" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Si activé, Sonata générera un fichier semblable à « xmms-infopipe », " "contenant des informations à propos de la chanson en cours. De nombreuses " "applications gère ce fichier (messageries instantanées, clients IRC, etc.)." #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Format de la chanson" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "_Liste courante :" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Bibliothèque :" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Titre de la fenêtre :" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "_Chanson courante (ligne 1) :" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "_Chanson courante (ligne 2) :" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Options disponibles" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Artiste" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Album" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Titre de chanson" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Numéro de piste" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Numéro du disque" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Chemin du fichier" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Nom du fichier" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Nom du flux" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Longueur de la chanson" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Temps écoulé (titre seulement)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "" "Informations affichées uniquement si toutes les étiquettes sont présentes." #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Crée des colonnes dans la liste courante" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_À propos" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Configurer..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Chargé" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Description" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Comportement" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Format" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Nouveau Profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Pochette Personnalisée" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Fichier de la pochette" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Éditer le flux" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Nouveau flux" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL du Flux" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Un flux homonyme existe déjà. Voulez-vous le remplacer ?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "Taglib et/ou taggy non trouvé, l'édition des étiquettes ne sera pas possible." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Éditer les Étiquettes" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Tagpy < 0.91. Veuillez mettre à jour vers une version plus récente, support " "des tags désactivés." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Le chemin" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "" "n'existe pas. Merci d'indiquer un chemin « music » valable dans les " "préférences." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Fichier" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "" "n'existe pas. Merci d'indiquer un chemin « music » valable dans les " "préférences." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Aucun fichier audio avec des étiquettes éditables n'a été trouvé." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Commentaire" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Tout sauver" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Incrémenter chaque fichier sélectionné, en démarrant à 1 pour ce fichier." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Appliquer à tous les fichiers sélectionnés" #: .././sonata/tagedit.py:260 msgid "of" msgstr "sur" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Impossible de sauvegarder l'étiquette dans le fichier audio." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Masquer le chemin du fichier" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Afficher le chemin du fichier" �����������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/it.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000124073�11255764730�0014557�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is distributed under the same license as the Sonata package. # Gianni Vialetto <forgottencrow@gmail.com>, 2007. # # Translator Notes (in Italian): # # Track & Song: non è necessario distinguere questi due termini, in quanto # utilizzando mpd non c'è distinzione tra tracce audio e file mp3. # Vengono tradotti entrambi come "brano". # # Music dir: è stato lasciato come "Music dir", principalmente per motivi di # spazio. Potrebbe essere modificato in future release. # msgid "" msgstr "" "Project-Id-Version: Sonata 1.333\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2007-10-28 23:35+0100\n" "Last-Translator: Gianni Vialetto <forgottencrow@gmail.com>\n" "Language-Team: Sonata-IT <nomail@nomail.it>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Informazioni su Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Preferenze" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:55 #, fuzzy msgid "Switch to [1st-5th] tab" msgstr "Vai agli stream" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Connetti a MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Disconnetti da MPD" #: .././sonata/about.py:58 #, fuzzy msgid "Randomize current playlist" msgstr "Playlist corrente:" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Passa alla modalità normale/estesa" #: .././sonata/about.py:60 #, fuzzy msgid "Switch to previous tab" msgstr "Vai alle playlist" #: .././sonata/about.py:61 #, fuzzy msgid "Switch to next tab" msgstr "Vai agli stream" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Passa alla modalità compatta" #: .././sonata/about.py:63 .././sonata/library.py:86 #, fuzzy msgid "Search library" msgstr "Vai alla libreria" #: .././sonata/about.py:64 msgid "Quit" msgstr "Esci" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Aggiorna tutta la libreria" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Mostra menu popup" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimizza nell'area di notifica (se è abilitata l'opzione)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Brano precedente" #: .././sonata/about.py:70 msgid "Next track" msgstr "Brano successivo" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Riproduci/Pausa" #: .././sonata/about.py:72 msgid "Stop" msgstr "Ferma" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Abbassa il volume" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Alza il volume" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Riproduci il brano selezionato" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Rimuovi il brano od i brani selezionati" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Centra la playlist sul brano in riproduzione" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Modifica i tag selezionati" #: .././sonata/about.py:80 #, fuzzy msgid "Save to new playlist" msgstr "Salva la playlist" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Cancella la playlist" #: .././sonata/about.py:82 #, fuzzy msgid "Randomize list" msgstr "Rinomina Playlist" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Aggiungi il/i brani selezionati od inserisci il nome di una cartella" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Vai alla cartella di livello superiore" #: .././sonata/about.py:86 #, fuzzy msgid "Add selected item(s)" msgstr "Aggiungi lo stream o gli stream selezionati" #: .././sonata/about.py:87 #, fuzzy msgid "Replace with selected item(s)" msgstr "Sostituisci con lo stream o gli stream selezionati" #: .././sonata/about.py:89 #, fuzzy msgid "Add selected item(s) and play" msgstr "Aggiungi lo stream o gli stream selezionati" #: .././sonata/about.py:90 #, fuzzy msgid "Replace with selected item(s) and play" msgstr "Sostituisci con lo stream o gli stream selezionati" #: .././sonata/about.py:91 #, fuzzy msgid "Update selected item(s)/path(s)" msgstr "Aggiungi lo stream o gli stream selezionati" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Aggiungi la playlist o le playlist selezionate" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Rimuovi la playlist o le playlist selezionate" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Sostituisci con la playlist o le playlist selezionate" #: .././sonata/about.py:97 #, fuzzy msgid "Add selected playlist(s) and play" msgstr "Aggiungi la playlist o le playlist selezionate" #: .././sonata/about.py:98 #, fuzzy msgid "Replace with selected playlist(s) and play" msgstr "Sostituisci con la playlist o le playlist selezionate" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Aggiungi lo stream o gli stream selezionati" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Rimuovi lo stream o gli stream selezionati" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Sostituisci con lo stream o gli stream selezionati" #: .././sonata/about.py:104 #, fuzzy msgid "Add selected stream(s) and play" msgstr "Aggiungi lo stream o gli stream selezionati" #: .././sonata/about.py:105 #, fuzzy msgid "Replace with selected stream(s) and play" msgstr "Sostituisci con lo stream o gli stream selezionati" #: .././sonata/about.py:107 #, fuzzy msgid "Edit playing song's tags" msgstr "Modifica i tag selezionati" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Tasti scorciatoia Principali" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Tasti scorciatoia per la gestione della riproduzione dei brani" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Tasti scorciatoia Comuni" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Tasti scorciatoia per la gestione della Libreria" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Tasti scorciatoia per la gestione delle Playlist" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Tasti scorciatoia per la gestione degli Stream" #: .././sonata/about.py:116 #, fuzzy msgid "Info Shortcuts" msgstr "Tasti scorciatoia Principali" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Shortcuts" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Un elegante client per MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Shortcuts" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Impossibile lanciare un browser compatibile." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Avvia browser" #: .././sonata/cli.py:81 #, fuzzy msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "" "L'argomento --toggle richiede D-Bus, che non è apparentemente presente sul " "sistema. Annullo l'operazione." #: .././sonata/cli.py:97 #, fuzzy msgid "Version" msgstr "Versione: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 #, fuzzy msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Uso: sonata [OPZIONE]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Opzioni" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Stampa questo messaggio di aiuto" #: .././sonata/cli.py:107 #, fuzzy msgid "Popup song notification (requires D-Bus)" msgstr "Popup di notifica al cambio del brano in riproduzione" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Cambia lo stato dell'applicazione da ridotta ad icona" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "a visibile e viceversa (richiede D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Stampa le informazioni sulla versione ed esce" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "" "Avvia l'applicazione ridotta nell'area di notifica\n" "\t\t\t (richiede la presenza di un'area di notifica)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "" "Avvia l'applicazione in primo piano\n" "\t\t\t (richiede la presenza di un'area di notifica)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Avvia con profilo [NUMERO]" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Commento" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Riproduce il primo brano nella playlist" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Mette in pausa la riproduzione del brano corrente" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Termina la riproduzione del brano corrente" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Inizia la riproduzione del brano successivo nella playlist" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Inizia la riproduzione del brano precedente nella playlist" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Metti in pausa od avvia/riavvia la riproduzione" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Attiva/Disattiva riproduzione continua" #: .././sonata/cli.py:124 #, fuzzy msgid "Toggle random mode" msgstr "Attiva/Disattiva riproduzione continua" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Mostra informazioni sul brano attualmente in riproduzione" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Mostra lo status di MPD" #: .././sonata/cli.py:134 #, fuzzy, python-format msgid "Starting Sonata with profile %s..." msgstr "Avvia Sonata con questo profilo" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, fuzzy, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Profilo non valido. Il numero inserito deve essere tra 1 e" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 #, fuzzy msgid "Default Profile" msgstr "Nuovo Profilo" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "" #: .././sonata/cli.py:176 #, fuzzy msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Impossibile connettersi ad MPD.\n" "Controlla le impostazioni di Sonata." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Titolo" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Artista" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Data" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Traccia" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Genere" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "File" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Tempo" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitrate" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD non avviato" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Stato" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Riproducendo" #: .././sonata/cli.py:230 msgid "Paused" msgstr "In Pausa" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "In Pausa" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Riproduzione Continua" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Off" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "On" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Ordine Casuale" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Volume" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Crossfade" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 #, fuzzy msgid "second" msgid_plural "seconds" msgstr[0] "secondo" msgstr[1] "secondo" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filtro" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonata non ha potuto connettersi a D-BUS: è impossibile determinare " "l'indirizzo del message bus (per informazioni digita 'man dbus-launch' e " "'man dbus-daemon')" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Avvia Sonata con questo profilo" #: .././sonata/dbus_plugin.py:100 #, fuzzy msgid "Maybe Sonata is not running?" msgstr "Sonata è già in esecuzione!" #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata è già in esecuzione!" #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Informazioni sul brano" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "" #: .././sonata/info.py:130 #, fuzzy msgid "Edit song tags" msgstr "Modifica i tag selezionati" #. Lyrics #: .././sonata/info.py:140 #, fuzzy msgid "Lyrics" msgstr "_Testo" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:161 #, fuzzy msgid "Album Info" msgstr "Informazioni sull'_Album" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "" #: .././sonata/info.py:215 msgid "hide" msgstr "" #: .././sonata/info.py:281 #, fuzzy msgid "edit tags" msgstr "Modifica Tags" #: .././sonata/info.py:308 #, fuzzy msgid "Album info not found." msgstr "Nome dell'album sconosciuto" #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Nome dell'album sconosciuto" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "" "Libreria ZSI non trovata, il supporto per la ricerca dei testi è stato " "disabilitato." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Artista o nome del brano sconosciuti" #: .././sonata/info.py:371 #, fuzzy msgid "search" msgstr "Cerca" #: .././sonata/info.py:372 #, fuzzy msgid "edit" msgstr "Modifica Tags" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Il testo del brano non è stato trovato" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Ricerca e download del testo in corso..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Impossibile connettersi a LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Impossibile cercare il testo del brano" #: .././sonata/library.py:47 msgid "Untagged" msgstr "" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Artisti Vari" #: .././sonata/library.py:49 msgid "Filename" msgstr "File" #: .././sonata/library.py:49 msgid "Everything" msgstr "Tutti" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Filesystem" #: .././sonata/library.py:53 #, fuzzy msgid "Artists" msgstr "Artista" #: .././sonata/library.py:54 #, fuzzy msgid "Albums" msgstr "Album" #: .././sonata/library.py:55 #, fuzzy msgid "Genres" msgstr "Genere" #: .././sonata/library.py:84 #, fuzzy msgid "Search terms" msgstr "Modifica chiavi di ricerca" #: .././sonata/library.py:90 #, fuzzy msgid "End Search" msgstr "Finisci Ric_erca" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Modalità di visualizzazione della Libreria" #: .././sonata/library.py:96 #, fuzzy msgid "Search" msgstr "Cerca" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "brano" msgstr[1] "brani" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuto" msgstr[1] "minuti" #: .././sonata/library.py:849 #, fuzzy msgid "Song" msgstr "brano" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Percorso" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Corrente" #: .././sonata/main.py:103 msgid "Library" msgstr "Libreria" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Playlists" #: .././sonata/main.py:105 msgid "Streams" msgstr "Streams" #: .././sonata/main.py:106 #, fuzzy msgid "Info" msgstr "Informazioni sul brano" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Tutta il brano" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "Ordina Li_sta" #: .././sonata/main.py:235 #, fuzzy msgid "Sa_ve List to" msgstr "Salva le copertine in:" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Connessione" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "" #: .././sonata/main.py:238 .././sonata/main.py:2454 #, fuzzy msgid "_Update" msgstr "_Aggiorna la Libreria" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Utilizza Immagine _Remota" #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Utilizza Immagine _Locale" #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 #, fuzzy msgid "Reset Image" msgstr "Apri Immagine" #: .././sonata/main.py:243 msgid "_Play" msgstr "Ri_produci" #: .././sonata/main.py:244 #, fuzzy msgid "Pa_use" msgstr "_Pausa" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Ferma" #: .././sonata/main.py:246 #, fuzzy msgid "Pre_vious" msgstr "_Precedente" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Successivo" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Esci" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Rimuovi" #: .././sonata/main.py:250 msgid "_Clear" msgstr "Pulis_ci" #: .././sonata/main.py:251 #, fuzzy msgid "_Entire Library" msgstr "_Aggiorna la Libreria" #: .././sonata/main.py:252 #, fuzzy msgid "_Selected Items" msgstr "Aggiungi lo stream o gli stream selezionati" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Preferenze" #: .././sonata/main.py:254 msgid "_About..." msgstr "Inform_azioni su..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "Modifica _Tags..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Aggiungi" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Sostituisci" #: .././sonata/main.py:258 #, fuzzy msgid "Add" msgstr "_Aggiungi" #: .././sonata/main.py:259 #, fuzzy msgid "Replace" msgstr "_Sostituisci" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Cancella" #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Riproduzione Casuale" #: .././sonata/main.py:286 #, fuzzy msgid "S_how Sonata" msgstr "Mostra _Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Ripeti" #: .././sonata/main.py:288 #, fuzzy msgid "Rando_m" msgstr "Ordine Casuale" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Per Artista" #: .././sonata/main.py:429 msgid "By Album" msgstr "Per Album" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Per Titolo dei brani" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Per Nome del File" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Per Cartella e Nome del File" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Inverti Ordine della Lista" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Nuovo" #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Modifica..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Rinomina..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Playlist" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Fai click per passare in modalità estesa" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Fai click per passare in modalità compatta" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Non Connesso" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "" #: .././sonata/main.py:645 #, fuzzy msgid "Cover Art" msgstr "C_opertina" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 #, fuzzy msgid "Profile" msgstr "Nuovo Profilo" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Disconnetti" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Anno" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Stream" #: .././sonata/main.py:1193 msgid "Len" msgstr "Lunghezza" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Sconosciuto" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:1761 #, fuzzy msgid "hour" msgid_plural "hours" msgstr[0] "ora e" msgstr[1] "ore e" #: .././sonata/main.py:1766 .././sonata/main.py:1768 #, fuzzy msgid "and" msgstr "Ordine Casuale" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(aggiornando la libreria...)" #: .././sonata/main.py:2116 #, fuzzy msgid "Lyrics Search" msgstr "_Testo" #: .././sonata/main.py:2117 #, fuzzy msgid "_Search" msgstr "Cerca" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Nome dell'Artista" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Titolo del Brano" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Apri Immagine" #: .././sonata/main.py:2379 msgid "Images" msgstr "Immagini" #: .././sonata/main.py:2383 msgid "All files" msgstr "Tutti i file" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Scegli Copertina" #: .././sonata/main.py:2426 #, fuzzy msgid "C_hoose" msgstr "Scegli" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Modifica chiavi di ricerca" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Nessun risultato tra i nomi degli artisti o degli album." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Copertina non trovata." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Cancellare la playlist selezionata?" msgstr[1] "Cancellare le playlist selezionate?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Cancella la Playlist" msgstr[1] "Cancella le Playlist" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Cancellare lo Stream?" msgstr[1] "Cancellare gli Stream?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Cancella Stream" msgstr[1] "Cancella Stream" #: .././sonata/main.py:2909 #, fuzzy msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "devi specificare una music dir valida." #: .././sonata/main.py:2909 .././sonata/main.py:2916 #, fuzzy msgid "Music Dir Verification" msgstr "Verifica Audioscrobbler" #: .././sonata/main.py:2916 #, fuzzy msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "devi specificare una music dir valida." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "album" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "artista" msgstr[1] "artisti" #: .././sonata/main.py:3340 #, fuzzy msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "ora di paradiso" msgstr[1] "ore di paradiso" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "ora di paradiso" msgstr[1] "ore di paradiso" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Salva Playlist" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" #: .././sonata/playlists.py:120 #, fuzzy msgid "Existing Playlist" msgstr "Playlist" #: .././sonata/playlists.py:120 #, fuzzy msgid "Replace playlist" msgstr "Rinomina Playlist" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "" "Esiste già una playlist con questo nome. Desideri sostituirla con questa?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Nome della Playlist" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Rinomina Playlist" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Area di notifica" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "In Alto a Sinistra" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "In Alto a Destra" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "In Basso a Sinistra" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "In Basso a Destra" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Connessione ad MPD" #: .././sonata/preferences.py:76 #, fuzzy msgid "_Name" msgstr "Nome" #: .././sonata/preferences.py:79 #, fuzzy msgid "_Host" msgstr "Host" #: .././sonata/preferences.py:82 #, fuzzy msgid "_Port" msgstr "Porta" #: .././sonata/preferences.py:86 #, fuzzy msgid "_Music dir" msgstr "Music dir" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:91 #, fuzzy msgid "Pa_ssword" msgstr "Password" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Lasciare vuoto se non è richiesta nessuna password" #: .././sonata/preferences.py:95 #, fuzzy msgid "_Autoconnect on start" msgstr "Connettiti automaticamente all'avvio" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Extra" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 #, fuzzy msgid "_Username:" msgstr "Nome utente:" #: .././sonata/preferences.py:171 #, fuzzy msgid "_Password:" msgstr "Password:" #: .././sonata/preferences.py:188 #, fuzzy msgid "Popup _notification on song changes" msgstr "Popup di notifica al cambio del brano in riproduzione" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Durata dell'effetto Crossfade" #: .././sonata/preferences.py:211 #, fuzzy msgid "_Fade length" msgstr "Durata dell'effetto Crossfade" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sec" #: .././sonata/preferences.py:218 #, fuzzy msgid "C_rossfade" msgstr "Crossfade" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Display" #: .././sonata/preferences.py:251 #, fuzzy msgid "_Album art" msgstr "Album" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "" #: .././sonata/preferences.py:256 #, fuzzy msgid "Artwork style:" msgstr "nome dell'artwork" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Solo in locale" #: .././sonata/preferences.py:258 #, fuzzy msgid "Local and remote" msgstr "In locale, poi in remoto" #: .././sonata/preferences.py:260 #, fuzzy msgid "Search locations:" msgstr "Cerca" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 #, fuzzy msgid "custom" msgstr "nome personalizzato" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Salva le copertine in:" #: .././sonata/preferences.py:277 #, fuzzy msgid "_Playback/volume buttons" msgstr "Mostra pulsanti per la riproduzione ed il controllo del volume" #: .././sonata/preferences.py:280 #, fuzzy msgid "Pr_ogressbar" msgstr "Abilita l'effetto Crossfade" #: .././sonata/preferences.py:283 #, fuzzy msgid "_Statusbar" msgstr "Mostra barra di stato" #: .././sonata/preferences.py:286 #, fuzzy msgid "Song Ly_rics" msgstr "_Testo" #: .././sonata/preferences.py:288 #, fuzzy msgid "Save lyrics to:" msgstr "Salva le copertine in:" #: .././sonata/preferences.py:297 #, fuzzy msgid "System _tray icon" msgstr "Area di notifica" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Comportamento della finestra" #: .././sonata/preferences.py:323 #, fuzzy msgid "_Show window on all workspaces" msgstr "Mostra finestra in tutte le aree di lavoro" #: .././sonata/preferences.py:326 #, fuzzy msgid "_Keep window above other windows" msgstr "Mantieni la finestra in primo piano" #: .././sonata/preferences.py:329 #, fuzzy msgid "_Hide window titlebar" msgstr "Titolo della finestra:" #: .././sonata/preferences.py:334 #, fuzzy msgid "_Minimize to system tray on close/escape" msgstr "Minimizza nell'area di notifica se sonata viene chiuso" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Se abilitato, chiudere Sonata lo minimizzerà semplicemente nell'area di " "notifica. Poichè è correntemente impossibile sapere se è disponibile o meno " "un'area di notifica, assicurati di utilizzarne una prima di selezionare " "questa opzione." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Varie" #: .././sonata/preferences.py:354 #, fuzzy msgid "_Update MPD library on start" msgstr "Aggiorna la libreria di MPD all'avvio del programma" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Se abilitato, Sonata rigenererà automaticamente la libreria di MPD quanto " "viene avviato." #: .././sonata/preferences.py:358 #, fuzzy msgid "S_top playback on exit" msgstr "Termina la riproduzione alla chiusura del programma" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD continua a riprodurre musica anche se non c'è nessun client aperto. Se " "questa opzione è abilitata, Sonata si comporterà come un lettore musicale " "convenzionale, concludendo la riproduzione del brano corrente quando il " "programma viene chiuso." #: .././sonata/preferences.py:362 #, fuzzy msgid "_Write status file:" msgstr "Scrivi un file di stato:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Se questa opzione è abilitata, Sonata creerà un file contenente informazioni " "sul brano corrente in maniera simile ad xmms. Molte applicazioni supportano " "il file xmms-info creato (Instant Messenger, Client IRC...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Formato del brano" #: .././sonata/preferences.py:397 #, fuzzy msgid "C_urrent playlist:" msgstr "Playlist corrente:" #: .././sonata/preferences.py:398 #, fuzzy msgid "_Library:" msgstr "Libreria:" #: .././sonata/preferences.py:399 #, fuzzy msgid "_Window title:" msgstr "Titolo della finestra:" #: .././sonata/preferences.py:400 #, fuzzy msgid "Current _song line 1:" msgstr "Brano corrente linea 1:" #: .././sonata/preferences.py:402 #, fuzzy msgid "Current s_ong line 2:" msgstr "Brano corrente linea 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Opzioni disponibili" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Artista" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Album" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Titolo della Traccia" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Numero della Traccia" #: .././sonata/preferences.py:430 #, fuzzy msgid "Disc number" msgstr "Numero della Traccia" #: .././sonata/preferences.py:433 #, fuzzy msgid "File path" msgstr "Posizione del file" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Nome del file" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Nome dello Stream" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Lunghezza del brano" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Tempo trascorso (solo titolo della finestra)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "" "Le informazioni sono mostrate solo se i tag ID3 sono definiti nel file." #: .././sonata/preferences.py:448 #, fuzzy msgid "Creates columns in the current playlist" msgstr "Playlist corrente:" #: .././sonata/preferences.py:473 #, fuzzy msgid "_About" msgstr "Inform_azioni su..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "" #: .././sonata/preferences.py:521 msgid "Description" msgstr "" #. Set up table #: .././sonata/preferences.py:532 #, fuzzy msgid "MPD" msgstr "_MPD" #: .././sonata/preferences.py:534 #, fuzzy msgid "Behavior" msgstr "_Comportamento" #: .././sonata/preferences.py:535 #, fuzzy msgid "Format" msgstr "_Formato" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Nuovo Profilo" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Artwork personalizzato" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "nome dell'artwork" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Modifica Stream" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Nuovo Stream" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL dello Stream" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "" "Esiste già uno Stream con questo nome. Desideri sostituirlo con questo?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "Librerie taglib e/o tagpy non trovate, il supporto alla modifica dei tag id3 " "è stato disabilitato." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Modifica Tags" #: .././sonata/tagedit.py:70 #, fuzzy msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Librerie taglib e/o tagpy non trovate, il supporto alla modifica dei tag id3 " "è stato disabilitato." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "La posizione" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "non esiste. Specifica una music dir valida nelle preferenze." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Il File " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "non esiste. Specifica una music dir valida nelle preferenze." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Nessun brano con tag editabili trovato." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Commento" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "S_alva tutto." #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Incrementa il numero di traccia per ogni brano selezionato, partendo dalla " "traccia 1 per questo." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Applica a tutti i file musicali selezionati." #: .././sonata/tagedit.py:260 msgid "of" msgstr "di" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Impossibile salvare i tag nel file." #: .././sonata/tagedit.py:366 #, fuzzy msgid "Hide file path" msgstr "Posizione del file" #: .././sonata/tagedit.py:369 #, fuzzy msgid "Show file path" msgstr "Posizione del file" #, fuzzy #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "" #~ "L'argomento --toggle richiede D-Bus, che non è apparentemente presente " #~ "sul sistema. Annullo l'operazione." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Aggiorna la Libreria" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Sito web: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Abilita Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Abilita l'effetto Crossfade" #~ msgid "Enable album art" #~ msgstr "Abilita Copertina" #~ msgid "Enable lyrics" #~ msgstr "Abilita la ricerca dei testi" #~ msgid "Enable system tray icon" #~ msgstr "Mostra icona nell'area di notifica" #~ msgid "_Display" #~ msgstr "_Finestra" #~ msgid "_Extras" #~ msgstr "_Extra" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "Librerie PyGTK+ 2.10 e/o gnome-python-extras non trovate, il supporto " #~ "all'area di notifica è stato disabilitato." #~ msgid "Reset to Default" #~ msgstr "Ripristina le impostazioni di Default" #, fuzzy #~ msgid "_New Playlist..." #~ msgstr "_Salva Playlist..." #~ msgid "Notification" #~ msgstr "Notifica" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 o la libreria python-elementtree non sono installati, il " #~ "supporto ad audioscrobbler è stato disabilitato." #~ msgid "Audioscrobbler Verification" #~ msgstr "Verifica Audioscrobbler" #, fuzzy #~ msgid "Update library for selected item(s)" #~ msgstr "Aggiorna la libreria per i percorsi selezionati" #~ msgid "_Shuffle" #~ msgstr "Mi_schia" #~ msgid "Toggle shuffle mode" #~ msgstr "Attiva/Disattiva riproduzione casuale" #~ msgid "Not connected" #~ msgstr "Non connesso" #~ msgid "Press enter to search for these terms." #~ msgstr "Premi invio per cercare con questa chiave di ricerca" #~ msgid "Add new profile" #~ msgstr "Aggiungi un nuovo profilo" #~ msgid "Remove current profile" #~ msgstr "Rimuovi il profilo corrente" #~ msgid "Play enqueued files on activate" #~ msgstr "Riproduci brani in coda quando attivato" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Riproduce automaticamente i brani in coda quando sonata viene attivato " #~ "con un doppio click o premendo invio." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Aggiungi il/i brani selezionati o la/le cartelle selezionate" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Sostituisci con il/i brani selezionati o la/le cartelle selezionate" #~ msgid "Add to _Queue" #~ msgstr "Aggiungi alla _Coda" #~ msgid "Remove from _Queue" #~ msgstr "Rimuovi dalla _Coda" #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Aggiungi il brano od i brani selezionati alla coda della playlist" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Rimuovi il brano od i brani selezionati dalla coda della playlist" #~ msgid "seconds" #~ msgstr "secondi" #~ msgid "Song Info..." #~ msgstr "Informazioni sul brano" #~ msgid "Click to collapse the player" #~ msgstr "Fai click per passare in modalità compatta" #~ msgid "Click to expand the player" #~ msgstr "Fai click per passare in modalità estesa" #~ msgid "_Song Info" #~ msgstr "Informazioni _sul brano" #~ msgid "_Search..." #~ msgstr "_Cerca..." #~ msgid "Remote only" #~ msgstr "Solo in remoto" #~ msgid "Remote, then local" #~ msgstr "In remoto, poi in locale" #~ msgid "To save artwork as" #~ msgstr "Salva artwork come" #~ msgid "Artwork Verification" #~ msgstr "Verifica Artwork" #~ msgid "Switch to current playlist" #~ msgstr "Vai alla playlist corrente" #~ msgid "Toggle filter bar for jumping straight to track" #~ msgstr "" #~ "Attiva/Disattiva barra dei filtri per saltare direttamente alla traccia" #~ msgid "Song name" #~ msgstr "Brano" #~ msgid "songs." #~ msgstr "brani." ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/ja.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000121157�11255764730�0014535�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Japanese translation for Sonata package. # Copyright (C) 2009 Sonata's COPYRIGHT HOLDER # This file is distributed under the same license as the sonata package. # Masato Hashimoto <cabezon.hashimoto@gmail.com>, 2009. # msgid "" msgstr "" "Project-Id-Version: sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-03-23 21:53+0900\n" "Last-Translator: Masato Hashimoto <cabezon.hashimoto@gmail.com>\n" "Language-Team: Japanese <ja@li.org>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Sonata について" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "設定" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "アートワークモードの全画面化" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "1 - 5 のタブに切り換え" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "MPD に接続" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "MPD から切断" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "現在のプレイリストをランダムに" #: .././sonata/about.py:59 msgid "Expand player" msgstr "プレイヤの展開" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "前のタブへ切り換え" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "次のタブへ切り換え" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "プレイヤを折り畳む" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "ライブラリの検索" #: .././sonata/about.py:64 msgid "Quit" msgstr "終了" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "ライブラリ全体の更新" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "ポップアップメニューの表示" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "システムトレイへ最小化 (可能であれば)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "前のトラック" #: .././sonata/about.py:70 msgid "Next track" msgstr "次のトラック" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "再生 / 一時停止" #: .././sonata/about.py:72 msgid "Stop" msgstr "停止" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "ボリュームを下げる" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "ボリュームを上げる" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "選択した曲の再生" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "選択した曲の削除" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "現在再生中の曲を中央へ" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "選択した曲のタグの編集" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "新しいプレイリストに保存" #: .././sonata/about.py:81 msgid "Clear list" msgstr "リストのクリア" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "リストをランダムに" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "選択した曲の追加 / ディレクトリへ移動" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "親ディレクトリへ移動" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "選択したアイテムの追加" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "選択したアイテムで置き換え" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "選択したアイテムを追加して再生" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "選択したアイテムで置き換えて再生" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "選択したアイテム/パスの更新" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "選択したプレイリストの追加" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "選択したプレイリストの削除" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "選択したプレイリストで置き換え" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "選択したプレイリストを追加して再生" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "選択したプレイリストで置き換えて再生" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "選択したストリームの追加" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "選択したストリームの削除" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "選択したストリームで置き換え" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "選択したストリームを追加して再生" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "選択したストリームで置き換えて再生" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "再生中の曲のタグの編集" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "メインショートカット" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "再生のショートカット" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "現在のプレイリストのショートカット" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "ライブラリのショートカット" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "プレイリストのショートカット" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "ストリームのショートカット" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "情報のショートカット" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "ショートカット" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "エレガントな MPD クライアント" #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "ショートカット(_S)" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "適切なブラウザを起動できません。" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "ブラウザの起動" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "--toggle および --popup オプションには D-Bus が必要です。終了します。" #: .././sonata/cli.py:97 msgid "Version" msgstr "バージョン" #: .././sonata/cli.py:98 msgid "Website" msgstr "ウェブサイト" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "使用法: sonata [OPTION]... [COMMAND}..." #: .././sonata/cli.py:105 msgid "Options" msgstr "オプション" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "このヘルプを表示して終了する" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "楽曲をポップアップ通知する (D-Bus が必要)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "アプリケーションをシステムトレイに最小化または" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "表示を切り換える (D-Bus が必要)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "D-Bus コマンドが失敗したらアプリケーションを起動しない" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "バージョン情報を表示して終了する" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "非表示状態で起動する (システムトレイが必要)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "表示状態で起動する (システムトレイが必要)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "プロファイル [NUM] で起動する" #: .././sonata/cli.py:116 msgid "Commands" msgstr "コマンド" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "プレイリストの曲を再生する" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "再生中の曲を一時停止する" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "再生中の曲を停止する" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "プレイリストの次の曲を再生する" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "プレイリストの前の曲を再生する" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "再生/停止を切り替える" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "繰り返しモードを切り換える" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "ランダムモードを切り換える" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "現在の曲情報を表示する" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "MPD の状態を表示する" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Sonata をプロファイル %s で起動しています..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d は有効なプロファイル番号ではありません。" #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "プロファイル番号は 1 から %d の間でなければなりません。" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python は番号として %s を解釈できません。" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "デフォルトプロファイル" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr "by" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "from" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "MPD に接続できません。\n" "Sonata の設定や環境変数 MPD_HOST/MPD_PORT の値をチェックしてください。" #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "タイトル" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "アーティスト" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "アルバム" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "日付" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "トラック" #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "ジャンル" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "ファイル" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "時間" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "ビットレート" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD は停止しています" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "状態" #: .././sonata/cli.py:228 msgid "Playing" msgstr "再生中" #: .././sonata/cli.py:230 msgid "Paused" msgstr "一時停止" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "停止" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "繰り返し" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "オフ" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "オン" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "ランダム" #: .././sonata/cli.py:241 msgid "Volume" msgstr "ボリューム" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "クロスフェード" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "秒" msgstr[1] "秒" #: .././sonata/current.py:64 msgid "Filter" msgstr "フィルタ" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Sonata は D-BUS セッションへの接続に失敗しました: メッセージバスのアドレス解決ができません ('man dbus-launch' や 'man dbus-daemon' で調べてみてください)。" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "リモートコマンドの実行に失敗しました。" #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "代わりに Sonata を起動しています..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "もしかして Sonata が起動してないとか?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata のインスタンスはすでに起動しています。そちらを表示します..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "リモートコマンドの実行に失敗しました。" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "楽曲情報" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Wikipedia でアーティストを調べる" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Wikipedia でアルバムを調べる" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "拡張タグ表示の切り換え" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "この曲のタグを編集する" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "歌詞" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "歌詞を Lyricwiki.org で検索する" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Lyricwiki.org の歌詞を編集する" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "アルバム情報" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "もっと" #: .././sonata/info.py:215 msgid "hide" msgstr "隠す" #: .././sonata/info.py:281 msgid "edit tags" msgstr "タグの編集" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "アルバム情報が見つかりませんでした。" #: .././sonata/info.py:311 msgid "Album name not set." msgstr "アルバム名が設定されていません。" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI が見つかりませんでした。歌詞の取得サポートは無効になります。" #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "アーティストまたは曲のタイトルが設定されていません。" #: .././sonata/info.py:371 msgid "search" msgstr "検索" #: .././sonata/info.py:372 msgid "edit" msgstr "編集" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "歌詞が見つかりませんでした" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "歌詞を取得しています..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "LyricWiki に接続できませんでした" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "歌詞の取得に失敗しました" #: .././sonata/library.py:47 msgid "Untagged" msgstr "タグなし" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "いろんなアーティスト" #: .././sonata/library.py:49 msgid "Filename" msgstr "ファイル名" #: .././sonata/library.py:49 msgid "Everything" msgstr "すべて" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "ファイルシステム" #: .././sonata/library.py:53 msgid "Artists" msgstr "アーティスト" #: .././sonata/library.py:54 msgid "Albums" msgstr "アルバム" #: .././sonata/library.py:55 msgid "Genres" msgstr "ジャンル" #: .././sonata/library.py:84 msgid "Search terms" msgstr "検索語" #: .././sonata/library.py:90 msgid "End Search" msgstr "検索をやめる" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "ライブラリ表示モード" #: .././sonata/library.py:96 msgid "Search" msgstr "検索" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "曲" msgstr[1] "曲" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "分" msgstr[1] "分" #: .././sonata/library.py:849 msgid "Song" msgstr "曲" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "パス" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "現在のリスト" #: .././sonata/main.py:103 msgid "Library" msgstr "ライブラリ" #: .././sonata/main.py:104 msgid "Playlists" msgstr "プレイリスト" #: .././sonata/main.py:105 msgid "Streams" msgstr "ストリーム" #: .././sonata/main.py:106 msgid "Info" msgstr "情報" # Preference -> Extras -> Popup notification by cong changes (2sec, 3sec...Entire song) #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "曲中ずっと" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "リストの並べ替え(_S)" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "リストの保存(_V)" #: .././sonata/main.py:236 msgid "_Connection" msgstr "接続(_C)" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "再生(_L)" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "更新(_U)" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "リモートの画像を使用(_R)..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "ローカルの画像を使用(_L)..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "全画面モード(_F)" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "画像のリセット" #: .././sonata/main.py:243 msgid "_Play" msgstr "再生(_P)" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "一時停止(_U)" #: .././sonata/main.py:245 msgid "_Stop" msgstr "停止(_S)" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "前(_V)" #: .././sonata/main.py:247 msgid "_Next" msgstr "次(_N)" #: .././sonata/main.py:248 msgid "_Quit" msgstr "終了(_Q)" #: .././sonata/main.py:249 msgid "_Remove" msgstr "削除(_R)" #: .././sonata/main.py:250 msgid "_Clear" msgstr "クリア(_C)" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "ライブラリ全体(_E)" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "選択したアイテム(_S)" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "設定(_P)" #: .././sonata/main.py:254 msgid "_About..." msgstr "Sonata について(_A)..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "タグの編集(_E)..." #: .././sonata/main.py:256 msgid "_Add" msgstr "リストに追加(_A)" #: .././sonata/main.py:257 msgid "_Replace" msgstr "リストを置換(_R)" #: .././sonata/main.py:258 msgid "Add" msgstr "リストに追加" #: .././sonata/main.py:259 msgid "Replace" msgstr "リストを置換" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "削除(_D)..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "シャッフル" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "Sonata を表示(_H)" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "繰り返し(_R)" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "ランダム(_M)" #: .././sonata/main.py:428 msgid "By Artist" msgstr "アーティスト名順" #: .././sonata/main.py:429 msgid "By Album" msgstr "アルバム名順" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "曲名順" #: .././sonata/main.py:431 msgid "By File Name" msgstr "ファイル名順" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "ディレクトリ & ファイル名順" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "逆順" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "新規(_N)..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "編集(_E)..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "名前の変更(_R)..." #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "プレイリスト" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "クリックで展開します" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "クリックで折り畳みます" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "未接続" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "読み込み権がありません" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "カバーアート" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "プロファイル" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "切断" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "年" #: .././sonata/main.py:1192 msgid "Stream" msgstr "ストリーム" #: .././sonata/main.py:1193 msgid "Len" msgstr "長さ" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "不明" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "日" msgstr[1] "日" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "時間" msgstr[1] "時間" # HH hour(s) *and* MM minutes. Unnecessary for ja. #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr " " #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(mpd を更新しています)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "歌詞の検索" #: .././sonata/main.py:2117 msgid "_Search" msgstr "検索(_S)" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "アーティスト名" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "曲のタイトル" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "画像を開く" #: .././sonata/main.py:2379 msgid "Images" msgstr "画像" #: .././sonata/main.py:2383 msgid "All files" msgstr "全てのファイル" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "カバーアートの選択" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "選択(_H)" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "検索語の編集" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "アーティストまたはアルバム名が見つかりませんでした。" #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "カバーアートが見つかりませんでした。" #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "選択したプレイリストを削除しますか?" msgstr[1] "選択したプレイリストを削除しますか?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "プレイリストの削除" msgstr[1] "プレイリストの削除" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "選択したストリームを削除しますか?" msgstr[1] "選択したストリームを削除しますか?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "ストリームの削除" msgstr[1] "ストリームの削除" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "歌詞を音楽ファイルのディレクトリに保存する場合は、正しい音楽ディレクトリを指定してください。" #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "音楽ディレクトリの確認" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "アートワークを音楽ディレクトリに保存する場合は、正しい音楽ディレクトリを指定してください。" #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "アルバム" msgstr[1] "アルバム" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "アーティスト" msgstr[1] "アーティスト" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "日の幸せ" msgstr[1] "日の幸せ" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "時間の幸せ" msgstr[1] "時間の幸せ" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "プレイリストの保存" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "これらの曲を既存のプレイリストに追加しますか、それとも置き換えますか?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "既存のプレイリスト" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "プレイリストを置き換える" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "曲を追加する" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "この名前のプレイリストはすでに存在します。置き換えますか?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "プレイリスト名" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "プレイリスト名の変更" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "システムトレイ" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "左上" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "右上" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "左下" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "右下" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "画面中央" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD 接続" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "名前(_N)" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "ホスト(_H)" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "ポート(_P)" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "音楽ディレクトリ(_M)" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "音楽ディレクトリの選択" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "パスワード(_S)" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "パスワードを必要としない場合は空白のままにしてください。" #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "起動時に自動的に接続する(_A)" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "MPD_HOST/PORT を使用しています" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "拡張" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "Audioscrobbler (Last.fm) を有効にする(_A)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "ユーザ名(_U):" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "パスワード(_P):" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "曲の変更時にポップアップ通知する(_N)" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "フェード時間:" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "フェード時間(_F):" #: .././sonata/preferences.py:213 msgid "sec" msgstr "秒" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "クロスフェードする(_R)" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "表示" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "アルバムアート(_A)" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "標準" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "スタイル化" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "アートワークスタイル:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "ローカルのみ" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "ローカルとリモート" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "検索場所:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "楽曲DIR" #: .././sonata/preferences.py:269 msgid "custom" msgstr "カスタム" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "アートの保存先:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "再生/ボリュームボタン(_P)" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "プログレスバー(_O)" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "ステータスバー(_S)" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "歌詞(_R)" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "歌詞の保存先:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "システムトレイアイコン(_T)" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "ウィンドウの振る舞い" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "全てのワークスペースで表示する(_S)" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "常に最前面に置く(_K)" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "ウィンドウのタイトルバーを表示しない(_H):" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "閉じたときシステムトレイに最小化する(_M)" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "このオプションを有効にすると、Sonata を閉じた際にシステムトレイに最小化されます。ただし、現在システムトレイが実際に存在するかどうかチェックできませんので、あなたがシステムトレイを使用している場合のみチェックマークをつけてください。" #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "その他" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "起動時に MPD ライブラリを更新する(_U)" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "このオプションを有効にすると、Sonata は起動時に MPD ライブラリを自動的に更新します。" #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "終了時に再生を止める(_T)" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD はクライアントが動作していなくても再生できます。このオプションを有効にすると、Sonata は伝統的な音楽プレイヤと同じように振る舞い、終了時に再生を停止します。" #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "状態をファイルに出力する(_W):" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "このオプションを有効にすると、Sonata は現在の曲についての情報を xmms-infopipe ライクなファイルに出力します。多くのアプリケーション (インスタントメッセンジャ、IRC クライアントなど) は xmms-info ファイルをサポートしています。" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "表示フォーマット" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "現在のプレイリスト(_U):" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "ライブラリ(_L):" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "ウィンドウタイトル(_W):" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "現在の曲の 1 行目(_S):" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "現在の曲の 2 行目(_O):" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "使用可能なオプション" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "アーティスト名" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "アルバム名" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "トラック名" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "トラック番号" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "ディスク番号" #: .././sonata/preferences.py:433 msgid "File path" msgstr "ファイルのパス" #: .././sonata/preferences.py:434 msgid "File name" msgstr "ファイル名" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "ストリーム名" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "曲の長さ" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "経過時間 (タイトルのみ)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "囲まれた内容は、その中にあるタグ全てに値が設定されている場合のみ表示されます" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "現在のプレイリストにカラムを作成します" #: .././sonata/preferences.py:473 msgid "_About" msgstr "Sonata について(_A)" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "設定(_C)..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "読み込み" #: .././sonata/preferences.py:521 msgid "Description" msgstr "説明" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "振る舞い" #: .././sonata/preferences.py:535 msgid "Format" msgstr "フォーマット" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "新しいプロファイル" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "カスタムアートワーク" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "アートワークファイル名" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "ストリームの編集" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "新しいストリーム" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "ストリーム URL" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "この名前のストリームはすでに存在します。置き換えちゃっていいですか?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Taglib か tagpy、またはその両方が見つかりませんでした。タグ編集サポートは無効になります。" #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "タグの編集" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Tagpy のバージョンが 0.91 より古いです。新しいバージョンにアップグレードしてください。タグ編集サポートは無効になります。" #: .././sonata/tagedit.py:75 msgid "The path" msgstr "パス" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "が存在しません。「設定」で正しい音楽ディレクトリを指定してください。" #: .././sonata/tagedit.py:99 msgid "File " msgstr "ファイル " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " が見つかりませんでした。「設定」で正しい音楽ディレクトリを指定してください。" #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "タグが編集可能な音楽ファイルが見つかりませんでした。" #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "コメント" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "全て保存(_A)" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "このファイルを 1 として、順番にトラック番号を振りなおします" #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "選択した全ての音楽ファイルに適用します" # Edit tags - n *of* m #: .././sonata/tagedit.py:260 msgid "of" msgstr "of" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "音楽ファイルにタグを保存できません。" #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "ファイルパスを表示しない" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "ファイルパスを表示する" #~ msgid "Enable Crossfade" #~ msgstr "クロスフェードを有効にする" #~ msgid "Enable album art" #~ msgstr "アルバムアートを有効にする" #~ msgid "file_path" #~ msgstr "ファイルのパス" #~ msgid "Enable lyrics" #~ msgstr "歌詞を表示する" #~ msgid "Enable system tray icon" #~ msgstr "システムトレイアイコンを表示する" #~ msgid "_Display" #~ msgstr "表示(_D)" #~ msgid "_Extras" #~ msgstr "拡張(_E)" #~ msgid "_Plugins" #~ msgstr "プラグイン(_P)" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/messages.po�����������������������������������������������������������������������0000664�0000000�0000000�00000070242�11255764730�0015750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-04-11 13:21-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:54 msgid "About Sonata" msgstr "" #: .././sonata/about.py:55 .././sonata/preferences.py:96 msgid "Preferences" msgstr "" #: .././sonata/about.py:56 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:57 msgid "Switch to [1st-5th] tab" msgstr "" #: .././sonata/about.py:58 msgid "Connect to MPD" msgstr "" #: .././sonata/about.py:59 msgid "Disconnect from MPD" msgstr "" #: .././sonata/about.py:60 msgid "Randomize current playlist" msgstr "" #: .././sonata/about.py:61 msgid "Expand player" msgstr "" #: .././sonata/about.py:62 msgid "Switch to previous tab" msgstr "" #: .././sonata/about.py:63 msgid "Switch to next tab" msgstr "" #: .././sonata/about.py:64 msgid "Collapse player" msgstr "" #: .././sonata/about.py:65 .././sonata/library.py:79 msgid "Search library" msgstr "" #: .././sonata/about.py:66 msgid "Quit" msgstr "" #: .././sonata/about.py:67 msgid "Update entire library" msgstr "" #: .././sonata/about.py:68 msgid "Display popup menu" msgstr "" #: .././sonata/about.py:69 msgid "Minimize to system tray (if enabled)" msgstr "" #: .././sonata/about.py:71 msgid "Previous track" msgstr "" #: .././sonata/about.py:72 msgid "Next track" msgstr "" #: .././sonata/about.py:73 msgid "Play/Pause" msgstr "" #: .././sonata/about.py:74 msgid "Stop" msgstr "" #: .././sonata/about.py:75 msgid "Lower the volume" msgstr "" #: .././sonata/about.py:76 msgid "Raise the volume" msgstr "" #: .././sonata/about.py:78 msgid "Play selected song" msgstr "" #: .././sonata/about.py:79 msgid "Remove selected song(s)" msgstr "" #: .././sonata/about.py:80 msgid "Center currently playing song" msgstr "" #: .././sonata/about.py:81 .././sonata/about.py:90 msgid "Edit selected song's tags" msgstr "" #: .././sonata/about.py:82 msgid "Save to new playlist" msgstr "" #: .././sonata/about.py:83 msgid "Clear list" msgstr "" #: .././sonata/about.py:84 msgid "Randomize list" msgstr "" #: .././sonata/about.py:86 msgid "Add selected song(s) or enter directory" msgstr "" #: .././sonata/about.py:87 msgid "Go to parent directory" msgstr "" #: .././sonata/about.py:88 msgid "Add selected item(s)" msgstr "" #: .././sonata/about.py:89 msgid "Replace with selected item(s)" msgstr "" #: .././sonata/about.py:91 msgid "Add selected item(s) and play" msgstr "" #: .././sonata/about.py:92 msgid "Replace with selected item(s) and play" msgstr "" #: .././sonata/about.py:93 msgid "Update selected item(s)/path(s)" msgstr "" #: .././sonata/about.py:95 .././sonata/about.py:97 msgid "Add selected playlist(s)" msgstr "" #: .././sonata/about.py:96 msgid "Remove selected playlist(s)" msgstr "" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s)" msgstr "" #: .././sonata/about.py:99 msgid "Add selected playlist(s) and play" msgstr "" #: .././sonata/about.py:100 msgid "Replace with selected playlist(s) and play" msgstr "" #: .././sonata/about.py:102 .././sonata/about.py:104 msgid "Add selected stream(s)" msgstr "" #: .././sonata/about.py:103 msgid "Remove selected stream(s)" msgstr "" #: .././sonata/about.py:105 msgid "Replace with selected stream(s)" msgstr "" #: .././sonata/about.py:106 msgid "Add selected stream(s) and play" msgstr "" #: .././sonata/about.py:107 msgid "Replace with selected stream(s) and play" msgstr "" #: .././sonata/about.py:109 msgid "Edit playing song's tags" msgstr "" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:112 msgid "Main Shortcuts" msgstr "" #: .././sonata/about.py:113 msgid "Playback Shortcuts" msgstr "" #: .././sonata/about.py:114 msgid "Current Shortcuts" msgstr "" #: .././sonata/about.py:115 msgid "Library Shortcuts" msgstr "" #: .././sonata/about.py:116 msgid "Playlist Shortcuts" msgstr "" #: .././sonata/about.py:117 msgid "Stream Shortcuts" msgstr "" #: .././sonata/about.py:118 msgid "Info Shortcuts" msgstr "" #: .././sonata/about.py:119 msgid "Shortcuts" msgstr "" #. XXX translate expressions, not words #. Show text: #: .././sonata/about.py:147 .././sonata/library.py:862 #: .././sonata/main.py:1756 msgid "song" msgid_plural "songs" msgstr[0] "" msgstr[1] "" #: .././sonata/about.py:148 msgid "album" msgid_plural "albums" msgstr[0] "" msgstr[1] "" #: .././sonata/about.py:149 msgid "artist" msgid_plural "artists" msgstr[0] "" msgstr[1] "" #: .././sonata/about.py:156 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "" msgstr[1] "" #: .././sonata/about.py:158 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "" msgstr[1] "" #: .././sonata/about.py:172 msgid "An elegant music client for MPD." msgstr "" #. Add button to show keybindings: #: .././sonata/about.py:185 msgid "_Shortcuts" msgstr "" #: .././sonata/about.py:196 .././sonata/main.py:3103 #: .././sonata/preferences.py:880 msgid "Unable to launch a suitable browser." msgstr "" #: .././sonata/about.py:196 .././sonata/main.py:3103 #: .././sonata/preferences.py:880 msgid "Launch Browser" msgstr "" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "" #: .././sonata/cli.py:97 msgid "Version" msgstr "" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "" #: .././sonata/cli.py:105 msgid "Options" msgstr "" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "" #: .././sonata/cli.py:116 msgid "Commands" msgstr "" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:178 msgid "Default Profile" msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:178 msgid "by" msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:178 msgid "from" msgstr "" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" #: .././sonata/cli.py:208 .././sonata/info.py:90 .././sonata/library.py:45 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/library.py:45 #: .././sonata/main.py:1180 .././sonata/tagedit.py:126 msgid "Artist" msgstr "" #: .././sonata/cli.py:210 .././sonata/info.py:93 .././sonata/library.py:45 #: .././sonata/main.py:1181 .././sonata/main.py:2432 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "" #: .././sonata/cli.py:211 .././sonata/info.py:95 msgid "Date" msgstr "" #: .././sonata/cli.py:212 .././sonata/info.py:96 .././sonata/main.py:1182 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "" #: .././sonata/cli.py:213 .././sonata/info.py:97 .././sonata/library.py:45 #: .././sonata/main.py:1185 .././sonata/preferences.py:557 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "" #: .././sonata/cli.py:214 .././sonata/info.py:98 .././sonata/main.py:1187 msgid "File" msgstr "" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "" #: .././sonata/cli.py:222 .././sonata/info.py:99 msgid "Bitrate" msgstr "" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "" #: .././sonata/cli.py:228 msgid "Playing" msgstr "" #: .././sonata/cli.py:230 msgid "Paused" msgstr "" #: .././sonata/cli.py:232 .././sonata/main.py:562 .././sonata/main.py:567 #: .././sonata/main.py:1829 .././sonata/main.py:1840 msgid "Stopped" msgstr "" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "" #: .././sonata/cli.py:241 msgid "Volume" msgstr "" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "" #: .././sonata/cli.py:242 .././sonata/preferences.py:277 msgid "second" msgid_plural "seconds" msgstr[0] "" msgstr[1] "" #: .././sonata/current.py:64 msgid "Filter" msgstr "" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "" #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "" #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "" #: .././sonata/info.py:92 msgid "Launch artist in Wikipedia" msgstr "" #: .././sonata/info.py:94 msgid "Launch album in Wikipedia" msgstr "" #: .././sonata/info.py:128 msgid "Toggle extra tags" msgstr "" #: .././sonata/info.py:131 msgid "Edit song tags" msgstr "" #. Lyrics #: .././sonata/info.py:141 msgid "Lyrics" msgstr "" #: .././sonata/info.py:153 msgid "Search Lyricwiki.org for lyrics" msgstr "" #: .././sonata/info.py:154 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:162 msgid "Album Info" msgstr "" #: .././sonata/info.py:214 .././sonata/info.py:219 msgid "more" msgstr "" #: .././sonata/info.py:216 msgid "hide" msgstr "" #: .././sonata/info.py:282 msgid "edit tags" msgstr "" #: .././sonata/info.py:309 msgid "Album info not found." msgstr "" #: .././sonata/info.py:312 msgid "Album name not set." msgstr "" #: .././sonata/info.py:326 msgid "ZSI not found, fetching lyrics support disabled." msgstr "" #: .././sonata/info.py:331 msgid "Artist or song title not set." msgstr "" #: .././sonata/info.py:373 msgid "search" msgstr "" #: .././sonata/info.py:374 msgid "edit" msgstr "" #: .././sonata/info.py:383 .././sonata/info.py:438 msgid "Lyrics not found" msgstr "" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:403 msgid "Fetching lyrics..." msgstr "" #: .././sonata/info.py:413 msgid "Couldn't connect to LyricWiki" msgstr "" #: .././sonata/info.py:441 msgid "Fetching lyrics failed" msgstr "" #: .././sonata/library.py:43 msgid "Untagged" msgstr "" #: .././sonata/library.py:44 msgid "Various Artists" msgstr "" #: .././sonata/library.py:45 msgid "Filename" msgstr "" #: .././sonata/library.py:45 msgid "Everything" msgstr "" #: .././sonata/library.py:77 msgid "Search terms" msgstr "" #: .././sonata/library.py:83 msgid "End Search" msgstr "" #: .././sonata/library.py:85 msgid "Library browsing view" msgstr "" #: .././sonata/library.py:89 msgid "Search" msgstr "" #: .././sonata/library.py:112 msgid "Filesystem" msgstr "" #: .././sonata/library.py:114 msgid "Albums" msgstr "" #: .././sonata/library.py:116 msgid "Artists" msgstr "" #: .././sonata/library.py:118 msgid "Genres" msgstr "" #. add the views button first #: .././sonata/library.py:378 msgid " v " msgstr "" #: .././sonata/library.py:862 .././sonata/main.py:1750 msgid "minute" msgid_plural "minutes" msgstr[0] "" msgstr[1] "" #: .././sonata/library.py:950 msgid "Song" msgstr "" #: .././sonata/library.py:950 .././sonata/main.py:1186 msgid "Path" msgstr "" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "" #: .././sonata/main.py:103 msgid "Library" msgstr "" #: .././sonata/main.py:104 msgid "Playlists" msgstr "" #: .././sonata/main.py:105 msgid "Streams" msgstr "" #: .././sonata/main.py:106 msgid "Info" msgstr "" #: .././sonata/main.py:137 .././sonata/preferences.py:278 #: .././sonata/preferences.py:279 msgid "Entire song" msgstr "" #: .././sonata/main.py:236 msgid "_Sort List" msgstr "" #: .././sonata/main.py:237 msgid "Sa_ve List to" msgstr "" #: .././sonata/main.py:238 msgid "_Connection" msgstr "" #: .././sonata/main.py:239 msgid "P_lay after" msgstr "" #: .././sonata/main.py:240 .././sonata/main.py:2446 msgid "_Update" msgstr "" #: .././sonata/main.py:241 msgid "Use _Remote Image..." msgstr "" #: .././sonata/main.py:242 msgid "Use _Local Image..." msgstr "" #: .././sonata/main.py:243 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:244 msgid "Reset Image" msgstr "" #: .././sonata/main.py:245 msgid "_Play" msgstr "" #: .././sonata/main.py:246 msgid "Pa_use" msgstr "" #: .././sonata/main.py:247 msgid "_Stop" msgstr "" #: .././sonata/main.py:248 msgid "Pre_vious" msgstr "" #: .././sonata/main.py:249 msgid "_Next" msgstr "" #: .././sonata/main.py:250 msgid "_Quit" msgstr "" #: .././sonata/main.py:251 msgid "_Remove" msgstr "" #: .././sonata/main.py:252 msgid "_Clear" msgstr "" #: .././sonata/main.py:253 msgid "_Entire Library" msgstr "" #: .././sonata/main.py:254 msgid "_Selected Items" msgstr "" #: .././sonata/main.py:255 msgid "_Preferences..." msgstr "" #: .././sonata/main.py:256 msgid "_About..." msgstr "" #: .././sonata/main.py:257 msgid "_Edit Tags..." msgstr "" #: .././sonata/main.py:258 msgid "_Add" msgstr "" #: .././sonata/main.py:259 msgid "_Replace" msgstr "" #: .././sonata/main.py:260 msgid "Add" msgstr "" #: .././sonata/main.py:261 msgid "Replace" msgstr "" #: .././sonata/main.py:262 msgid "_Delete..." msgstr "" #: .././sonata/main.py:263 msgid "Shuffle" msgstr "" #: .././sonata/main.py:288 msgid "S_how Sonata" msgstr "" #: .././sonata/main.py:289 msgid "_Repeat" msgstr "" #: .././sonata/main.py:290 msgid "Rando_m" msgstr "" #: .././sonata/main.py:431 msgid "By Artist" msgstr "" #: .././sonata/main.py:432 msgid "By Album" msgstr "" #: .././sonata/main.py:433 msgid "By Song Title" msgstr "" #: .././sonata/main.py:434 msgid "By File Name" msgstr "" #: .././sonata/main.py:435 msgid "By Dir & File Name" msgstr "" #: .././sonata/main.py:436 msgid "Reverse List" msgstr "" #: .././sonata/main.py:459 .././sonata/main.py:470 msgid "_New..." msgstr "" #: .././sonata/main.py:460 msgid "_Edit..." msgstr "" #: .././sonata/main.py:471 msgid "_Rename..." msgstr "" #: .././sonata/main.py:533 .././sonata/main.py:600 .././sonata/main.py:601 msgid "Playlist" msgstr "" #: .././sonata/main.py:563 .././sonata/main.py:1833 .././sonata/main.py:2042 msgid "Click to expand" msgstr "" #: .././sonata/main.py:568 .././sonata/main.py:1831 .././sonata/main.py:2040 msgid "Click to collapse" msgstr "" #: .././sonata/main.py:573 .././sonata/main.py:1725 .././sonata/main.py:1836 msgid "Not Connected" msgstr "" #: .././sonata/main.py:575 .././sonata/main.py:1723 .././sonata/main.py:1838 msgid "No Read Permission" msgstr "" #: .././sonata/main.py:648 msgid "Cover Art" msgstr "" #: .././sonata/main.py:872 msgid "MPD_HOST/PORT" msgstr "" #: .././sonata/main.py:877 msgid "Disconnect" msgstr "" #: .././sonata/main.py:1183 .././sonata/main.py:1190 msgid "#" msgstr "" #: .././sonata/main.py:1184 .././sonata/preferences.py:556 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "" #: .././sonata/main.py:1188 msgid "Stream" msgstr "" #: .././sonata/main.py:1189 msgid "Len" msgstr "" #: .././sonata/main.py:1210 .././sonata/main.py:1217 .././sonata/main.py:1258 #: .././sonata/main.py:1265 msgid "Unknown" msgstr "" #: .././sonata/main.py:1746 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:1754 msgid "hour" msgid_plural "hours" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:1759 .././sonata/main.py:1761 msgid "and" msgstr "" #: .././sonata/main.py:1769 msgid "(updating mpd)" msgstr "" #: .././sonata/main.py:2109 msgid "Lyrics Search" msgstr "" #: .././sonata/main.py:2110 msgid "_Search" msgstr "" #: .././sonata/main.py:2113 msgid "Artist Name" msgstr "" #: .././sonata/main.py:2118 msgid "Song Title" msgstr "" #: .././sonata/main.py:2370 msgid "Open Image" msgstr "" #: .././sonata/main.py:2372 msgid "Images" msgstr "" #: .././sonata/main.py:2376 msgid "All files" msgstr "" #: .././sonata/main.py:2418 msgid "Choose Cover Art" msgstr "" #: .././sonata/main.py:2419 msgid "C_hoose" msgstr "" #: .././sonata/main.py:2451 msgid "Edit search terms" msgstr "" #: .././sonata/main.py:2508 msgid "No artist or album name found." msgstr "" #: .././sonata/main.py:2511 msgid "No cover art found." msgstr "" #: .././sonata/main.py:2835 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:2835 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:2843 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:2843 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "" msgstr[1] "" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "" #: .././sonata/preferences.py:27 msgid "System tray" msgstr "" #: .././sonata/preferences.py:27 msgid "Top Left" msgstr "" #: .././sonata/preferences.py:27 msgid "Top Right" msgstr "" #: .././sonata/preferences.py:28 msgid "Bottom Left" msgstr "" #: .././sonata/preferences.py:28 msgid "Bottom Right" msgstr "" #: .././sonata/preferences.py:29 msgid "Screen Center" msgstr "" #: .././sonata/preferences.py:99 msgid "MPD" msgstr "" #: .././sonata/preferences.py:100 .././sonata/preferences.py:343 msgid "Display" msgstr "" #: .././sonata/preferences.py:101 msgid "Behavior" msgstr "" #: .././sonata/preferences.py:102 msgid "Format" msgstr "" #: .././sonata/preferences.py:103 .././sonata/preferences.py:245 msgid "Extras" msgstr "" #: .././sonata/preferences.py:104 msgid "Plugins" msgstr "" #: .././sonata/preferences.py:128 msgid "MPD Connection" msgstr "" #: .././sonata/preferences.py:141 msgid "_Name" msgstr "" #: .././sonata/preferences.py:144 msgid "_Host" msgstr "" #: .././sonata/preferences.py:147 msgid "_Port" msgstr "" #: .././sonata/preferences.py:151 msgid "_Music dir" msgstr "" #: .././sonata/preferences.py:152 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:158 msgid "Pa_ssword" msgstr "" #: .././sonata/preferences.py:161 msgid "Leave blank if no password is required." msgstr "" #: .././sonata/preferences.py:162 msgid "_Autoconnect on start" msgstr "" #: .././sonata/preferences.py:182 msgid "Using MPD_HOST/PORT" msgstr "" #: .././sonata/preferences.py:250 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:252 msgid "_Username:" msgstr "" #: .././sonata/preferences.py:253 msgid "_Password:" msgstr "" #: .././sonata/preferences.py:273 msgid "Popup _notification on song changes" msgstr "" #: .././sonata/preferences.py:299 msgid "Fade length" msgstr "" #: .././sonata/preferences.py:300 msgid "_Fade length" msgstr "" #: .././sonata/preferences.py:302 msgid "sec" msgstr "" #: .././sonata/preferences.py:307 msgid "C_rossfade" msgstr "" #: .././sonata/preferences.py:348 msgid "_Album art" msgstr "" #: .././sonata/preferences.py:350 msgid "Standard" msgstr "" #: .././sonata/preferences.py:351 msgid "Stylized" msgstr "" #: .././sonata/preferences.py:356 msgid "Artwork style:" msgstr "" #: .././sonata/preferences.py:358 msgid "Local only" msgstr "" #: .././sonata/preferences.py:359 msgid "Local and remote" msgstr "" #: .././sonata/preferences.py:362 msgid "Search locations:" msgstr "" #: .././sonata/preferences.py:369 .././sonata/preferences.py:396 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:371 msgid "custom" msgstr "" #: .././sonata/preferences.py:378 msgid "Save art to:" msgstr "" #: .././sonata/preferences.py:383 msgid "_Playback/volume buttons" msgstr "" #: .././sonata/preferences.py:386 msgid "Pr_ogressbar" msgstr "" #: .././sonata/preferences.py:389 msgid "_Statusbar" msgstr "" #: .././sonata/preferences.py:392 msgid "Song Ly_rics" msgstr "" #: .././sonata/preferences.py:394 msgid "Save lyrics to:" msgstr "" #: .././sonata/preferences.py:405 msgid "System _tray icon" msgstr "" #: .././sonata/preferences.py:429 msgid "Window Behavior" msgstr "" #: .././sonata/preferences.py:433 msgid "_Show window on all workspaces" msgstr "" #: .././sonata/preferences.py:436 msgid "_Keep window above other windows" msgstr "" #: .././sonata/preferences.py:439 msgid "_Hide window titlebar" msgstr "" #: .././sonata/preferences.py:442 msgid "_Minimize to system tray on close/escape" msgstr "" #: .././sonata/preferences.py:444 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" #: .././sonata/preferences.py:460 msgid "Miscellaneous" msgstr "" #: .././sonata/preferences.py:464 msgid "_Update MPD library on start" msgstr "" #: .././sonata/preferences.py:466 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" #: .././sonata/preferences.py:469 msgid "S_top playback on exit" msgstr "" #: .././sonata/preferences.py:471 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" #: .././sonata/preferences.py:474 msgid "_Write status file:" msgstr "" #: .././sonata/preferences.py:476 .././sonata/preferences.py:478 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" #: .././sonata/preferences.py:512 msgid "Song Formatting" msgstr "" #: .././sonata/preferences.py:517 msgid "C_urrent playlist:" msgstr "" #: .././sonata/preferences.py:518 msgid "_Library:" msgstr "" #: .././sonata/preferences.py:519 msgid "_Window title:" msgstr "" #: .././sonata/preferences.py:520 msgid "Current _song line 1:" msgstr "" #: .././sonata/preferences.py:522 msgid "Current s_ong line 2:" msgstr "" #: .././sonata/preferences.py:547 msgid "Available options" msgstr "" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:551 msgid "Artist name" msgstr "" #: .././sonata/preferences.py:552 msgid "Album name" msgstr "" #: .././sonata/preferences.py:553 msgid "Track name" msgstr "" #: .././sonata/preferences.py:554 msgid "Track number" msgstr "" #: .././sonata/preferences.py:555 msgid "Disc number" msgstr "" #: .././sonata/preferences.py:558 msgid "File path" msgstr "" #: .././sonata/preferences.py:559 msgid "File name" msgstr "" #: .././sonata/preferences.py:560 .././sonata/streams.py:107 msgid "Stream name" msgstr "" #: .././sonata/preferences.py:561 msgid "Song length" msgstr "" #: .././sonata/preferences.py:562 msgid "Elapsed time (title only)" msgstr "" #: .././sonata/preferences.py:572 msgid "Info displayed only if all enclosed tags are defined" msgstr "" #: .././sonata/preferences.py:572 msgid "Creates columns in the current playlist" msgstr "" #: .././sonata/preferences.py:598 msgid "_About" msgstr "" #: .././sonata/preferences.py:601 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:641 msgid "Enabled" msgstr "" #: .././sonata/preferences.py:649 msgid "Description" msgstr "" #: .././sonata/preferences.py:666 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" #: .././sonata/preferences.py:666 .././sonata/preferences.py:673 msgid "Music Dir Verification" msgstr "" #: .././sonata/preferences.py:673 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" #: .././sonata/preferences.py:738 msgid "New Profile" msgstr "" #. Prompt user for playlist name: #: .././sonata/preferences.py:792 msgid "Custom Artwork" msgstr "" #: .././sonata/preferences.py:794 msgid "Artwork filename" msgstr "" #: .././sonata/streams.py:103 msgid "Edit Stream" msgstr "" #: .././sonata/streams.py:105 .././sonata/streams.py:136 msgid "New Stream" msgstr "" #: .././sonata/streams.py:114 msgid "Stream URL" msgstr "" #: .././sonata/streams.py:136 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" #: .././sonata/tagedit.py:75 msgid "The path" msgstr "" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "" #: .././sonata/tagedit.py:99 msgid "File " msgstr "" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "" #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "" #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "" #: .././sonata/tagedit.py:260 msgid "of" msgstr "" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "" #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/nl.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000120004�11255764730�0014542�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: Sonata 1.4.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2008-05-22 19:11+0100\n" "Last-Translator: Olivier Keun <litemotiv@gmail.com>\n" "Language-Team: \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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Over Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Voorkeuren" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Spring naar [1ste-5e] tab" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Verbinden met MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Losmaken van MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Huidige afspeellijst shuffelen:" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Speler vergroten" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Spring naar de vorige tab" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Spring naar de volgende tab" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Speler verkleinen" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Collectie doorzoeken" #: .././sonata/about.py:64 msgid "Quit" msgstr "Beëindigen" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Hele collectie bijwerken" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Popup menu weergeven" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimaliseer naar systeemvak (indien ingeschakeld)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Vorige nummer" #: .././sonata/about.py:70 msgid "Next track" msgstr "Volgende nummer" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Speel/Pauze" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stop" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Volume verlagen" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Volume verhogen" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "geselecteerde nummer afspelen" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Geselecteerde nummer(s) verwijderen" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Centreer het huidige nummer" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Tags van het geselecteerde nummer aanpassen" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Als nieuwe afspeellijst opslaan" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Lijst leegmaken" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Lijst shuffelen" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Geselecteerde nummer(s) toevoegen of map openen" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Ga naar bovenliggende map" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Geselecteerde item(s) toevoegen" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Door geselecteerde item(s) vervangen" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Geselecteerde item(s) toevoegen en afspelen" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Door geselecteerde item(s) vervangen en afspelen" #: .././sonata/about.py:91 #, fuzzy msgid "Update selected item(s)/path(s)" msgstr "Geselecteerde item(s) toevoegen" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Geselecteerde afspeellijst(en) toevoegen" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Geselecteerde afspeellijsten(en) verwijderen" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Door geselecteerde afspeellijst(en) vervangen" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Geselecteerde afspeellijst(en) toevoegen en afspelen" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Door geselecteerde afspeellijst(en) vervangen en afspelen" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Geselecteerde stream(s) toevoegen" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Geselecteerde stream(s) verwijderen" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Door geselecteerde stream(s) vervangen" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Geselecteerde stream(s) toevoegen en afspelen" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Door geselecteerde stream(s) vervangen en afspelen" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Song tags aanpassen van het spelende nummer" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Algemene toetsen" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Afspeeltoetsen" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Huidige toetsen" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Collectie toetsen" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Afspeellijst toetsen" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Stream toetsen" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Info sneltoetsen" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Toetsen" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Een elegante muziekspeler voor MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Toetsen" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Kan geen geschikte browser starten." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Browser starten" #: .././sonata/cli.py:81 #, fuzzy msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Het toggle argument vereist D-Bus. Gestopt." #: .././sonata/cli.py:97 #, fuzzy msgid "Version" msgstr "Versie: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 #, fuzzy msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Gebruik: sonata [OPTIE]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Opties" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Toon deze hulp en beëindig" #: .././sonata/cli.py:107 #, fuzzy msgid "Popup song notification (requires D-Bus)" msgstr "Popup scherm bij nieuw nummer (vereist DBus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Bepaalt of het prog. is geminimaliseerd" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "naar het systeemvak of zichtbaar (vereist D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Toon versie informatie en beëindig" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Start prog. geminimaliseerd (vereist systeemvak)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Start prog. zichtbaar (vereist systeemvak)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Start met profiel [NUMMER]" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Opmerkingen" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Speel nummer in afspeellijst" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pauseer huidige nummer" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Stop afpelen van het huidige nummer" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Speel het volgende nummer in de afspeellijst" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Speel het vorige nummer in de afspeellijst" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Wissel tussen afspelen/pauze" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Zet herhalen aan/uit" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Zet willekeurig spelen aan/uit" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Toon huidige nummer informatie" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Toon MPD status" #: .././sonata/cli.py:134 #, fuzzy, python-format msgid "Starting Sonata with profile %s..." msgstr "Sonata opstarten met profiel" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, fuzzy, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Geen geldig profiel nummer. Gebruik een profiel nummer tussen 1 en" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Standaard Profiel" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "door" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "van" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Kan niet met MPD verbinden.\n" "Controleer de Sonata Instellingen of MPD_HOST/MPD_PORT omgevingsvariabelen." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Titel" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Artiest" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Datum" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Nummer" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Genre" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Bestand" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Tijd" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitrate" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD gestopt" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Status" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Afspelen" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pauze" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Gestopt" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Herhalen" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Uit" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Aan" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Willekeurig" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Volume" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Overgang" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "seconde" msgstr[1] "seconden" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonata kan niet met de D-Bus sessie bus verbinden: Het adres van de bus kan " "niet worden bepaald (probeer 'man dbus-launch' en 'man dbus-daemon' voor " "hulp)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Sonata opstarten met profiel" #: .././sonata/dbus_plugin.py:100 #, fuzzy msgid "Maybe Sonata is not running?" msgstr "Een versie van Sonata is reeds actief." #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Een versie van Sonata is reeds actief." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Nummer info" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Artiest in Wikipedia openen" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Album in Wikipedia openen" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Extra tags wisselen" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Song tags aanpassen" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Songtekst" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Songtekst zoeken op Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Album Info" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "meer" #: .././sonata/info.py:215 msgid "hide" msgstr "verberg" #: .././sonata/info.py:281 msgid "edit tags" msgstr "Tags bewerken" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Album info niet gevonden." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Album naam niet ingevuld." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI niet gevonden, geen ondersteuning voor ophalen van songteksten." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Artiest of songtitel niet ingevuld." #: .././sonata/info.py:371 msgid "search" msgstr "zoeken" #: .././sonata/info.py:372 #, fuzzy msgid "edit" msgstr "Tags bewerken" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Songtekst niet gevonden" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Songtekst ophalen..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Kan niet verbinden naar LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Songtekst ophalen mislukt" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Niet getagged" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Verschillende Artiesten" #: .././sonata/library.py:49 msgid "Filename" msgstr "Bestandsnaam" #: .././sonata/library.py:49 msgid "Everything" msgstr "Alles" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Bestandssysteem" #: .././sonata/library.py:53 #, fuzzy msgid "Artists" msgstr "Artiest" #: .././sonata/library.py:54 #, fuzzy msgid "Albums" msgstr "Album" #: .././sonata/library.py:55 #, fuzzy msgid "Genres" msgstr "Genre" #: .././sonata/library.py:84 #, fuzzy msgid "Search terms" msgstr "Bewerk zoektermen" #: .././sonata/library.py:90 #, fuzzy msgid "End Search" msgstr "Speel _hierna" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "_Collectie overzicht" #: .././sonata/library.py:96 #, fuzzy msgid "Search" msgstr "_Zoeken" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "nummer" msgstr[1] "nummers" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuut" msgstr[1] "minuten" #: .././sonata/library.py:849 #, fuzzy msgid "Song" msgstr "nummer" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Pad" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Huidige" #: .././sonata/main.py:103 msgid "Library" msgstr "Collectie" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Afspeellijsten" #: .././sonata/main.py:105 msgid "Streams" msgstr "Streams" #: .././sonata/main.py:106 msgid "Info" msgstr "Info" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Hele nummer" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Sorteer Lijst" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Lijst _opslaan als:" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Verbinding" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "_Hierna afspelen" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Bijwerken" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Gebruik _Extern Plaatje..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Gebruik _Lokaal Plaatje..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 #, fuzzy msgid "Reset Image" msgstr "Plaatje Openen" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Afspelen" #: .././sonata/main.py:244 #, fuzzy msgid "Pa_use" msgstr "_Pauze" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stop" #: .././sonata/main.py:246 #, fuzzy msgid "Pre_vious" msgstr "V_orige" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Volgende" #: .././sonata/main.py:248 msgid "_Quit" msgstr "Afsl_uiten" #: .././sonata/main.py:249 msgid "_Remove" msgstr "V_erwijderen" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Leegmaken" #: .././sonata/main.py:251 #, fuzzy msgid "_Entire Library" msgstr "_Collectie Bijwerken" #: .././sonata/main.py:252 #, fuzzy msgid "_Selected Items" msgstr "Geselecteerde item(s) toevoegen" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Voorkeuren..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_Over..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Tags Bewerken..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Toevoegen" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Vervangen" #: .././sonata/main.py:258 msgid "Add" msgstr "Toevoegen" #: .././sonata/main.py:259 msgid "Replace" msgstr "Vervangen" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "Verwij_deren" #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Willekeurig" #: .././sonata/main.py:286 #, fuzzy msgid "S_how Sonata" msgstr "_Toon Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Herhalen" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "_Willekeurig" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Op _Artiest" #: .././sonata/main.py:429 msgid "By Album" msgstr "Op A_lbum" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Op _Songtitel" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Op _Bestandsnaam" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Op map- en bestandsnaam" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Lijst Omdraaien" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Nieuw..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Bewerk..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Hernoem..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "_Afspeellijst" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Klik om uit te klappen" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Klik om in te klappen" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Niet Verbonden" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Geen lees toegang" #: .././sonata/main.py:645 #, fuzzy msgid "Cover Art" msgstr "Album _Hoes" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Profiel" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Afbreken" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Jaar" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Stream" #: .././sonata/main.py:1193 msgid "Len" msgstr "Len" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Onbekend" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "dag" msgstr[1] "dagen" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "uur" msgstr[1] "uren" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "en" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(mpd bijwerken)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Songteksten zoeken" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Zoeken" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Artiest Naam" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Songtitel" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Plaatje Openen" #: .././sonata/main.py:2379 msgid "Images" msgstr "Plaatjes" #: .././sonata/main.py:2383 msgid "All files" msgstr "Alle bestanden" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Kies Album Hoes" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "_Kies" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Bewerk zoektermen" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Geen artiest of album gevonden." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Geen album hoes gevonden." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Geselecteerde afspeellijst verwijderen?" msgstr[1] "Geselecteerde afspeellijsten verwijderen?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Afspeellijst verwijderen" msgstr[1] "Afspeellijsten verwijderen" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Geselecteerde stream verwijderen?" msgstr[1] "Geselecteerde streams verwijderen?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Stream verwijderen" msgstr[1] "Streams verwijderen" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Om songteksten naar de muziekmap op te slaan, moet een geldige map worden " "opgegeven." #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Music Dir verificatie" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Om album hoezen naar de muziekmap op te slaan, moet een geldige map worden " "opgegeven." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "albums" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "artiest" msgstr[1] "artiesten" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "dag vol genot" msgstr[1] "dagen vol genot" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "uur vol genot" msgstr[1] "uren vol genot" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Afspeellijst Opslaan" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Wil je de huidige afspeellijst vervangen of deze nummers toevoegen?" #: .././sonata/playlists.py:120 #, fuzzy msgid "Existing Playlist" msgstr "_Afspeellijst" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Afspeellijst vervangen" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Nummers toevoegen" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Er bestaat reeds een afspeellijst met deze naam, vervangen?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Afspeellijst naam" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Afspeellijst hernoemen" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Systeemvak" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Linksboven" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Rechtsboven" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Linksonder" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Rechtsonder" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Scherm Midden" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD Verbinding" #: .././sonata/preferences.py:76 #, fuzzy msgid "_Name" msgstr "Naam" #: .././sonata/preferences.py:79 #, fuzzy msgid "_Host" msgstr "Adres" #: .././sonata/preferences.py:82 #, fuzzy msgid "_Port" msgstr "Poort" #: .././sonata/preferences.py:86 #, fuzzy msgid "_Music dir" msgstr "Muziek map" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:91 #, fuzzy msgid "Pa_ssword" msgstr "Wachtwoord" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Leeg laten als geen wachtwoord vereist is." #: .././sonata/preferences.py:95 #, fuzzy msgid "_Autoconnect on start" msgstr "Automatisch verbinden bij opstarten" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Via MPD_HOST/PORT" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Extra's" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 #, fuzzy msgid "_Username:" msgstr "Gebruikersnaam:" #: .././sonata/preferences.py:171 #, fuzzy msgid "_Password:" msgstr "Wachtwoord:" #: .././sonata/preferences.py:188 #, fuzzy msgid "Popup _notification on song changes" msgstr "Popup scherm bij nieuw nummer spelen" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Fade lengte" #: .././sonata/preferences.py:211 #, fuzzy msgid "_Fade length" msgstr "Fade lengte" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sec" #: .././sonata/preferences.py:218 #, fuzzy msgid "C_rossfade" msgstr "Overgang" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Weergave" #: .././sonata/preferences.py:251 #, fuzzy msgid "_Album art" msgstr "Album naam" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standaard" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Aangekleed" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Album hoes stijl" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Alleen lokaal" #: .././sonata/preferences.py:258 #, fuzzy msgid "Local and remote" msgstr "Lokaal, dan extern" #: .././sonata/preferences.py:260 #, fuzzy msgid "Search locations:" msgstr "Zoekvolgorde:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 msgid "custom" msgstr "aangepaste" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Hoes opslaan naar:" #: .././sonata/preferences.py:277 #, fuzzy msgid "_Playback/volume buttons" msgstr "Speel/volume knoppen aanzetten" #: .././sonata/preferences.py:280 #, fuzzy msgid "Pr_ogressbar" msgstr "Voortgang indicatie inschakelen" #: .././sonata/preferences.py:283 #, fuzzy msgid "_Statusbar" msgstr "Statusbalk aanzetten" #: .././sonata/preferences.py:286 #, fuzzy msgid "Song Ly_rics" msgstr "Songtekst" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Songtekst opslaan naar:" #: .././sonata/preferences.py:297 #, fuzzy msgid "System _tray icon" msgstr "Systeemvak" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Schermgedrag" #: .././sonata/preferences.py:323 #, fuzzy msgid "_Show window on all workspaces" msgstr "Toon scherm op alle werkbladen" #: .././sonata/preferences.py:326 #, fuzzy msgid "_Keep window above other windows" msgstr "Toon scherm boven andere schermen" #: .././sonata/preferences.py:329 #, fuzzy msgid "_Hide window titlebar" msgstr "Scherm titel:" #: .././sonata/preferences.py:334 #, fuzzy msgid "_Minimize to system tray on close/escape" msgstr "Minimaliseer naar systeemvak bij sluiten/escape" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Indien ingeschakeld zal Sonata minimaliseren naar het systeemvak bij " "afsluiten. Het is op dit moment niet mogelijk om een systeemvak te " "detecteren, dus schakel deze optie alleen in als een systeemvak beschikbaar " "is." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Algemeen" #: .././sonata/preferences.py:354 #, fuzzy msgid "_Update MPD library on start" msgstr "MPD collectie bijwerken tijdens opstarten" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Indien ingeschakeld zal Sonata automatisch de MPD collectie bijwerken " "tijdens het opstarten." #: .././sonata/preferences.py:358 #, fuzzy msgid "S_top playback on exit" msgstr "Afspelen stoppen bij afsluiten" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD kan ook wanneer Sonata is afgesloten muziek afspelen. Indien " "ingeschakeld zal Sonata meer als een conventionele speler werken en het " "afspelen stoppen bij afsluiten." #: .././sonata/preferences.py:362 #, fuzzy msgid "_Write status file:" msgstr "Schrijf status bestand:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Indien ingeschakeld zal Sonata een xmms-infopipe bestand aanmaken met " "informatie over het huidige nummer. Veel programma's ondersteunen dit " "formaat (Instant Messengers, IRC programma's...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Nummer formaat" #: .././sonata/preferences.py:397 #, fuzzy msgid "C_urrent playlist:" msgstr "Huidige afspeellijst:" #: .././sonata/preferences.py:398 #, fuzzy msgid "_Library:" msgstr "Collectie:" #: .././sonata/preferences.py:399 #, fuzzy msgid "_Window title:" msgstr "Scherm titel:" #: .././sonata/preferences.py:400 #, fuzzy msgid "Current _song line 1:" msgstr "Huidige nummer regel 1:" #: .././sonata/preferences.py:402 #, fuzzy msgid "Current s_ong line 2:" msgstr "Huidige nummer regel 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Beschikbare opties" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Artiest naam" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Album naam" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Track naam" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Track nummer" #: .././sonata/preferences.py:430 #, fuzzy msgid "Disc number" msgstr "Disc nummer" #: .././sonata/preferences.py:433 #, fuzzy msgid "File path" msgstr "bestand_pad" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Bestandsnaam" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Stream naam" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Track lengte" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Verstreken tijd (alleen titel)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Info alleen weergeven als alle tags aanwezig zijn" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Maakt kolommen in de huidige afspeellijst" #: .././sonata/preferences.py:473 #, fuzzy msgid "_About" msgstr "_Over..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "" #: .././sonata/preferences.py:521 msgid "Description" msgstr "" #. Set up table #: .././sonata/preferences.py:532 #, fuzzy msgid "MPD" msgstr "_MPD" #: .././sonata/preferences.py:534 #, fuzzy msgid "Behavior" msgstr "_Gedrag" #: .././sonata/preferences.py:535 #, fuzzy msgid "Format" msgstr "_Formaat" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Nieuw Profiel" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Andere album hoes" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Album hoes bestandsnaam" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Stream Bewerken" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Nieuwe Stream" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "Stream URL" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Er bestaat reeds een stream met deze naam, vervangen?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "Taglib en/of tagpy niet gevonden, geen ondersteuning voor tag aanpassingen." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Tags bewerken" #: .././sonata/tagedit.py:70 #, fuzzy msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Taglib en/of tagpy niet gevonden, geen ondersteuning voor tag aanpassingen." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Het pad" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "bestaat niet. Kies een geldige muziek map onder voorkeuren." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Bestand" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " bestaat niet. Kies een geldige muziek map onder voorkeuren." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Geen muziekbestanden met bewerkbare tags gevonden." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Opmerkingen" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "_Alles opslaan" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Ophogen voor alle geselecteerde bestanden, begin bij nummer 1 voor dit " "bestand." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Toepassen op alle geselecteerde bestanden." #: .././sonata/tagedit.py:260 msgid "of" msgstr "van" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Opslaan van tag in bestand mislukt." #: .././sonata/tagedit.py:366 #, fuzzy msgid "Hide file path" msgstr "bestand_pad" #: .././sonata/tagedit.py:369 #, fuzzy msgid "Show file path" msgstr "bestand_pad" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Het popup argument vereist D-Bus. Gestopt." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Bijwerken" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Website: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Audioscrobbler inschakelen" #~ msgid "Enable Crossfade" #~ msgstr "Crossfade inschakelen" #~ msgid "Enable album art" #~ msgstr "Album hoezen tonen" #~ msgid "Enable lyrics" #~ msgstr "Songteksten aanzetten" #~ msgid "Enable system tray icon" #~ msgstr "Systeemvak icoon aanzetten" #~ msgid "_Display" #~ msgstr "_Weergave" #~ msgid "_Extras" #~ msgstr "_Extra's" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 of gnome-python-extras niet gevonden, geen systeemvak " #~ "ondersteuning." #~ msgid "Reset to Default" #~ msgstr "Terugzetten naar standaard" #~ msgid "_New Playlist..." #~ msgstr "Nieuwe _Speellijst..." #~ msgid "Notification" #~ msgstr "Notificatie" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 of python-elementtree niet gevonden, geen audioscrobbler " #~ "ondersteuning." #~ msgid "Audioscrobbler Verification" #~ msgstr "Audioscrobbler verificatie" #~ msgid "Update library for selected item(s)" #~ msgstr "Collectie bijwerken voor geselecteerde item(s)" #~ msgid "_Shuffle" #~ msgstr "S_huffle" #~ msgid "Toggle shuffle mode" #~ msgstr "Zet willekeurig afspelen aan/uit" #~ msgid "Not connected" #~ msgstr "Niet verbonden" #~ msgid "Press enter to search for these terms." #~ msgstr "Druk op enter om te zoeken." #~ msgid "Add new profile" #~ msgstr "Nieuw profiel toevoegen" #~ msgid "Remove current profile" #~ msgstr "Huidig profiel verwijderen" #~ msgid "Play enqueued files on activate" #~ msgstr "Speel toegevoegde bestanden af bij activeren" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "Speel toegevoegde bestanden direct af bij dubbelklikken of enter." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Geselecteerde nummer(s) of map(pen) toevoegen" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Door geselecteerde nummer(s) of map(pen) vervangen" #~ msgid "Add to _Queue" #~ msgstr "Voeg toe aan _Wachtrij" #~ msgid "Remove from _Queue" #~ msgstr "Verwijder uit _Wachtrij" #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Geselecteerde nummer(s) toevoegen aan de wachtrij" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Geselecteerde nummer(s) uit de wachtrij verwijderen" #~ msgid "seconds" #~ msgstr "seconden" #~ msgid "Song Info..." #~ msgstr "Nummer info..." #~ msgid "Click to collapse the player" #~ msgstr "Klik om de speler te verkleinen" #~ msgid "Click to expand the player" #~ msgstr "Klik om de speler te vergroten" #~ msgid "_Song Info" #~ msgstr "_Nummer info" #~ msgid "_Search..." #~ msgstr "_Zoek..." #~ msgid "Remote only" #~ msgstr "Alleen extern" #~ msgid "Remote, then local" #~ msgstr "Extern, dan lokaal" #~ msgid "To save artwork as" #~ msgstr "Om een album hoes op te slaan" #~ msgid "Artwork Verification" #~ msgstr "Album hoes verificatie" #~ msgid "Switch to current playlist" #~ msgstr "Ga naar huidige afspeellijst" #~ msgid "Toggle filter bar for jumping straight to track" #~ msgstr "Filterveld tonen om direct naar nummer te springen" #~ msgid "Song name" #~ msgstr "Track naam" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/pl.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000126160�11255764730�0014555�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Polish translation of Sonata. # Copyright (C) 2006-2009 Tomasz Dominikowski # This file is distributed under the same license as the sonata package. # Tomasz Dominikowski 2006-2009, dominikowski@gmail.com # msgid "" msgstr "" "Project-Id-Version: Sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-03-23 13:59+0100\n" "Last-Translator: Tomasz Dominikowski <dominikowski@gmail.com>\n" "Language-Team: Tomasz Dominikowski <dominikowski@gmail.com>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "O programie Sonata" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "Preferencje" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Tryb pełnoekranowych okładek" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Przełączenie do [1-5] karty" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Połączenie z usługą MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Rozłączenie z usługą MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Losowanie kolejności odtwarzania bieżącej listy" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Rozwinięcie odtwarzacza" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Przełączenie do poprzedniej karty" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Przełączenie do następnej karty" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Zwinięcie odtwarzacza" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "Wyszukiwanie w kolekcji" #: .././sonata/about.py:64 msgid "Quit" msgstr "Zakończenie" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Aktualizacja całej kolekcji" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Wyświetlenie wyskakującego menu" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimalizacja do zasobnika systemowego (jeśli dostępny)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Poprzednia ścieżka" #: .././sonata/about.py:70 msgid "Next track" msgstr "Następna ścieżka" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Odtwarzanie/Wstrzymanie" #: .././sonata/about.py:72 msgid "Stop" msgstr "Zatrzymanie" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Obniżenie poziomu głośności" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Zwiększenie poziomu głośności" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Odtworzenie zaznaczonego utworu" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Usunięcie zaznaczonego utworu (utworów)" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Bieżąco odtwarzany utwór na środku" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Modyfikowanie znaczników zaznaczonego utworu" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Zapisanie do nowej listy odtwarzania" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Wyczyszczenie listy odtwarzania" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Losowanie kolejności odtwarzania" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Dodanie zaznaczonego utworu (utworów) lub przejście do katalogu" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Przejście do katalogu nadrzędnego" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Dodanie zaznaczonego elementu (elementów)" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Zamiana na zaznaczony element (elementy)" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Dodanie zaznaczonego elementu (elementów) i rozpoczęcie odtwarzania" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Zamiana na zaznaczony element (elementy) i rozpoczęcie odtwarzania" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Aktualizacja zaznaczonego elementu (elementów)/ścieżki (ścieżek)" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Dodanie zaznaczonej listy (list) odtwarzania" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Usunięcie zaznaczonej listy (list) odtwarzania" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Zamień na zaznaczoną listę (listy) odtwarzania " #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Dodanie zaznaczonej listy (list) odtwarzania i rozpoczęcie odtwarzania" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Zamiana na zaznaczoną listę (listy) odtwarzania i rozpoczęcie odtwarzania" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Dodanie zaznaczonego strumienia (strumieni)" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Usunięcie zaznaczonego strumienia (strumieni)" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Zamiana na zaznaczony strumień (strumienie)" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Dodanie zaznaczonego strumienia (strumieni) i rozpoczęcie odtwarzania" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Zamiana na zaznaczony strumień (strumienie) i rozpoczęcie odtwarzania" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Modyfikacja znaczników odtwarzanego utworu" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Skróty główne" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Skróty odtwarzania" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Skróty bieżące" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Skróty kolekcji" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Skróty listy odtwarzania" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Skróty strumieni" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Skróty klawiszowe" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Skróty" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Elegancki odtwarzacz muzyki dla usługi MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Skróty" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Uruchomienie odpowiedniej przeglądarki niemożliwe." #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Uruchom przeglądarkę" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Argument przełączania i wyskakiwania wymaga D-Bus. Przerywanie." #: .././sonata/cli.py:97 msgid "Version" msgstr "Wersja" #: .././sonata/cli.py:98 msgid "Website" msgstr "Witryna" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Składnia: sonata [OPCJA]... [POLECENIE]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Opcje" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Wyświetlenie tej pomocy i zakończenie" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Wyskakujące powiadamianie o utworze (wymaga D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Przełącza stan minimalizacji aplikacji" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "(widoczny lub zminimalizowany, wymaga D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Bez uruchamiania programu, jeśli polecenia D-Bus zawiodą" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Wyświetlenie informacji o wersji i zakończenie" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Uruchomienie aplikacji w trybie ukrytym (wymaga zasobnika systemowego)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Uruchomienie aplikacji w trybie widocznym (wymaga zasobnika systemowego)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Uruchomienie z profilem [NR]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Polecenia" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Odtworzenie utworu z listy odtwarzania" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Wstrzymanie odtwarzania bieżącego utworu" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Zatrzymanie odtwarzania bieżącego utworu" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Odtwarzanie następnego utworu na liście odtwarzania" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Odtwarzanie poprzedniego utworu na liście odtwarzania" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Przełączanie odtwarzania/wstrzymania; odtwarza, jeśli zatrzymane" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Przełączanie trybu powtarzania" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Przełączanie trybu losowego" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Wyświetlenie informacji o bieżącym utworze" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Wyświetlenie stanu usługi MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Uruchamianie programu Sonata z profilem %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d nie jest dostępnym numerem profilu." #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Numer profilu musi się mieścić pomiędzy 1 i %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python nie może zinterpretować %s jako liczby." #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "Domyślny profil" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr " " #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "z" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "Połączenie z usługą MPD niemożliwe.\n" "Proszę sprawdzić preferencje programu Sonata lub zmienne MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Tytuł" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Wykonawca" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "Data" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Ścieżka" #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Gatunek" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Nazwa pliku" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "Czas" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "Gęstość bitowa" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "Usługa MPD zatrzymana" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "Stan" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Odtwarzanie" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Wstrzymane" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "Zatrzymane" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "Powtarzanie" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "Wyłączone" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "Włączone" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "Losowo" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Głośność" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Płynne przejścia" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekunda" msgstr[1] "sekundy" msgstr[2] "sekund" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filtr" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Połączenie z sesją D-BUS nieudane: Niemożliwe określenie adresu magistrali wiadomości (spróbuj uzyskać pomoc w \"man dbus-launch\" i \"man dbus-deamon\")" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Nieudane wykonanie zdalnych poleceń." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Zamiast tego, uruchamianie programu Sonata..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Może program Sonata jest już uruchomiony?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Instancja programu Sonata jest już uruchomiona. Wyświetlanie..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Nieudane wykonanie zdalnego polecenia." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Informacje o utworze" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Wyświetl wykonawcę w Wikipedii" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Wyświetl album w Wikipedii" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Przełączanie widoczności dodatkowych znaczników" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Modyfikacja znaczników utworu" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Tekst utworu" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Wyszukiwanie tekstów utworów na Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Modyfikowanie tekstu utworu na Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Informacje o albumie" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "więcej" #: .././sonata/info.py:215 msgid "hide" msgstr "ukryj" #: .././sonata/info.py:281 msgid "edit tags" msgstr "modyfikuj znaczniki" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Brak informacji o albumie." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Nazwa albumu nieustalona." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "Brak modułu ZSI, obsługa pobierania tekstów utworów wyłączona. " #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Wykonawca lub tytuł utworu nieustalony." #: .././sonata/info.py:371 msgid "search" msgstr "szukaj" #: .././sonata/info.py:372 msgid "edit" msgstr "modyfikuj" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Brak tekstu utworu" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Pobieranie tekstu utworu..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Nie można połączyć z LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Pobranie tekstu utworu nieudane" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Bez znaczników" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Różni artyści" #: .././sonata/library.py:49 msgid "Filename" msgstr "Nazwa pliku" #: .././sonata/library.py:49 msgid "Everything" msgstr "Wszystko" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "System plików" #: .././sonata/library.py:53 msgid "Artists" msgstr "Wykonawcy" #: .././sonata/library.py:54 msgid "Albums" msgstr "Albumy" #: .././sonata/library.py:55 msgid "Genres" msgstr "Gatunki" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Zasady wyszukiwania" #: .././sonata/library.py:90 msgid "End Search" msgstr "Przerwij przeszukiwanie" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Widok przeglądarki kolekcji" #: .././sonata/library.py:96 msgid "Search" msgstr "Wyszukiwanie" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "utwór" msgstr[1] "utwory" msgstr[2] "utworów" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" msgstr[1] "minuty" msgstr[2] "minut" #: .././sonata/library.py:849 msgid "Song" msgstr "Utwór" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "Ścieżka" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Bieżąca" #: .././sonata/main.py:103 msgid "Library" msgstr "Kolekcja" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Listy odtwarzania" #: .././sonata/main.py:105 msgid "Streams" msgstr "Strumienie" #: .././sonata/main.py:106 msgid "Info" msgstr "Informacje" #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Cały utwór" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Sortuj listę" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Z_apisz listę do" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Połączenie" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Odt_warzaj po" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "_Aktualizuj" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Użyj zdalnego ob_razu..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Użyj _lokalnego obrazu..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Tryb pełnoekranowy" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Przywróć obraz" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Odtwarzaj" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "_Wstrzymaj" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Zatrzymaj" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Poprzedni" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Następny" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Zakończ" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Usuń" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Wyczyść" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "_Całą kolekcję" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "Zaznaczone _elementy" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "P_referencje..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_O programie..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "Modyfikuj z_naczniki..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Dodaj" #: .././sonata/main.py:257 msgid "_Replace" msgstr "Za_mień" #: .././sonata/main.py:258 msgid "Add" msgstr "Dodaniu" #: .././sonata/main.py:259 msgid "Replace" msgstr "Zamianie" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "Us_uń..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Odtwarzanie losowe" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "_Wyświetlanie głównego okna" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "Pow_tarzanie" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "_Losowo" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Wg wykonawcy" #: .././sonata/main.py:429 msgid "By Album" msgstr "Wg albumu" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Wg tytułu utworu" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Wg nazwy pliku" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Wg katalogu i nazwy pliku" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Odwróć kolejność listy" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "_Nowy..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Modyfikuj..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Zmień nazwę..." #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "Lista odtwarzania" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "Kliknięcie rozwinie okno" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Kliknięcie zwinie okno" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "Nie połączony" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Brak zezwolenia na odczyt" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Okładka albumu" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "KOMPUTER_Z_MPD/PORT" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "Rozłącz" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Rok" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Strumień" #: .././sonata/main.py:1193 msgid "Len" msgstr "Długość" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Nieznany" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "dzień" msgstr[1] "dni" msgstr[2] "dni" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "godzina" msgstr[1] "godziny" msgstr[2] "godzin" #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr "i" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(aktualizowanie mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Wyszukiwanie tekstów utworów" #: .././sonata/main.py:2117 msgid "_Search" msgstr "Wy_szukiwanie" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Nazwa wykonawcy" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Tytuł utworu" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Otwórz obraz" #: .././sonata/main.py:2379 msgid "Images" msgstr "Obrazy" #: .././sonata/main.py:2383 msgid "All files" msgstr "Wszystkie pliki" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Wybierz okładkę albumu" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "W_ybierz" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Modyfikuj zasady wyszukiwania" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Nie odnaleziono nazwy albumu lub wykonawcy." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Nie odnaleziono okładek." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Usunąć zaznaczoną listę odtwarzania?" msgstr[1] "Usunąć zaznaczone listy odtwarzania?" msgstr[2] "Usunąć zaznaczone listy odtwarzania?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Usuń listę odtwarzania" msgstr[1] "Usuń listy odtwarzania" msgstr[2] "Usuń listy odtwarzania" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Usunąć zaznaczony strumień?" msgstr[1] "Usunąć zaznaczone strumienie?" msgstr[2] "Usunąć zaznaczone strumienie?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Usuń strumień" msgstr[1] "Usuń strumienie" msgstr[2] "Usuń strumienie" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "Aby zapisywać teksty utworów do katalogu z plikiem muzycznym, proszę określić prawidłowy katalog z muzyką." #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Sprawdzanie katalogu z muzyką" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "Aby zapisywać okładki do katalogu z plikiem muzycznym, proszę określić prawidłowy katalog z muzyką." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "albumy" msgstr[2] "albumów" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "wykonawca" msgstr[1] "wykonawców" msgstr[2] "wykonawców" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "dzień oczarowania" msgstr[1] "dni oczarowania" msgstr[2] "dni oczarowania" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "godzina oczarowania" msgstr[1] "godziny oczarowania" msgstr[2] "godzin oczarowania" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Zapisz listę odtwarzania" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Zamienić istniejącą listę odtwarzania, czy dodać te utwory?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Istniejąca lista odtwarzania" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Zamień listę odtwarzania" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Dodaj utwory" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Lista odtwarzania o tej nazwie już istnieje. Zastąpić ją?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Nazwa listy odtwarzania" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Zmień nazwę listy odtwarzania" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Zasobnik systemowy" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Górny lewy" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Górny prawy" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Dolny lewy" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Dolny prawy" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Środek ekranu" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Połączenie z usługą MPD" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Nazwa" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Komputer" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "K_atalog z muzyką" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Wybór katalogu z muzyką" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "_Hasło" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Proszę zostawić puste, jeśli hasło nie jest wymagane." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "_Automatyczne połączenie podczas uruchamiania" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Używanie MPD_HOST/PORT" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "Dodatki" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Nazwa użytkownika:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Hasło:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "_Wyskakujące powiadamianie o zmianie utworu" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Długość wyciszania" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "_Długość wyciszania" #: .././sonata/preferences.py:213 msgid "sec" msgstr "s" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "_Płynne przejścia" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "Wyświetlanie" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "_Okładka albumu" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standardowy" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Stylizowany" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Styl okładek:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Tylko lokalne" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Lokalne i zdalne" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Położenia wyszukiwania:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "KATALOG_Z_MUZYKĄ" #: .././sonata/preferences.py:269 msgid "custom" msgstr "własna" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Zapisywanie okładek do:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "_Przyciski odtwarzania/poziomu głośności" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "Pa_sek postępu" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "Pase_k stanu" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "_Tekst utworu" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Zapisywanie tekstów utworów do:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "_Zasobnik systemowy" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Zachowanie okna" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "_Okno na wszystkich obszarach roboczych" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "O_kno programu Sonata powyżej innych okien" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "_Bez paska tytułowego okna" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "Mi_nimalizacja do zasobnika systemowego podczas zamykania" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "Określa, czy zamykanie programu Sonata zminimalizuje okno do zasobnika systemowego. Obecnie nie jest możliwe wykrycie, czy system dysponuje zasobnikiem systemowym, więc należy się upewnić, że istnieje." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Różne" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "_Aktualizowanie kolekcji usługi MPD podczas uruchamiania" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "Określa, czy program Sonata będzie automatycznie aktualizować bibliotekę usługi MPD podczas uruchamiania." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "_Zatrzymywanie odtwarzania przy zakończeniu" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "Usługa MPD pozwala na odtwarzanie nawet gdy klient nie jest otwarty. Określa, czy program Sonata będzie zachowywać się jak bardziej konwencjonalny odtwarzacz i będzie zatrzymywać odtwarzanie po zakończeniu." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "Zapi_sywanie pliku stanu:" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "Określa, czy program Sonata utworzy plik typu xmms-infopipe zawierający informacje o bieżącym utworze. Wiele aplikacji obsługuje plik xmms-info (komunikatory, klienty IRC...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Formatowanie utworów" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "_Bieżąca lista odtwarzania:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Kolekcja:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "_Tytuł okna:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Bi_eżący utwór wiersz 1:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Bieżą_cy utwór wiersz 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Dostępne opcje" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Wykonawca" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Album" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Nazwa ścieżki" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Numer ścieżki" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Numer płyty" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Ścieżka do pliku" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Nazwa pliku" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "Nazwa strumienia" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Długość utworu" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Upłynęło czasu (tylko tytuł)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Informacje wyświetlane tylko, jeśli wszystkie zawarte znaczniki są zdefiniowane" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Tworzenie kolumn w bieżącej liście odtwarzania" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_O programie" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Konfiguruj..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Wczytano" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Opis" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Zachowanie" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Format" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Nowy profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Własna okładka" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Nazwa pliku okładki" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Modyfikuj strumień" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "Nowy strumień" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL strumienia" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Strumień o tej nazwie już istnieje. Zastąpić go?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Brak modułu Taglib i/lub tagpy, obsługa modyfikowania znaczników wyłączona." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Modyfikowanie znaczników" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Wersja biblioteki Tagpy < 0.91, obsługa modyfikowania znaczników wyłączona." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Ścieżka" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "nie istnieje. Proszę określić prawidłowy katalog z muzyką w preferencjach." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Plik" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " nie odnaleziono. Proszę określić prawidłowy katalog z muzyką w preferencjach." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Brak utworów z możliwością modyfikacji znaczników." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Komentarz" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Z_apisz wszystko" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Zwiększanie każdego zaznaczonego utworu o jeden, zaczynając od ścieżki 1 dla tego pliku." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Zastosowanie do wszystkich zaznaczonych utworów." #: .././sonata/tagedit.py:260 msgid "of" msgstr "z" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Nie można zapisać znacznika w utworze." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Ukryj ścieżkę do pliku" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Wyświetl ścieżkę do pliku" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Argument wyskakujących okien wymaga D-Bus. Przerywanie." #, fuzzy #~ msgid "_Update Path" #~ msgstr "A_ktualizuj" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Strona WWW: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Płynne przejścia" #~ msgid "Enable album art" #~ msgstr "Okładki" #~ msgid "Enable lyrics" #~ msgstr "Teksty utworów" #~ msgid "Enable system tray icon" #~ msgstr "Ikona w zasobniku systemowym" #~ msgid "_Display" #~ msgstr "_Wyświetlanie" #~ msgid "_Extras" #~ msgstr "_Dodatki" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "Brak PyGTK+ 2.10 lub gnome-python-extras, obsługa zasobnika systemowego " #~ "wyłączona." #~ msgid "Reset to Default" #~ msgstr "Przywróć domyślne" #~ msgid "_New Playlist..." #~ msgstr "_Nowa lista odtwarzania..." #~ msgid "Notification" #~ msgstr "Powiadamianie" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Brak Python 2.5 lub python-elementtree, obsługa audioscrobbler wyłączona." #~ msgid "Audioscrobbler Verification" #~ msgstr "Weryfikacja Audioscrobbler" #~ msgid "Update library for selected item(s)" #~ msgstr "Aktualizowanie kolekcji dla zaznaczonego elementu (elementów)" #~ msgid "_Shuffle" #~ msgstr "Odtwarzanie _losowe" #~ msgid "Toggle shuffle mode" #~ msgstr "Przełączanie trybu odtwarzania losowego" #~ msgid "Not connected" #~ msgstr "Niepołączony" #~ msgid "Press enter to search for these terms." #~ msgstr "Proszę nacisnąć ENTER, aby wyszukać wg tych zasad." #~ msgid "Add new profile" #~ msgstr "Dodaj nowy profil" #~ msgid "Remove current profile" #~ msgstr "Usuń bieżący profil" #~ msgid "Play enqueued files on activate" #~ msgstr "Odtwarzanie zakolejkowanych utworów po aktywacji" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Automatyczne odtwarzanie zakolejkowanych elementów po aktywacji podwójnym " #~ "kliknięciem lub klawiszem Enter." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Dodanie zaznaczonego utworu (utworów) lub katalogu (katalogów)" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Zamiana na zaznaczony utwór (utwory) lub katalog (katalogi)" #~ msgid "Add to _Queue" #~ msgstr "Dodaj do _kolejki" #~ msgid "Remove from _Queue" #~ msgstr "Usuń z _kolejki" #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Dodanie zaznaczonego utworu (utworów) do kolejki listy odtwarzania" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Usunięcie zaznaczonego utworu (utworów) z kolejki listy odtwarzania" #~ msgid "seconds" #~ msgstr "sekund" #~ msgid "Song Info..." #~ msgstr "Informacje o utworze..." #~ msgid "Click to collapse the player" #~ msgstr "Kliknięcie spowoduje zwinięcie odtwarzacza" #~ msgid "Click to expand the player" #~ msgstr "Kliknięcie spowoduje rozwinięcie odtwarzacza" #~ msgid "_Song Info" #~ msgstr "_Informacje o utworze" #~ msgid "S_earch..." #~ msgstr "Wyszukiwani_e..." #~ msgid "Remote only" #~ msgstr "Tylko zdalne" #~ msgid "Remote, then local" #~ msgstr "Zdalne, następnie lokalne" #~ msgid "To save artwork as" #~ msgstr "Aby zapisać okładkę jako" #~ msgid "Artwork Verification" #~ msgstr "Sprawdzanie okładek" #~ msgid "Switch to current playlist" #~ msgstr "Przełączenie do bieżącej listy odtwarzania" #~ msgid "Toggle filter bar for jumping straight to track" #~ msgstr "Przełączenie paska filtra do przechodzenia bezpośrednio do ścieżki" #~ msgid "Song name" #~ msgstr "Utwór" #~ msgid "songs." #~ msgstr "utworów." #~ msgid "By" #~ msgstr "Przez" #~ msgid "Enable" #~ msgstr "Włączenie" #~ msgid "Dis_play" #~ msgstr "Wyś_wietlanie" #, fuzzy #~ msgid "album.jpg" #~ msgstr "albumów." #~ msgid "_Show Player" #~ msgstr "_Wyświetl odtwarzacz" #~ msgid "Enable volume button" #~ msgstr "Wyświetlanie przycisków głośności" #~ msgid "_Help" #~ msgstr "P_omoc" #~ msgid "by Unknown" #~ msgstr "- Nieznany" #~ msgid "Show album covers" #~ msgstr "Wyświetlaj okładki albumów" #~ msgid "Show library searchbar" #~ msgstr "Wyświetlaj pasek wyszukiwania kolekcji" #~ msgid "Unknown Artist" #~ msgstr "Nieznany artysta" #~ msgid "Unknown Album" #~ msgstr "Nieznany album" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/pt_BR.po��������������������������������������������������������������������������0000664�0000000�0000000�00000123231�11255764730�0015144�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # # Alex Tercete Matos <alextercete@gmail.com> msgid "" msgstr "" "Project-Id-Version: Sonata 1.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2007-10-25 00:15-0300\n" "Last-Translator: Alex Tercete Matos <alextercete@gmail.com>\n" "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Sobre o Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Preferências" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:55 #, fuzzy msgid "Switch to [1st-5th] tab" msgstr "Alternar para os streams" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Conectar ao servidor MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Desconectar do servidor MPD" #: .././sonata/about.py:58 #, fuzzy msgid "Randomize current playlist" msgstr "Lista de reprodução atual:" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Expandir o reprodutor de músicas" #: .././sonata/about.py:60 #, fuzzy msgid "Switch to previous tab" msgstr "Alternar para as listas de reprodução" #: .././sonata/about.py:61 #, fuzzy msgid "Switch to next tab" msgstr "Alternar para os streams" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Recolher o reprodutor de músicas" #: .././sonata/about.py:63 .././sonata/library.py:86 #, fuzzy msgid "Search library" msgstr "Alternar para a biblioteca" #: .././sonata/about.py:64 msgid "Quit" msgstr "Sair" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Atualizar toda a biblioteca" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Mostrar o menu" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Enviar para a área de notificação (se habilitada)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Faixa anterior" #: .././sonata/about.py:70 msgid "Next track" msgstr "Próxima faixa" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Reproduzir/Pausar" #: .././sonata/about.py:72 msgid "Stop" msgstr "Parar" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Abaixar o volume" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Aumentar o volume" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Reproduzir a música selecionada" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Remover as música(s) selecionada(s)" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Concentrar a música atual em execução" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Editar as tags das músicas selecionadas" #: .././sonata/about.py:80 #, fuzzy msgid "Save to new playlist" msgstr "Salvar lista de reprodução" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Limpar lista de reprodução" #: .././sonata/about.py:82 #, fuzzy msgid "Randomize list" msgstr "Renomear lista de reprodução" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Adicionar a(s) música(s) selecionada(s) ou entra no diretório" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Voltar para o diretório anterior" #: .././sonata/about.py:86 #, fuzzy msgid "Add selected item(s)" msgstr "Adicionar o(s) stream(s) selecionado(s)" #: .././sonata/about.py:87 #, fuzzy msgid "Replace with selected item(s)" msgstr "Substituir pelo(s) stream(s) selecionado(s)" #: .././sonata/about.py:89 #, fuzzy msgid "Add selected item(s) and play" msgstr "Adicionar o(s) stream(s) selecionado(s)" #: .././sonata/about.py:90 #, fuzzy msgid "Replace with selected item(s) and play" msgstr "Substituir pelo(s) stream(s) selecionado(s)" #: .././sonata/about.py:91 #, fuzzy msgid "Update selected item(s)/path(s)" msgstr "Adicionar o(s) stream(s) selecionado(s)" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Adicionar a(s) lista(s) de reprodução selecionada(s)" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Remover a(s) lista(s) de reprodução selecionada(s)" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Substituir pela(s) lista(s) de reprodução selecionada(s)" #: .././sonata/about.py:97 #, fuzzy msgid "Add selected playlist(s) and play" msgstr "Adicionar a(s) lista(s) de reprodução selecionada(s)" #: .././sonata/about.py:98 #, fuzzy msgid "Replace with selected playlist(s) and play" msgstr "Substituir pela(s) lista(s) de reprodução selecionada(s)" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Adicionar o(s) stream(s) selecionado(s)" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Remover o(s) stream(s) selecionado(s)" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Substituir pelo(s) stream(s) selecionado(s)" #: .././sonata/about.py:104 #, fuzzy msgid "Add selected stream(s) and play" msgstr "Adicionar o(s) stream(s) selecionado(s)" #: .././sonata/about.py:105 #, fuzzy msgid "Replace with selected stream(s) and play" msgstr "Substituir pelo(s) stream(s) selecionado(s)" #: .././sonata/about.py:107 #, fuzzy msgid "Edit playing song's tags" msgstr "Editar as tags das músicas selecionadas" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Atalhos principais" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Atalhos de reprodução" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Atalhos da lista de reprodução atual" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Atalhos da biblioteca" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Atalhos das listas de reprodução" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Atalhos dos streams" #: .././sonata/about.py:116 #, fuzzy msgid "Info Shortcuts" msgstr "Atalhos principais" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Atalhos" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Um refinado cliente de música para MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Atalhos" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Não foi possível abrir um navegador compatível." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Abrir navegador" #: .././sonata/cli.py:81 #, fuzzy msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "O argumento -t, --toggle necessita do D-Bus. Abortando." #: .././sonata/cli.py:97 #, fuzzy msgid "Version" msgstr "Versão: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 #, fuzzy msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Uso: sonata [OPÇÃO]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Opções" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Mostra esta ajuda e sái" #: .././sonata/cli.py:107 #, fuzzy msgid "Popup song notification (requires D-Bus)" msgstr "Mostrar notificação ao trocar de música" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Mostra/Oculta a aplicação" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "para a área de notificação (requer D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Mostra informações sobre a versão e sái" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Inicia a aplicação oculta (requer área de notificação)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Inicia a aplicação visível (requer área de notificação)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Inicia com o perfil [NUM]" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Comentário" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Reproduz a música na lista de reprodução" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pausa a música atualmente em execução" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Para a música atualmente em execução" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Reproduz a próxima música na lista de reprodução" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Reproduz a música anterior na lista de reprodução" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Reproduz/pausa; Reproduz a música se estiver parado" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Ativa/desativa o modo de repetição" #: .././sonata/cli.py:124 #, fuzzy msgid "Toggle random mode" msgstr "Ativa/desativa o modo de repetição" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Mostra informações da música atualmente em execução" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Mostra o status do servidor MPD" #: .././sonata/cli.py:134 #, fuzzy, python-format msgid "Starting Sonata with profile %s..." msgstr "Iniciando o Sonata com o perfil" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, fuzzy, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Número de perfil inválido. O número deve estar entre 1 e" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 #, fuzzy msgid "Default Profile" msgstr "Novo perfil" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "" #: .././sonata/cli.py:176 #, fuzzy msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Não foi possível se conectar ao servidor MPD.\n" "Por favor verifique suas preferências do Sonata." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Título" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Artista" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Álbum" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Data" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Faixa" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Gênero" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Arquivo" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Tempo" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Taxa de bits" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD parado" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Estado" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Reproduzindo" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pausado" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Parado" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Repetir" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Desativado" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Ativado" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Aleatório" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Volume" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Esvaecimento" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 #, fuzzy msgid "second" msgid_plural "seconds" msgstr[0] "segundo" msgstr[1] "segundo" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filtro" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "O Sonata falhou ao se conectar à sessão bus do D-BUS: Não foi possível " "determinar o endereço da mensagem bus (tente os comandos 'man dbus-launch' e " "'man dbus-daemon' para obter ajuda)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Iniciando o Sonata com o perfil" #: .././sonata/dbus_plugin.py:100 #, fuzzy msgid "Maybe Sonata is not running?" msgstr "Uma instância do Sonata já está em execução." #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Uma instância do Sonata já está em execução." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Informações da música" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "" #: .././sonata/info.py:130 #, fuzzy msgid "Edit song tags" msgstr "Editar as tags das músicas selecionadas" #. Lyrics #: .././sonata/info.py:140 #, fuzzy msgid "Lyrics" msgstr "_Letra da música" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:161 #, fuzzy msgid "Album Info" msgstr "Inform_ações do álbum" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "" #: .././sonata/info.py:215 msgid "hide" msgstr "" #: .././sonata/info.py:281 #, fuzzy msgid "edit tags" msgstr "Editar tags" #: .././sonata/info.py:308 #, fuzzy msgid "Album info not found." msgstr "Nome do álbum não especificado." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Nome do álbum não especificado." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "" "ZSI não foi encontrado. O suporte à busca de letras de música foi " "desabilitado." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Artista ou título da música não especificados." #: .././sonata/info.py:371 #, fuzzy msgid "search" msgstr "Buscar" #: .././sonata/info.py:372 #, fuzzy msgid "edit" msgstr "Editar tags" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Letra da música não encontrada" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Buscando letra da música..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Não foi possível se conectar ao LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "A busca pela letra da música falhou" #: .././sonata/library.py:47 msgid "Untagged" msgstr "" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Artistas variados" #: .././sonata/library.py:49 msgid "Filename" msgstr "Nome" #: .././sonata/library.py:49 msgid "Everything" msgstr "Todos" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Sistema de arquivos" #: .././sonata/library.py:53 #, fuzzy msgid "Artists" msgstr "Artista" #: .././sonata/library.py:54 #, fuzzy msgid "Albums" msgstr "Álbum" #: .././sonata/library.py:55 #, fuzzy msgid "Genres" msgstr "Gênero" #: .././sonata/library.py:84 #, fuzzy msgid "Search terms" msgstr "Editar termos da busca" #: .././sonata/library.py:90 #, fuzzy msgid "End Search" msgstr "_Finalizar busca" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Visualização de navegação da biblioteca" #: .././sonata/library.py:96 #, fuzzy msgid "Search" msgstr "Buscar" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "música" msgstr[1] "músicas" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuto" msgstr[1] "minutos" #: .././sonata/library.py:849 #, fuzzy msgid "Song" msgstr "música" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Caminho" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Atual" #: .././sonata/main.py:103 msgid "Library" msgstr "Biblioteca" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Listas de reprodução" #: .././sonata/main.py:105 msgid "Streams" msgstr "Streams" #: .././sonata/main.py:106 #, fuzzy msgid "Info" msgstr "Informações da música" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Toda a música" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Ordenar lista de reprodução" #: .././sonata/main.py:235 #, fuzzy msgid "Sa_ve List to" msgstr "Salvar capa em:" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Conexão" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "" #: .././sonata/main.py:238 .././sonata/main.py:2454 #, fuzzy msgid "_Update" msgstr "_Atualizar biblioteca" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Usar imagem _remota" #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Usar imagem _local" #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 #, fuzzy msgid "Reset Image" msgstr "Abrir imagem" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Reproduzir" #: .././sonata/main.py:244 #, fuzzy msgid "Pa_use" msgstr "_Pausar" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Parar" #: .././sonata/main.py:246 #, fuzzy msgid "Pre_vious" msgstr "_Anterior" #: .././sonata/main.py:247 msgid "_Next" msgstr "Pró_xima" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Sair" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Remover" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Limpar" #: .././sonata/main.py:251 #, fuzzy msgid "_Entire Library" msgstr "_Atualizar biblioteca" #: .././sonata/main.py:252 #, fuzzy msgid "_Selected Items" msgstr "Adicionar o(s) stream(s) selecionado(s)" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Preferências" #: .././sonata/main.py:254 msgid "_About..." msgstr "_Sobre..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Editar tags..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Adicionar" #: .././sonata/main.py:257 msgid "_Replace" msgstr "Su_bstituir" #: .././sonata/main.py:258 #, fuzzy msgid "Add" msgstr "_Adicionar" #: .././sonata/main.py:259 #, fuzzy msgid "Replace" msgstr "Su_bstituir" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Apagar..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Embaralhar" #: .././sonata/main.py:286 #, fuzzy msgid "S_how Sonata" msgstr "_Mostrar o Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Repetir" #: .././sonata/main.py:288 #, fuzzy msgid "Rando_m" msgstr "Aleatório" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Por artista" #: .././sonata/main.py:429 msgid "By Album" msgstr "Por álbum" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Por título da faixa" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Por nome de arquivo" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Por diretório e nome de arquivo" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Inverter lista" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Novo..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Editar..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Renomear..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Lista de reprodução" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Clique para expandir" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Clique para recolher" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Não conectado" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "" #: .././sonata/main.py:645 #, fuzzy msgid "Cover Art" msgstr "_Capa" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 #, fuzzy msgid "Profile" msgstr "Novo perfil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Desconectar" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "Nº" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Ano" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Stream" #: .././sonata/main.py:1193 msgid "Len" msgstr "Duração" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Desconhecido" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:1761 #, fuzzy msgid "hour" msgid_plural "hours" msgstr[0] "hora e" msgstr[1] "horas e" #: .././sonata/main.py:1766 .././sonata/main.py:1768 #, fuzzy msgid "and" msgstr "Aleatório" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(atualizando mpd)" #: .././sonata/main.py:2116 #, fuzzy msgid "Lyrics Search" msgstr "_Letra da música" #: .././sonata/main.py:2117 #, fuzzy msgid "_Search" msgstr "Buscar" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Nome do artista" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Título da música" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Abrir imagem" #: .././sonata/main.py:2379 msgid "Images" msgstr "Imagens" #: .././sonata/main.py:2383 msgid "All files" msgstr "Todos os arquivos" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Escolha a capa" #: .././sonata/main.py:2426 #, fuzzy msgid "C_hoose" msgstr "Escolher" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Editar termos da busca" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Artista ou nome do álbum não encontrados." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Capa não encontrada." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Apagar a lista de reprodução selecionada?" msgstr[1] "Apagar as listas de reprodução selecionadas?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Apagar lista de reprodução" msgstr[1] "Apagar listas de reprodução" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Apagar o stream selecionado?" msgstr[1] "Apagar os streams selecionados?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Apagar stream" msgstr[1] "Apagar streams" #: .././sonata/main.py:2909 #, fuzzy msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "você deve especificar um diretório de músicas válido" #: .././sonata/main.py:2909 .././sonata/main.py:2916 #, fuzzy msgid "Music Dir Verification" msgstr "Verificação de Audioscrobbler" #: .././sonata/main.py:2916 #, fuzzy msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "você deve especificar um diretório de músicas válido" #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "álbum" msgstr[1] "álbuns" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "artista" msgstr[1] "artistas" #: .././sonata/main.py:3340 #, fuzzy msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "hora de êxtase" msgstr[1] "horas de êxtase" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "hora de êxtase" msgstr[1] "horas de êxtase" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Salvar lista de reprodução" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" #: .././sonata/playlists.py:120 #, fuzzy msgid "Existing Playlist" msgstr "Lista de reprodução" #: .././sonata/playlists.py:120 #, fuzzy msgid "Replace playlist" msgstr "Renomear lista de reprodução" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "" "Uma lista de reprodução com esse nome já existe. Você gostaria de substituir " "a atual?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Nome da lista de reprodução" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Renomear lista de reprodução" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Área de notificação" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Superior à esquerda" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Superior à direita" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Inferior à esquerda" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Inferior à direita" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Conexão do servidor MPD" #: .././sonata/preferences.py:76 #, fuzzy msgid "_Name" msgstr "Nome" #: .././sonata/preferences.py:79 #, fuzzy msgid "_Host" msgstr "Servidor" #: .././sonata/preferences.py:82 #, fuzzy msgid "_Port" msgstr "Porta" #: .././sonata/preferences.py:86 #, fuzzy msgid "_Music dir" msgstr "Pasta" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:91 #, fuzzy msgid "Pa_ssword" msgstr "Senha" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Deixe em branco caso nenhuma senha seja necessária." #: .././sonata/preferences.py:95 #, fuzzy msgid "_Autoconnect on start" msgstr "Auto-conectar ao iniciar" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Extras" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 #, fuzzy msgid "_Username:" msgstr "Usuário:" #: .././sonata/preferences.py:171 #, fuzzy msgid "_Password:" msgstr "Senha:" #: .././sonata/preferences.py:188 #, fuzzy msgid "Popup _notification on song changes" msgstr "Mostrar notificação ao trocar de música" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Duração do efeito" #: .././sonata/preferences.py:211 #, fuzzy msgid "_Fade length" msgstr "Duração do efeito" #: .././sonata/preferences.py:213 msgid "sec" msgstr "segundos" #: .././sonata/preferences.py:218 #, fuzzy msgid "C_rossfade" msgstr "Esvaecimento" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Exibição" #: .././sonata/preferences.py:251 #, fuzzy msgid "_Album art" msgstr "Nome do álbum" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "" #: .././sonata/preferences.py:256 #, fuzzy msgid "Artwork style:" msgstr "Nome do arquivo de capa" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Local, apenas" #: .././sonata/preferences.py:258 #, fuzzy msgid "Local and remote" msgstr "Local, depois remota" #: .././sonata/preferences.py:260 #, fuzzy msgid "Search locations:" msgstr "Buscar" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 #, fuzzy msgid "custom" msgstr "nome personalizado" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Salvar capa em:" #: .././sonata/preferences.py:277 #, fuzzy msgid "_Playback/volume buttons" msgstr "Habilitar os botões de reprodução/volume" #: .././sonata/preferences.py:280 #, fuzzy msgid "Pr_ogressbar" msgstr "Habilitar esvaecimento entre as músicas" #: .././sonata/preferences.py:283 #, fuzzy msgid "_Statusbar" msgstr "Habilitar a barra de status" #: .././sonata/preferences.py:286 #, fuzzy msgid "Song Ly_rics" msgstr "_Letra da música" #: .././sonata/preferences.py:288 #, fuzzy msgid "Save lyrics to:" msgstr "Salvar capa em:" #: .././sonata/preferences.py:297 #, fuzzy msgid "System _tray icon" msgstr "Área de notificação" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Comportamento da janela" #: .././sonata/preferences.py:323 #, fuzzy msgid "_Show window on all workspaces" msgstr "Mostrar janela em todos os espaços de trabalho" #: .././sonata/preferences.py:326 #, fuzzy msgid "_Keep window above other windows" msgstr "Manter janela sobre as outras janelas" #: .././sonata/preferences.py:329 #, fuzzy msgid "_Hide window titlebar" msgstr "Título da janela:" #: .././sonata/preferences.py:334 #, fuzzy msgid "_Minimize to system tray on close/escape" msgstr "Enviar para a área de notificação ao fechar" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Se essa opção for habilitada, ao fechar o Sonata, ele será enviado para a " "área de notificação. Nota: atualmente é impossível detectar se existe uma " "área de notificação disponível, então apenas habilite se você tiver uma." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Miscelânea" #: .././sonata/preferences.py:354 #, fuzzy msgid "_Update MPD library on start" msgstr "Atualizar a biblioteca do servidor MPD ao iniciar" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Se essa opção for habilitada, o Sonata irá automaticamente atualizar a " "biblioteca do seu servidor MPD ao iniciar." #: .././sonata/preferences.py:358 #, fuzzy msgid "S_top playback on exit" msgstr "Parar reprodução ao sair" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "O servidor MPD permite reprodução de músicas mesmo que o cliente não esteja " "aberto. Se essa opção for habilitada, o Sonata irá se comportar como um " "reprodutor de músicas convencional e para a reprodução ao sair." #: .././sonata/preferences.py:362 #, fuzzy msgid "_Write status file:" msgstr "Criar arquivo de status:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Se essa opção for habilitada, o Sonata irá criar um arquivo com o xmms-" "infopipe contendo informações sobre a música atual. Muitas aplicações " "suportam esse arquivo (mensageiros instantâneos, clientes IRC...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Formato das músicas" #: .././sonata/preferences.py:397 #, fuzzy msgid "C_urrent playlist:" msgstr "Lista de reprodução atual:" #: .././sonata/preferences.py:398 #, fuzzy msgid "_Library:" msgstr "Biblioteca:" #: .././sonata/preferences.py:399 #, fuzzy msgid "_Window title:" msgstr "Título da janela:" #: .././sonata/preferences.py:400 #, fuzzy msgid "Current _song line 1:" msgstr "Música atual (1ª linha):" #: .././sonata/preferences.py:402 #, fuzzy msgid "Current s_ong line 2:" msgstr "Música atual (2ª linha):" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Opções disponíveis" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Nome do artista" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Nome do álbum" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Nome da faixa" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Nº da faixa" #: .././sonata/preferences.py:430 #, fuzzy msgid "Disc number" msgstr "Nº da faixa" #: .././sonata/preferences.py:433 #, fuzzy msgid "File path" msgstr "O arquivo " #: .././sonata/preferences.py:434 msgid "File name" msgstr "Nome do arquivo" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Nome do stream" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Duração da música" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Tempo decorrido (título apenas)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Informação exibida apenas se todas as tags englobadas estão definidas" #: .././sonata/preferences.py:448 #, fuzzy msgid "Creates columns in the current playlist" msgstr "Lista de reprodução atual:" #: .././sonata/preferences.py:473 #, fuzzy msgid "_About" msgstr "_Sobre..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "" #: .././sonata/preferences.py:521 msgid "Description" msgstr "" #. Set up table #: .././sonata/preferences.py:532 #, fuzzy msgid "MPD" msgstr "_MPD" #: .././sonata/preferences.py:534 #, fuzzy msgid "Behavior" msgstr "_Comportamento" #: .././sonata/preferences.py:535 #, fuzzy msgid "Format" msgstr "_Formato" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Novo perfil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Capa personalizada" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Nome do arquivo de capa" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Editar stream" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Novo stream" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL do stream" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "" "Um stream com esse nome já existe. Você gostaria de substituir o atual?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "Taglib e/ou tagpy não foram encontrados. O suporte à edição de tags foi " "desabilitado." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Editar tags" #: .././sonata/tagedit.py:70 #, fuzzy msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Taglib e/ou tagpy não foram encontrados. O suporte à edição de tags foi " "desabilitado." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "O caminho" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "" "não existe. Por favor especifique um diretório de músicas válido nas " "preferências." #: .././sonata/tagedit.py:99 msgid "File " msgstr "O arquivo " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "" " não foi encontrado. Por favor especifique um diretório de músicas válido " "nas preferências." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Não foram encontrados arquivos de música com tags editáveis." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Comentário" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Salvar _todos" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Incrementar cada arquivo de música selecionado, começando pela faixa 1 para " "esse arquivo." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Aplicar a todos os arquivos de música selecionados." #: .././sonata/tagedit.py:260 msgid "of" msgstr "de" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Não foi possível salvar a tag no arquivo de música." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "" #: .././sonata/tagedit.py:369 #, fuzzy msgid "Show file path" msgstr "O caminho" #, fuzzy #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "O argumento -t, --toggle necessita do D-Bus. Abortando." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Atualizar biblioteca" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Página: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Habilitar Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Habilitar esvaecimento entre as músicas" #~ msgid "Enable album art" #~ msgstr "Habilitar capa do álbum" #~ msgid "Enable lyrics" #~ msgstr "Habilitar as letras de música" #~ msgid "Enable system tray icon" #~ msgstr "Habilitar o ícone da área de notificação" #~ msgid "_Display" #~ msgstr "_Exibição" #~ msgid "_Extras" #~ msgstr "_Extras" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 ou gnome-python-extras não foram encontrados. O suporte à " #~ "Área de Notificação foi desabilitado." #~ msgid "Reset to Default" #~ msgstr "Retornar ao padrão" #, fuzzy #~ msgid "_New Playlist..." #~ msgstr "_Salvar lista de reprodução" #~ msgid "Notification" #~ msgstr "Notificação" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 ou python-elementtree não foram encontrados. O suporte ao " #~ "Audioscrobbler foi desabilitado." #~ msgid "Audioscrobbler Verification" #~ msgstr "Verificação de Audioscrobbler" #, fuzzy #~ msgid "Update library for selected item(s)" #~ msgstr "Atualizar a biblioteca para o(s) caminho(s) selecionado(s)" #~ msgid "_Shuffle" #~ msgstr "_Embaralhar" #~ msgid "Toggle shuffle mode" #~ msgstr "Ativa/desativa o modo de embaralhação" #~ msgid "Not connected" #~ msgstr "Não conectado" #~ msgid "Press enter to search for these terms." #~ msgstr "Aperte enter para buscar por esses termos." #~ msgid "Add new profile" #~ msgstr "Adicionar novo perfil" #~ msgid "Remove current profile" #~ msgstr "Remover perfil atual" #~ msgid "Play enqueued files on activate" #~ msgstr "Reproduzir arquivos ao enviar para a lista de reprodução" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Reproduz automaticamente arquivos enviados para a lista de reprodução " #~ "através de clique duplo ou enter." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Adicionar a(s) música(s) ou diretório(s) selecionados" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Substituir pela(s) música(s) ou diretório(s) selecionados" #~ msgid "Add to _Queue" #~ msgstr "Adicionar à lista de _espera" #~ msgid "Remove from _Queue" #~ msgstr "Remover da lista de _espera" #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Adicionar as músicas selecionadas à lista de espera" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Remover a(s) música(s) selecionada(s) da lista de espera" #~ msgid "seconds" #~ msgstr "segundos" #~ msgid "Song Info..." #~ msgstr "Informações da música" #~ msgid "Click to collapse the player" #~ msgstr "Clique para recolher o reprodutor de músicas" #~ msgid "Click to expand the player" #~ msgstr "Clique para expandir o reprodutor de músicas" #~ msgid "_Song Info" #~ msgstr "_Informações da música" #~ msgid "_Search..." #~ msgstr "_Buscar..." #~ msgid "Remote only" #~ msgstr "Remota, apenas" #~ msgid "Remote, then local" #~ msgstr "Remota, depois local" #~ msgid "To save artwork as" #~ msgstr "Para salvar a capa como" #~ msgid "Artwork Verification" #~ msgstr "Verificação de capa" #~ msgid "Switch to current playlist" #~ msgstr "Alternar para a lista de reprodução atual" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/ru.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000130506�11255764730�0014567�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: Sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-04-06 19:33+0400\n" "PO-Revision-Date: 2009-04-06 21:35+0300\n" "Last-Translator: Fomin Denis <fominde@mail.ru>\n" "Language-Team: badDron <andrew@infonet.by>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Russian\n" "X-Poedit-SourceCharset: utf-8\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" "n%10<=4 && (n%100<10 || n%100>=20) ? 1: 2);\n" "n%10<=4 && (n%100<10 || n%100>=20) ? 1: 2);\n" "X-Poedit-Bookmarks: -1,99,98,-1,-1,-1,-1,-1,-1,-1\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:54 msgid "About Sonata" msgstr "О Sonata" #: .././sonata/about.py:55 #: .././sonata/preferences.py:96 msgid "Preferences" msgstr "Настройки" #: .././sonata/about.py:56 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:57 msgid "Switch to [1st-5th] tab" msgstr "Переключиться на [1-5] закладку" #: .././sonata/about.py:58 msgid "Connect to MPD" msgstr "Подключиться к MPD" #: .././sonata/about.py:59 msgid "Disconnect from MPD" msgstr "Отключиться от MPD" #: .././sonata/about.py:60 msgid "Randomize current playlist" msgstr "Перемешать текущий список" #: .././sonata/about.py:61 msgid "Expand player" msgstr "Развернуть плеер" #: .././sonata/about.py:62 msgid "Switch to previous tab" msgstr "Предыдущая закладка" #: .././sonata/about.py:63 msgid "Switch to next tab" msgstr "Следующая закладка" #: .././sonata/about.py:64 msgid "Collapse player" msgstr "Свернуть плеер" #: .././sonata/about.py:65 #: .././sonata/library.py:79 msgid "Search library" msgstr "Поиск в фонотеке" #: .././sonata/about.py:66 msgid "Quit" msgstr "Выйти" #: .././sonata/about.py:67 msgid "Update entire library" msgstr "Обновить фонотеку" #: .././sonata/about.py:68 msgid "Display popup menu" msgstr "Показать всплывающее меню" #: .././sonata/about.py:69 msgid "Minimize to system tray (if enabled)" msgstr "Свернуть в трей (если включено)" #: .././sonata/about.py:71 msgid "Previous track" msgstr "Предыдущая песня" #: .././sonata/about.py:72 msgid "Next track" msgstr "Следующая песня" #: .././sonata/about.py:73 msgid "Play/Pause" msgstr "Воспроизведение/пауза" #: .././sonata/about.py:74 msgid "Stop" msgstr "Остановить" #: .././sonata/about.py:75 msgid "Lower the volume" msgstr "Понизить громкость" #: .././sonata/about.py:76 msgid "Raise the volume" msgstr "Повысить громкость" #: .././sonata/about.py:78 msgid "Play selected song" msgstr "Воспроизвести выделенную песню" #: .././sonata/about.py:79 msgid "Remove selected song(s)" msgstr "Удалить выбранную песню(-и)" #: .././sonata/about.py:80 msgid "Center currently playing song" msgstr "Остановить проигрывание" #: .././sonata/about.py:81 #: .././sonata/about.py:90 msgid "Edit selected song's tags" msgstr "Редактировать теги выбранной записи" #: .././sonata/about.py:82 msgid "Save to new playlist" msgstr "Сохранить в новый список" #: .././sonata/about.py:83 msgid "Clear list" msgstr "Очистить список" #: .././sonata/about.py:84 msgid "Randomize list" msgstr "Перемешать список" #: .././sonata/about.py:86 msgid "Add selected song(s) or enter directory" msgstr "Добавить отмеченные песни или войти в каталог" #: .././sonata/about.py:87 msgid "Go to parent directory" msgstr "Перейти в родительский каталог" #: .././sonata/about.py:88 msgid "Add selected item(s)" msgstr "Добавить выделенные песни" #: .././sonata/about.py:89 msgid "Replace with selected item(s)" msgstr "Заменить выбранными песнями" #: .././sonata/about.py:91 msgid "Add selected item(s) and play" msgstr "Добавить песни в список и проиграть" #: .././sonata/about.py:92 msgid "Replace with selected item(s) and play" msgstr "Заменить выбранными песнями и проиграть" #: .././sonata/about.py:93 msgid "Update selected item(s)/path(s)" msgstr "Обновить выделенные позиции/пути" #: .././sonata/about.py:95 #: .././sonata/about.py:97 msgid "Add selected playlist(s)" msgstr "Добавить отмеченные списки" #: .././sonata/about.py:96 msgid "Remove selected playlist(s)" msgstr "Удалить отмеченные списки" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s)" msgstr "Заменить на отмеченные списки" #: .././sonata/about.py:99 msgid "Add selected playlist(s) and play" msgstr "Добавить отмеченные списки и воспроизвести" #: .././sonata/about.py:100 msgid "Replace with selected playlist(s) and play" msgstr "Заменить на отмеченные списки и воспроизвести" #: .././sonata/about.py:102 #: .././sonata/about.py:104 msgid "Add selected stream(s)" msgstr "Добавить выделенные потоки" #: .././sonata/about.py:103 msgid "Remove selected stream(s)" msgstr "Удалить выделенные потоки" #: .././sonata/about.py:105 msgid "Replace with selected stream(s)" msgstr "Заменить выбранными потоками" #: .././sonata/about.py:106 msgid "Add selected stream(s) and play" msgstr "Добавить выделенные потоки и воспроизвести" #: .././sonata/about.py:107 msgid "Replace with selected stream(s) and play" msgstr "Заменить на выбранные потоки и воспроизвести" #: .././sonata/about.py:109 msgid "Edit playing song's tags" msgstr "Правка тегов воспроизводимой записи" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:112 msgid "Main Shortcuts" msgstr "Основные горячие клавиши" #: .././sonata/about.py:113 msgid "Playback Shortcuts" msgstr "Воспроизведение" #: .././sonata/about.py:114 msgid "Current Shortcuts" msgstr "Текущий плейлист" #: .././sonata/about.py:115 msgid "Library Shortcuts" msgstr "Фонотека" #: .././sonata/about.py:116 msgid "Playlist Shortcuts" msgstr "Списки воспроизведения" #: .././sonata/about.py:117 msgid "Stream Shortcuts" msgstr "Потоки" #: .././sonata/about.py:118 msgid "Info Shortcuts" msgstr "Информация" #: .././sonata/about.py:119 msgid "Shortcuts" msgstr "Гор. клавиши" #. XXX translate expressions, not words #. Show text: #: .././sonata/about.py:147 #: .././sonata/library.py:859 #: .././sonata/main.py:1744 msgid "song" msgid_plural "songs" msgstr[0] "песня" msgstr[1] "песни" msgstr[2] "песен" #: .././sonata/about.py:148 msgid "album" msgid_plural "albums" msgstr[0] "альбом" msgstr[1] "альбома" msgstr[2] "альбомов" #: .././sonata/about.py:149 msgid "artist" msgid_plural "artists" msgstr[0] "исполнитель" msgstr[1] "исполнителя" msgstr[2] "исполнителей" #: .././sonata/about.py:156 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "день блаженства" msgstr[1] "дня блаженства" msgstr[2] "дней блаженства" #: .././sonata/about.py:158 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "час блаженства" msgstr[1] "часа блаженства" msgstr[2] "часов блаженства" #: .././sonata/about.py:172 msgid "An elegant music client for MPD." msgstr "Прекрасный клиент MPD." #. Add button to show keybindings: #: .././sonata/about.py:185 msgid "_Shortcuts" msgstr "_Гор. клавиши" #: .././sonata/about.py:196 #: .././sonata/main.py:3091 #: .././sonata/preferences.py:871 msgid "Unable to launch a suitable browser." msgstr "Не удалось запустить подходящий браузер." #: .././sonata/about.py:196 #: .././sonata/main.py:3091 #: .././sonata/preferences.py:871 msgid "Launch Browser" msgstr "Запустить браузер" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Опции toggle и popup требуют наличия D-Bus. Останов." #: .././sonata/cli.py:97 msgid "Version" msgstr "Версия" #: .././sonata/cli.py:98 msgid "Website" msgstr "Сайт" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Запуск: sonata [ПАРАМЕТР]...[КОМАНДА]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Настройки" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Показать эту справку и выйти" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Всплывающее уведомление (требует D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Определяет, будет ли приложение свернуто" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "в трей или видимый (требует D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Показать номер версии и выйти" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Запускать плеер спрятанным (необходим трей)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Запускать плеер видимым (необходим трей)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Запускаться с профилем [NUM]" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Команды" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Воспроизвести песню из ротации" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Приостановить текущую песню" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Остановить текущую песню" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Перейти к следующей песне в ротации" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Перейти к предыдущей песне в ротации" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Переключить воспроизведение/паузу" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Переключить режим повтора" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Переключить случайный выбор песни" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Отобразить информацию о песне" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Отобразить состояние MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Sonata стартует с профилем %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d не верный номер профиля." #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Номер профиля должен быть между 1 и %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 #: .././sonata/main.py:177 msgid "Default Profile" msgstr "Основной профиль" #: .././sonata/cli.py:154 #: .././sonata/main.py:177 msgid "by" msgstr "от" #: .././sonata/cli.py:154 #: .././sonata/main.py:177 msgid "from" msgstr "из" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "Невозможно подключиться к MPD.\n" "Проверьте настройки Sonata либо переменные окружения MPD_HOST/MPD_PORT" #: .././sonata/cli.py:208 #: .././sonata/info.py:90 #: .././sonata/library.py:45 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Название" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/library.py:45 #: .././sonata/main.py:1168 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Исполнитель" #: .././sonata/cli.py:210 #: .././sonata/info.py:93 #: .././sonata/library.py:45 #: .././sonata/main.py:1169 #: .././sonata/main.py:2420 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Альбом" #: .././sonata/cli.py:211 #: .././sonata/info.py:95 msgid "Date" msgstr "Год" #: .././sonata/cli.py:212 #: .././sonata/info.py:96 #: .././sonata/main.py:1170 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Дорожка" #: .././sonata/cli.py:213 #: .././sonata/info.py:97 #: .././sonata/library.py:45 #: .././sonata/main.py:1173 #: .././sonata/preferences.py:557 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Жанр" #: .././sonata/cli.py:214 #: .././sonata/info.py:98 #: .././sonata/main.py:1175 msgid "File" msgstr "Файл" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "Время" #: .././sonata/cli.py:222 #: .././sonata/info.py:99 msgid "Bitrate" msgstr "Битрейт" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD остановлен" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "Состояние" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Воспроизведение" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Приостановлено" #: .././sonata/cli.py:232 #: .././sonata/main.py:561 #: .././sonata/main.py:566 #: .././sonata/main.py:1817 #: .././sonata/main.py:1828 msgid "Stopped" msgstr "Остановлено" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "Повторять" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "Выкл." #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "Вкл." #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "В случайном порядке" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Громкость" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Перекрестное затухание" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:277 msgid "second" msgid_plural "seconds" msgstr[0] "секунда" msgstr[1] "секунды" msgstr[2] "секунд" #: .././sonata/current.py:64 msgid "Filter" msgstr "Фильтр" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Не удалось подключиться к D-Bus: невозможно определить адрес шины сообщений (попробуйте 'man dbus-launch' и 'man dbus-daemon' для получения информации о решении проблемы)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Sonata стартует с профилем" #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Возможно Sonata не запущена?" #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Другой экземпляр Sonata уже запущен." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "О песне" #: .././sonata/info.py:92 msgid "Launch artist in Wikipedia" msgstr "Поиск исполнителя в Википедии" #: .././sonata/info.py:94 msgid "Launch album in Wikipedia" msgstr "Поиск альбома в Википедии" #: .././sonata/info.py:128 msgid "Toggle extra tags" msgstr "Дополнительные теги" #: .././sonata/info.py:131 msgid "Edit song tags" msgstr "Правка тегов" #. Lyrics #: .././sonata/info.py:141 msgid "Lyrics" msgstr "Стихи" #: .././sonata/info.py:153 msgid "Search Lyricwiki.org for lyrics" msgstr "Поиск стихов на Lyricwiki.org" #: .././sonata/info.py:154 msgid "Edit lyrics at Lyricwiki.org" msgstr "Редактировать стихи на Lyricwiki.org" #. Album info #: .././sonata/info.py:162 msgid "Album Info" msgstr "Об альбоме" #: .././sonata/info.py:214 #: .././sonata/info.py:219 msgid "more" msgstr "больше" #: .././sonata/info.py:216 msgid "hide" msgstr "спрятать" #: .././sonata/info.py:282 msgid "edit tags" msgstr "править теги" #: .././sonata/info.py:309 msgid "Album info not found." msgstr "Нет описания альбома." #: .././sonata/info.py:312 msgid "Album name not set." msgstr "Альбом без названия." #: .././sonata/info.py:326 msgid "ZSI not found, fetching lyrics support disabled." msgstr "Библиотека ZSI не найдена. Загрузка текстов отключена." #: .././sonata/info.py:331 msgid "Artist or song title not set." msgstr "Исполнитель или название песни неизвестны." #: .././sonata/info.py:373 msgid "search" msgstr "поиск" #: .././sonata/info.py:374 msgid "edit" msgstr "править" #: .././sonata/info.py:383 #: .././sonata/info.py:438 msgid "Lyrics not found" msgstr "Текст не найден" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:403 msgid "Fetching lyrics..." msgstr "Получение текста..." #: .././sonata/info.py:413 msgid "Couldn't connect to LyricWiki" msgstr "Невозможно соединиться с LyricWiki" #: .././sonata/info.py:441 msgid "Fetching lyrics failed" msgstr "Не удалось получить текст" #: .././sonata/library.py:43 msgid "Untagged" msgstr "Нет тегов" #: .././sonata/library.py:44 msgid "Various Artists" msgstr "Сборник" #: .././sonata/library.py:45 msgid "Filename" msgstr "Имя файла" #: .././sonata/library.py:45 msgid "Everything" msgstr "Во всех" #: .././sonata/library.py:77 msgid "Search terms" msgstr "Условия поиска" #: .././sonata/library.py:83 msgid "End Search" msgstr "Завершить поиск" #: .././sonata/library.py:85 msgid "Library browsing view" msgstr "Представление фонотеки" #. disabled as breadcrumbs replace this: #. self.searchbox.pack_start(self.libraryview, False, False, 1) #. self.searchbox.pack_start(gtk.VSeparator(), False, False, 2) #: .././sonata/library.py:89 msgid "Search" msgstr "Поиск" #: .././sonata/library.py:110 msgid "Filesystem" msgstr "Файловая система" #: .././sonata/library.py:112 msgid "Albums" msgstr "Альбомы" #: .././sonata/library.py:114 msgid "Artists" msgstr "Исполнители" #: .././sonata/library.py:116 msgid "Genres" msgstr "Жанры" #. add the views button first #: .././sonata/library.py:376 msgid " v " msgstr "" #: .././sonata/library.py:859 #: .././sonata/main.py:1738 msgid "minute" msgid_plural "minutes" msgstr[0] "минута" msgstr[1] "минуты" msgstr[2] "минут" #: .././sonata/library.py:947 msgid "Song" msgstr "Песня" #: .././sonata/library.py:947 #: .././sonata/main.py:1174 msgid "Path" msgstr "Путь" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "В ротации" #: .././sonata/main.py:103 msgid "Library" msgstr "Фонотека" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Списки" #: .././sonata/main.py:105 msgid "Streams" msgstr "Потоки" #: .././sonata/main.py:106 msgid "Info" msgstr "Информация" #: .././sonata/main.py:137 #: .././sonata/preferences.py:278 #: .././sonata/preferences.py:279 msgid "Entire song" msgstr "На всю песню" #: .././sonata/main.py:235 msgid "_Sort List" msgstr "Со_ртировать список" #: .././sonata/main.py:236 msgid "Sa_ve List to" msgstr "Сохранять список в" #: .././sonata/main.py:237 msgid "_Connection" msgstr "Соединение" #: .././sonata/main.py:238 msgid "P_lay after" msgstr "Играть после" #: .././sonata/main.py:239 #: .././sonata/main.py:2434 msgid "_Update" msgstr "_Обновить" #: .././sonata/main.py:240 msgid "Use _Remote Image..." msgstr "Изображение из _интернета..." #: .././sonata/main.py:241 msgid "Use _Local Image..." msgstr "_Локальное изображение..." #: .././sonata/main.py:242 msgid "_Fullscreen Mode" msgstr "_Полноэкранный Режим" #: .././sonata/main.py:243 msgid "Reset Image" msgstr "Сбросить изображение" #: .././sonata/main.py:244 msgid "_Play" msgstr "_Воспроизведение" #: .././sonata/main.py:245 msgid "Pa_use" msgstr "_Пауза" #: .././sonata/main.py:246 msgid "_Stop" msgstr "_Стоп" #: .././sonata/main.py:247 msgid "Pre_vious" msgstr "_Назад" #: .././sonata/main.py:248 msgid "_Next" msgstr "_Вперёд" #: .././sonata/main.py:249 msgid "_Quit" msgstr "Вы_ход" #: .././sonata/main.py:250 msgid "_Remove" msgstr "_Удалить" #: .././sonata/main.py:251 msgid "_Clear" msgstr "О_чистить" #: .././sonata/main.py:252 msgid "_Entire Library" msgstr "_Всю Фонотеку " #: .././sonata/main.py:253 msgid "_Selected Items" msgstr "_Выделенные элементы" #: .././sonata/main.py:254 msgid "_Preferences..." msgstr "_Настройки..." #: .././sonata/main.py:255 msgid "_About..." msgstr "О п_рограмме" #: .././sonata/main.py:256 msgid "_Edit Tags..." msgstr "_Править теги" #: .././sonata/main.py:257 msgid "_Add" msgstr "_Добавить" #: .././sonata/main.py:258 msgid "_Replace" msgstr "_Заменить" #: .././sonata/main.py:259 msgid "Add" msgstr "Добавить" #: .././sonata/main.py:260 msgid "Replace" msgstr "Заменить" #: .././sonata/main.py:261 msgid "_Delete..." msgstr "_Удалить" #: .././sonata/main.py:262 msgid "Shuffle" msgstr "В случайном порядке" #: .././sonata/main.py:287 msgid "S_how Sonata" msgstr "_Показать Sonata" #: .././sonata/main.py:288 msgid "_Repeat" msgstr "_Повторять" #: .././sonata/main.py:289 msgid "Rando_m" msgstr "_Случайно" #: .././sonata/main.py:430 msgid "By Artist" msgstr "По исполнителю" #: .././sonata/main.py:431 msgid "By Album" msgstr "По альбому" #: .././sonata/main.py:432 msgid "By Song Title" msgstr "По названию" #: .././sonata/main.py:433 msgid "By File Name" msgstr "По имени файла" #: .././sonata/main.py:434 msgid "By Dir & File Name" msgstr "По каталогу и имени файла" #: .././sonata/main.py:435 msgid "Reverse List" msgstr "В обратном порядке" #: .././sonata/main.py:458 #: .././sonata/main.py:469 msgid "_New..." msgstr "Создать..." #: .././sonata/main.py:459 msgid "_Edit..." msgstr "_Правка" #: .././sonata/main.py:470 msgid "_Rename..." msgstr "Пере_именовать" #: .././sonata/main.py:532 #: .././sonata/main.py:599 #: .././sonata/main.py:600 msgid "Playlist" msgstr "Список воспроизведения" #: .././sonata/main.py:562 #: .././sonata/main.py:1821 #: .././sonata/main.py:2030 msgid "Click to expand" msgstr "Развернуть" #: .././sonata/main.py:567 #: .././sonata/main.py:1819 #: .././sonata/main.py:2028 msgid "Click to collapse" msgstr "Свернуть" #: .././sonata/main.py:572 #: .././sonata/main.py:1713 #: .././sonata/main.py:1824 msgid "Not Connected" msgstr "Нет соединения" #: .././sonata/main.py:574 #: .././sonata/main.py:1711 #: .././sonata/main.py:1826 msgid "No Read Permission" msgstr "Чтение не разрешено" #: .././sonata/main.py:647 #, fuzzy msgid "Cover Art" msgstr "Обложка" #: .././sonata/main.py:860 msgid "MPD_HOST/PORT" msgstr "MPD_ХОСТ/ПОРТ" #: .././sonata/main.py:865 msgid "Disconnect" msgstr "Отключиться" #: .././sonata/main.py:1171 #: .././sonata/main.py:1178 msgid "#" msgstr "" #: .././sonata/main.py:1172 #: .././sonata/preferences.py:556 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "год" #: .././sonata/main.py:1176 msgid "Stream" msgstr "Поток" #: .././sonata/main.py:1177 msgid "Len" msgstr "Длина" #: .././sonata/main.py:1198 #: .././sonata/main.py:1205 #: .././sonata/main.py:1246 #: .././sonata/main.py:1253 msgid "Unknown" msgstr "Неизвестно" #: .././sonata/main.py:1734 msgid "day" msgid_plural "days" msgstr[0] "день" msgstr[1] "дня" msgstr[2] "дней" #: .././sonata/main.py:1742 msgid "hour" msgid_plural "hours" msgstr[0] "час" msgstr[1] "часа" msgstr[2] "часов" #: .././sonata/main.py:1747 #: .././sonata/main.py:1749 msgid "and" msgstr "и" #: .././sonata/main.py:1757 msgid "(updating mpd)" msgstr "(обновляется база MPD)" #: .././sonata/main.py:2097 msgid "Lyrics Search" msgstr "Поиск стихов" #: .././sonata/main.py:2098 msgid "_Search" msgstr "_Поиск" #: .././sonata/main.py:2101 msgid "Artist Name" msgstr "Исполнитель" #: .././sonata/main.py:2106 msgid "Song Title" msgstr "Название песни" #: .././sonata/main.py:2358 msgid "Open Image" msgstr "Открыть изображение" #: .././sonata/main.py:2360 msgid "Images" msgstr "Изображения" #: .././sonata/main.py:2364 msgid "All files" msgstr "Все файлы" #: .././sonata/main.py:2406 msgid "Choose Cover Art" msgstr "Выбрать обложку" #: .././sonata/main.py:2407 msgid "C_hoose" msgstr "_Выбрать" #: .././sonata/main.py:2439 msgid "Edit search terms" msgstr "Править условия поиска" #: .././sonata/main.py:2496 msgid "No artist or album name found." msgstr "Исполнитель или альбом не найдены." #: .././sonata/main.py:2499 msgid "No cover art found." msgstr "Обложка не найдена." #: .././sonata/main.py:2823 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Удалить выбранный список?" msgstr[1] "Удалить выбранные списки?" msgstr[2] "Удалить выбранные списки?" #: .././sonata/main.py:2823 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Удалить список" msgstr[1] "Удалить списки" msgstr[2] "Удалить списки" #: .././sonata/main.py:2831 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Удалить выбранный поток?" msgstr[1] "Удалить выбранные потоки?" msgstr[2] "Удалить выбранные потоки?" #: .././sonata/main.py:2831 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Удалить поток" msgstr[1] "Удалить потоки" msgstr[2] "Удалить потоки" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Сохранить список" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Хотите заменить существующий список, или добавить в него эти песни?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Список уже существует" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Заменить список" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Добавить песни" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Список с таким названием уже существует. Хотите заменить его?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Название списка" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Переименовать список" #: .././sonata/preferences.py:27 msgid "System tray" msgstr "В трее" #: .././sonata/preferences.py:27 msgid "Top Left" msgstr "Слева вверху" #: .././sonata/preferences.py:27 msgid "Top Right" msgstr "Справа вверху" #: .././sonata/preferences.py:28 msgid "Bottom Left" msgstr "Слева внизу" #: .././sonata/preferences.py:28 msgid "Bottom Right" msgstr "Справа внизу" #: .././sonata/preferences.py:29 msgid "Screen Center" msgstr "Центр экрана" #: .././sonata/preferences.py:99 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:100 #: .././sonata/preferences.py:343 msgid "Display" msgstr "Отображение" #: .././sonata/preferences.py:101 msgid "Behavior" msgstr "Поведение" #: .././sonata/preferences.py:102 msgid "Format" msgstr "Форматирование" #: .././sonata/preferences.py:103 #: .././sonata/preferences.py:245 msgid "Extras" msgstr "Дополнительно" #: .././sonata/preferences.py:128 msgid "MPD Connection" msgstr "Соединение с MPD" #: .././sonata/preferences.py:141 msgid "_Name" msgstr "_Имя" #: .././sonata/preferences.py:144 msgid "_Host" msgstr "У_зел" #: .././sonata/preferences.py:147 msgid "_Port" msgstr "_Порт" #: .././sonata/preferences.py:151 msgid "_Music dir" msgstr "Каталог с _музыкой" #: .././sonata/preferences.py:152 msgid "Select a Music Directory" msgstr "Выберите Каталог с музыкой" #: .././sonata/preferences.py:158 msgid "Pa_ssword" msgstr "_Пароль" #: .././sonata/preferences.py:161 msgid "Leave blank if no password is required." msgstr "Оставьте поле пустым если пароль не требуется." #: .././sonata/preferences.py:162 msgid "_Autoconnect on start" msgstr "Подключаться при з_апуске" #: .././sonata/preferences.py:182 msgid "Using MPD_HOST/PORT" msgstr "Используется MPD_HOST/PORT" #: .././sonata/preferences.py:250 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:252 msgid "_Username:" msgstr "_Идентификатор:" #: .././sonata/preferences.py:253 msgid "_Password:" msgstr "_Пароль:" #: .././sonata/preferences.py:273 msgid "Popup _notification on song changes" msgstr "Всплывающее уведомле_ние при смене песни" #: .././sonata/preferences.py:299 msgid "Fade length" msgstr "Длительность" #: .././sonata/preferences.py:300 msgid "_Fade length" msgstr "_Длительность" #: .././sonata/preferences.py:302 msgid "sec" msgstr "сек" #: .././sonata/preferences.py:307 msgid "C_rossfade" msgstr "Пе_рекрестное затухание" #: .././sonata/preferences.py:348 msgid "_Album art" msgstr "_Альбом" #: .././sonata/preferences.py:350 msgid "Standard" msgstr "Обычная" #: .././sonata/preferences.py:351 msgid "Stylized" msgstr "Модная" #: .././sonata/preferences.py:356 msgid "Artwork style:" msgstr "Стиль обложки:" #: .././sonata/preferences.py:358 msgid "Local only" msgstr "Только локальная" #: .././sonata/preferences.py:359 msgid "Local and remote" msgstr "Локальная и удаленная" #: .././sonata/preferences.py:362 msgid "Search locations:" msgstr "Место поиска:" #: .././sonata/preferences.py:369 #: .././sonata/preferences.py:396 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:371 msgid "custom" msgstr "другое" #: .././sonata/preferences.py:378 msgid "Save art to:" msgstr "Сохранять обложки в:" #: .././sonata/preferences.py:383 msgid "_Playback/volume buttons" msgstr "Кно_пки воспроизведения и регулятор громкости" #: .././sonata/preferences.py:386 msgid "Pr_ogressbar" msgstr "Индикат_ор позиции" #: .././sonata/preferences.py:389 msgid "_Statusbar" msgstr "_Статусная строка" #: .././sonata/preferences.py:392 msgid "Song Ly_rics" msgstr "_Стихи" #: .././sonata/preferences.py:394 msgid "Save lyrics to:" msgstr "Сохранять обложки в:" #: .././sonata/preferences.py:405 msgid "System _tray icon" msgstr "Иконка в _трее" #: .././sonata/preferences.py:429 msgid "Window Behavior" msgstr "Поведение окна" #: .././sonata/preferences.py:433 msgid "_Show window on all workspaces" msgstr "Показывать на всех рабочих _столах" #: .././sonata/preferences.py:436 msgid "_Keep window above other windows" msgstr "_Поверх остальных окон" #: .././sonata/preferences.py:439 msgid "_Hide window titlebar" msgstr "_Спрятать заголовок окна" #: .././sonata/preferences.py:442 msgid "_Minimize to system tray on close/escape" msgstr "_Сворачивать в трей при закрытии/нажатии escape" #: .././sonata/preferences.py:444 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "Если отмечено, при закрытии Sonata будет сворачиваться в трей. Имейте в виду, что на данный момент невозможно определить, есть ли у вас трей, так что отмечайте только если вы уверены, что он есть." #: .././sonata/preferences.py:460 msgid "Miscellaneous" msgstr "Разное" #: .././sonata/preferences.py:464 msgid "_Update MPD library on start" msgstr "О_бновлять фонотеку MPD при запуске" #: .././sonata/preferences.py:466 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "Если отмечено, Sonata будет автоматически обновлять фонотеку MPD при старте." #: .././sonata/preferences.py:469 msgid "S_top playback on exit" msgstr "Ос_танавливать воспроизведение при выходе" #: .././sonata/preferences.py:471 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD позволяет проигрывание даже если клиент не запущен. Если включено, Sonata будет похожа на обычный плеер и останавливать воспроизведение при выходе." #: .././sonata/preferences.py:474 msgid "_Write status file:" msgstr "_Записывать статус в файл:" #: .././sonata/preferences.py:476 #: .././sonata/preferences.py:478 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "Если отмечено, Sonata будет создавать XMMS-подобный файл информации о текущей песне. Такой файл используется многими приложениями (программы обмена мгновенными сообщениями, клиенты IRC...)." #: .././sonata/preferences.py:512 msgid "Song Formatting" msgstr "Форматирование информации" #: .././sonata/preferences.py:517 msgid "C_urrent playlist:" msgstr "_Текущий список:" #: .././sonata/preferences.py:518 msgid "_Library:" msgstr "_Фонотека:" #: .././sonata/preferences.py:519 msgid "_Window title:" msgstr "Заголо_вок окна:" #: .././sonata/preferences.py:520 msgid "Current _song line 1:" msgstr "Текущая _запись строка 1:" #: .././sonata/preferences.py:522 msgid "Current s_ong line 2:" msgstr "Текущая з_апись строка 2:" #: .././sonata/preferences.py:547 msgid "Available options" msgstr "Возможные варианты" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:551 msgid "Artist name" msgstr "Исполнитель" #: .././sonata/preferences.py:552 msgid "Album name" msgstr "Альбом" #: .././sonata/preferences.py:553 msgid "Track name" msgstr "Название песни" #: .././sonata/preferences.py:554 msgid "Track number" msgstr "Номер дорожки" #: .././sonata/preferences.py:555 msgid "Disc number" msgstr "Номер диска" #: .././sonata/preferences.py:558 msgid "File path" msgstr "Путь к файлу" #: .././sonata/preferences.py:559 msgid "File name" msgstr "имя файла" #: .././sonata/preferences.py:560 #: .././sonata/streams.py:107 msgid "Stream name" msgstr "Название потока" #: .././sonata/preferences.py:561 msgid "Song length" msgstr "Длительность песни" #: .././sonata/preferences.py:562 msgid "Elapsed time (title only)" msgstr "Прошедшее время (только в заголовке)" #: .././sonata/preferences.py:572 msgid "Info displayed only if all enclosed tags are defined" msgstr "Информация отображается только при наличии всех включенных тегов" #: .././sonata/preferences.py:572 msgid "Creates columns in the current playlist" msgstr "Создать столбцы в текущем списке" #: .././sonata/preferences.py:598 msgid "_About" msgstr "О п_рограмме" #: .././sonata/preferences.py:601 msgid "_Configure..." msgstr "_Настройки..." #: .././sonata/preferences.py:641 msgid "Loaded" msgstr "Загружен" #: .././sonata/preferences.py:649 msgid "Description" msgstr "Описание" #: .././sonata/preferences.py:666 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "Чтобы сохранять тексты песен в каталог с музыкой Вы должны правильно указать каталог." #: .././sonata/preferences.py:666 #: .././sonata/preferences.py:673 msgid "Music Dir Verification" msgstr "Проверка каталога с музыкой" #: .././sonata/preferences.py:673 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "Чтобы сохранять обложки в каталог с музыкой Вы должны правильно указать каталог." #: .././sonata/preferences.py:738 msgid "New Profile" msgstr "Новый профиль" #. Prompt user for playlist name: #: .././sonata/preferences.py:792 msgid "Custom Artwork" msgstr "Особая обложка " #: .././sonata/preferences.py:794 msgid "Artwork filename" msgstr "Имя файла обложки" #: .././sonata/streams.py:103 msgid "Edit Stream" msgstr "Править потоки" #: .././sonata/streams.py:105 #: .././sonata/streams.py:136 msgid "New Stream" msgstr "Создать поток" #: .././sonata/streams.py:114 msgid "Stream URL" msgstr "URL потока" #: .././sonata/streams.py:136 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Поток с таким названием уже существует. Хотите заменить его?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Библиотеки Taglib и/или Tagpy не найдены. Правка тегов отключена." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Править теги" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Версия библиотеки Tagpy < 0.91. Обновите библиотеку, правка тегов отключена." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Путь" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "не существует. Укажите правильный каталог в настройках." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Файл " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " не существует. Укажите правильный каталог в настройках." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Не найдено файлов с редактируемыми тегами." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Комментарий" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Сохранить _всё" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Прирастить каждый выбранный файл, начать с дорожки 1 для этого файла." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Применить ко всем выбранным файлам." #: .././sonata/tagedit.py:260 msgid "of" msgstr "из" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Невозможно сохранить тег в файл." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Скрыть путь к файлу" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Показать путь к файлу" #~ msgid "Profile" #~ msgstr "Профиль" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Опция --popup требует наличия D-Bus. Останов." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Обновить" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Сайт: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Аудиоскроблер" #~ msgid "Enable Crossfade" #~ msgstr "Перекрестное затухание" #~ msgid "Enable album art" #~ msgstr "Обложка" #~ msgid "Enable lyrics" #~ msgstr "Текст песни" #~ msgid "Enable system tray icon" #~ msgstr "Значок в трее" #~ msgid "_Display" #~ msgstr "_Отображение" #~ msgid "_Extras" #~ msgstr "_Дополнительно" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 или gnome-python-extras не найдены. Поддержка системного трея " #~ "отключена." #~ msgid "Reset to Default" #~ msgstr "Настройки по умолчанию" #~ msgid "_New Playlist..." #~ msgstr "_Новый список..." #~ msgid "Notification" #~ msgstr "Уведомление" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 или python-elementtree не найдены. Аудиоскроблер отключен." #~ msgid "Audioscrobbler Verification" #~ msgstr "Аудиоскроблер-верификация" #~ msgid "Update library for selected item(s)" #~ msgstr "Обновить фонотеку для выбранных папок" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/sk.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000120133�11255764730�0014551�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Slovak translation of sonata. # Copyright (C) 2008 THE 'S COPYRIGHT HOLDER # This file is distributed under the same license as the Sonata package. # Robert Hartl <hartl.robert@gmail.com>, 2008 # Thanks to Jakub Adler for czech translation. # # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2008-12-27 17:10+0100\n" "Last-Translator: Robert Hartl <hartl.robert@gmail.com>\n" "Language-Team: Slovak <sk-i18n@linux.sk>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n>=2 && n<=4 ? 1 : 2;\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "O programe Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Nastavenie" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Prepn na [1-5] tab" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Spoji s MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Odpoji od MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Nhodne zoradi aktulny zoznam" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Zvi prehrva" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Prejs na predchdzajcu kartu" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Prejs na nsledujcu kartu" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Zmeni prehrva" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Prehada kninicu" #: .././sonata/about.py:64 msgid "Quit" msgstr "Koniec" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Aktualizova cel kninicu" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Zobrazi vyskakovacie menu" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Skry do systmovej oblasti (ak je zapnut)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Predchdzajca stopa" #: .././sonata/about.py:70 msgid "Next track" msgstr "alia stopa" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Play/Pause" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stop" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Zni hlasitos" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Zvi hlasitos" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Prehra vybran skladbu" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Zmaza vybran skladby" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Umiestni prehrvan skladbu na stred" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Upravi tagy vybranej skladby" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Uloi do novho playlistu" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Vymaza zoznam" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Nhodne zoradi zoznam" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Prida vybran skladbu alebo vstpi do priinku" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "s do nadradenho prieinku" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Prida vybran poloky" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Prepsa vybranmi polokami" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Prida vybran poloky a prehr" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Prepsa vybranmi polokami a prehra" #: .././sonata/about.py:91 #, fuzzy msgid "Update selected item(s)/path(s)" msgstr "Prida vybran poloky" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Prida vybran playlisty" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Zmaza vybran playlisty" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Prepsa vybranmi playlistami" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Prida vybran playlisty a prehra" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Prepsa vybranmi playlistami a prehra" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Prida vybran streamy" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Zmaza vybran streamy" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Prepsa vybranmi streamami" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Prida vybran streamy a prehra" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Prepsa vybranmi streamami a prehra" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Upravi tagy prehrvanej skladby" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Hlavn skratky" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Skratky pre prehrvanie" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Skratky pre aktulny playlist" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Skratky pre kninicu" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Skratky pre playlist" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Skratky pre stream" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Skratky pre informcie" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Skratky" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Elegantn klient pre MPD" #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Skratky" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Nie je mon spusi vhodn prehliada." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Spusti prehliada" #: .././sonata/cli.py:81 #, fuzzy msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Parameter toggle potrebuje D-Bus. Ru sa." #: .././sonata/cli.py:97 #, fuzzy msgid "Version" msgstr "Verzia: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 #, fuzzy msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Pouitie: sonata [OPTION]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Voby" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Zobraz tento pomocnk a ukoni" #: .././sonata/cli.py:107 #, fuzzy msgid "Popup song notification (requires D-Bus)" msgstr "Vyskakovacie oznmenie skladby (potrebuje DBus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Prepna, ak je aplikcia minimalizovan" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "v systmovej oblasti, alebo viditen (potrebn D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Zobraz informcie o verzii a skon" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Spusti aplikciu skryt (potrebn systray)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Spusti aplikciu viditen (potrebn systray)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Spusti s profilom [NUM]" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Komentr" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Prehra skladbu v playliste" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pozastavi prehrvan skladbu" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Zastavi prehrvan skladbu" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Prehra aliu skladbu v playliste" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Prehra predchdzajcu skladbu v playliste" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Zmeni prehrvanie/pauza; hraje ke je zastaven" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Prepn do mdu opakovanie" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Prepn do nhodnho mdu" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Zobrazi informcie o aktulnej skladbe" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Zobrazi stav MPD" #: .././sonata/cli.py:134 #, fuzzy, python-format msgid "Starting Sonata with profile %s..." msgstr "Spusti Sonatu s profilom" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, fuzzy, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Neplatn slo profilu. slo profilu mus by medzi 1 a" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Prednastaven profil" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "od" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "z" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Nie je mon sa spoji s MPD.\n" "Prosm skontrolujte nastavenie Sonaty, alebo premenn prostredie MPD_HOST/" "MPD_PORT." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Nzov" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Umelec" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Dtum" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Stopa" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "ner" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Sbor" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "as" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Dtov tok" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD zastaven" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Stav" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Prehrvanie" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pozastaven" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Zastaven" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Opakova" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Off" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "On" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Nhodne" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Hlasitos" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Prelnanie" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekunda" msgstr[1] "sekundy" msgstr[2] "sekund" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonata zlyhala pri spojovan s D-BUS session bus: Nie je mon uri adresu " "sprvy bus (skste 'man dbus-launch a 'man dbus-daemon' pre pomocnka)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Spusti Sonatu s profilom" #: .././sonata/dbus_plugin.py:100 #, fuzzy msgid "Maybe Sonata is not running?" msgstr "Jedna intancia Sonaty je u spusten." #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Jedna intancia Sonaty je u spusten." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Informcie o skladbe" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Prejs na umelca vo Wikipedii" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Prejs na album vo Wikipedii" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Prepn dodaton tagy" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Uloi playlist do" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Text skladby" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Hada texty na Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Informcie o albume" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "viac" #: .././sonata/info.py:215 msgid "hide" msgstr "skry" #: .././sonata/info.py:281 msgid "edit tags" msgstr "upravi tagy" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Informcie o albume nie s dostupn." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Meno albumu nie je nastaven" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI nie je dostupn, zskavanie textov bude vypnut." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Umelec alebo meno skladby nie je nastaven" #: .././sonata/info.py:371 msgid "search" msgstr "hada" #: .././sonata/info.py:372 #, fuzzy msgid "edit" msgstr "upravi tagy" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Text nie je dostupn" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Zskavam text..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Nie je mon sa pripoji k LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Zskavanie textu zlyhalo" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Bez tagov" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Rzny umelci" #: .././sonata/library.py:49 msgid "Filename" msgstr "Meno sboru" #: .././sonata/library.py:49 msgid "Everything" msgstr "Vetko" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Systm sborov" #: .././sonata/library.py:53 #, fuzzy msgid "Artists" msgstr "Umelec" #: .././sonata/library.py:54 #, fuzzy msgid "Albums" msgstr "Album" #: .././sonata/library.py:55 #, fuzzy msgid "Genres" msgstr "ner" #: .././sonata/library.py:84 #, fuzzy msgid "Search terms" msgstr "Upravi hadan vraz" #: .././sonata/library.py:90 #, fuzzy msgid "End Search" msgstr "_Ukoni hadanie" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Prehliadanie kninice" #: .././sonata/library.py:96 #, fuzzy msgid "Search" msgstr "_Hada" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "skladba" msgstr[1] "skladby" msgstr[2] "skladeb" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" msgstr[1] "minuty" msgstr[2] "minut" #: .././sonata/library.py:849 #, fuzzy msgid "Song" msgstr "skladba" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Cesta" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Aktulny" #: .././sonata/main.py:103 msgid "Library" msgstr "Kninica" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Playlisty" #: .././sonata/main.py:105 msgid "Streams" msgstr "Streamy" #: .././sonata/main.py:106 msgid "Info" msgstr "Informcie" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Cel skladba" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "Zora_di sznam" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Uloi playlist do" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Spojenie" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Pr_ehra po" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Aktualizova" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Poui _vzdialen obrzok..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Poui _loklny obrzok..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 #, fuzzy msgid "Reset Image" msgstr "Otvori obrzok" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Play" #: .././sonata/main.py:244 #, fuzzy msgid "Pa_use" msgstr "Pau_za" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stop" #: .././sonata/main.py:246 #, fuzzy msgid "Pre_vious" msgstr "_Predchdzajcu" #: .././sonata/main.py:247 msgid "_Next" msgstr "_aliu" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Ukoni" #: .././sonata/main.py:249 msgid "_Remove" msgstr "Z_maza" #: .././sonata/main.py:250 msgid "_Clear" msgstr "Zmaza _vetko" #: .././sonata/main.py:251 #, fuzzy msgid "_Entire Library" msgstr "_Aktualizova kninicu" #: .././sonata/main.py:252 #, fuzzy msgid "_Selected Items" msgstr "Prida vybran poloky" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Nastavenie" #: .././sonata/main.py:254 msgid "_About..." msgstr "_O Sonate" #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "Upravi _tagy" #: .././sonata/main.py:256 msgid "_Add" msgstr "Pr_ida" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Prepsa" #: .././sonata/main.py:258 msgid "Add" msgstr "Pridat" #: .././sonata/main.py:259 msgid "Replace" msgstr "Prepsa" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "Z_maza..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Zamiea" #: .././sonata/main.py:286 #, fuzzy msgid "S_how Sonata" msgstr "_Zobrazi Sonatu" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "Opa_kova" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "N_hodne" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Poda umelca" #: .././sonata/main.py:429 msgid "By Album" msgstr "Poda albumu" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Poda nzvu skladby" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Poda mena sboru" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Poda mena sboru a prieinku" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Obrti zoznam" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "No_v..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "Up_ravi..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "Pre_menova..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Playlist" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Klikni pre rozren zobrazenie" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Klikni pre kompaktn zobrazenie" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Nepripojen" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Chba prvo na tanie" #: .././sonata/main.py:645 #, fuzzy msgid "Cover Art" msgstr "_Obrázek alba" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Odpoji" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Rok" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Stream" #: .././sonata/main.py:1193 msgid "Len" msgstr "Dka" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Neznmy" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "de" msgstr[1] "dny" msgstr[2] "dn" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "hodina" msgstr[1] "hodiny" msgstr[2] "hodin" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "a" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(aktualizuje sa mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Hadanie textu" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Hada" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Meno umelca" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Nzov skladby" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Otvori obrzok" #: .././sonata/main.py:2379 msgid "Images" msgstr "Obrzky" #: .././sonata/main.py:2383 msgid "All files" msgstr "Vetky sbory" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Vybra obrzok albumu" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "_Vybra" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Upravi hadan vraz" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Meno umelca alebo albumu nie je dostupn" #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Obrzok albumu nie je dostupn" #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Zmaza vybran playlist?" msgstr[1] "Smazat vybran playlisty?" msgstr[2] "Smazat vybran playlisty?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Zmaza playlist" msgstr[1] "Smazat playlisty" msgstr[2] "Smazat playlisty" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Zmaza vybran stream?" msgstr[1] "Smazat vybran streamy?" msgstr[2] "Smazat vybran streamy?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Zmaza stream" msgstr[1] "Smazat streamy" msgstr[2] "Smazat streamy" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Pre uloenie textu do prieinka s hudbou muste uvies jeho platn nzov." #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Overenie prieinku s hudbou" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Pre uloenie obrzku do prieinku s hudbou muste uvies platn prieinok s " "hudbou" #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "alba" msgstr[2] "alb" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "umelec" msgstr[1] "umlci" msgstr[2] "umlc" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "de blaha" msgstr[1] "dny blaha" msgstr[2] "dn blaha" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "hodina blaha" msgstr[1] "hodiny blaha" msgstr[2] "hodin blaha" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Uloi playlist" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Prajete si prepsa existujci playlist alebo prida tieto skladby?" #: .././sonata/playlists.py:120 #, fuzzy msgid "Existing Playlist" msgstr "Playlist" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Prepsa playlist" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Prida skladby" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Playlist s tmto menom u existuje. Prajete si ho prepsa?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Meno playlistu" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Premenova playlist" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Systmov oblas" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Vavo hore" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Vpravo hore" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Vavo dole" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Vpravo dole" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Stred obrazovky" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "Pripojenie k MPD" #: .././sonata/preferences.py:76 #, fuzzy msgid "_Name" msgstr "Meno" #: .././sonata/preferences.py:79 #, fuzzy msgid "_Host" msgstr "Host" #: .././sonata/preferences.py:82 #, fuzzy msgid "_Port" msgstr "Port" #: .././sonata/preferences.py:86 #, fuzzy msgid "_Music dir" msgstr "Prieinok s hudbou" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:91 #, fuzzy msgid "Pa_ssword" msgstr "Heslo" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Necha przdne, ak netreba heslo." #: .././sonata/preferences.py:95 #, fuzzy msgid "_Autoconnect on start" msgstr "Automaticky pripoji pri spusten" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Pouvam MPD_HOST/PORT" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Naviac" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 #, fuzzy msgid "_Username:" msgstr "Uvatesk meno:" #: .././sonata/preferences.py:171 #, fuzzy msgid "_Password:" msgstr "Heslo:" #: .././sonata/preferences.py:188 #, fuzzy msgid "Popup _notification on song changes" msgstr "Vyskakovacie oznmenie pri zmene skladby" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Dka prechodu" #: .././sonata/preferences.py:211 #, fuzzy msgid "_Fade length" msgstr "Dka prechodu" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sec" #: .././sonata/preferences.py:218 #, fuzzy msgid "C_rossfade" msgstr "Prelnanie" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Zobrazenie" #: .././sonata/preferences.py:251 #, fuzzy msgid "_Album art" msgstr "Meno albumu" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standardn" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "tylizovan" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "tl obrzku albumu:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Iba loklne" #: .././sonata/preferences.py:258 #, fuzzy msgid "Local and remote" msgstr "Loklny, potom vzdialen" #: .././sonata/preferences.py:260 #, fuzzy msgid "Search locations:" msgstr "Poradie hadania:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 msgid "custom" msgstr "vlastn" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Uloi obrzok albumu ako:" #: .././sonata/preferences.py:277 #, fuzzy msgid "_Playback/volume buttons" msgstr "Povoli tlatka prehrvan a hlasitosti" #: .././sonata/preferences.py:280 #, fuzzy msgid "Pr_ogressbar" msgstr "Zapn litu priebehu" #: .././sonata/preferences.py:283 #, fuzzy msgid "_Statusbar" msgstr "Zapn stavov riadok" #: .././sonata/preferences.py:286 #, fuzzy msgid "Song Ly_rics" msgstr "Text skladby" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Uloi text do" #: .././sonata/preferences.py:297 #, fuzzy msgid "System _tray icon" msgstr "Systmov oblas" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Chovanie okna" #: .././sonata/preferences.py:323 #, fuzzy msgid "_Show window on all workspaces" msgstr "Zobrazi okno na vetkch plochch" #: .././sonata/preferences.py:326 #, fuzzy msgid "_Keep window above other windows" msgstr "Podra okno nad ostatnmi oknami" #: .././sonata/preferences.py:329 #, fuzzy msgid "_Hide window titlebar" msgstr "Titulok okna:" #: .././sonata/preferences.py:334 #, fuzzy msgid "_Minimize to system tray on close/escape" msgstr "Skry do systmovej oblasti pri zavret" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Ak je zapnut, pri zatvoren bude Sonata iba minimalizovan do systmovej " "oblasti. Momentlne nemono zisti, i je k dispozcii systmov oblas, " "preto sa uistite, e je mon systmov oblas poui." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Rzne" #: .././sonata/preferences.py:354 #, fuzzy msgid "_Update MPD library on start" msgstr "Aktualizova kninicu MPD pri spusten" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Ak je zapnut, Sonata bude automaticky aktualizova kninicu MPD pri " "spusten." #: .././sonata/preferences.py:358 #, fuzzy msgid "S_top playback on exit" msgstr "Zastavi prehrvanie pri vypnut" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD umouje prehrvanie i ke klient nie je spusten. Pokia je tato voba " "zapnut, Sonata sa me sprva ako ben prehrvae a zastavi prehrvanie " "pri ukonen." #: .././sonata/preferences.py:362 #, fuzzy msgid "_Write status file:" msgstr "Zapsa stav do sboru:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Ak je zapnut, Sonata vytvor xmms-infopipe ako sbor obsahujci informcie " "o aktulnej skladbe. Mnoho aplikci sbor xmms-info podporuje (Instant " "messenger, IRC klienti...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Formt skladby" #: .././sonata/preferences.py:397 #, fuzzy msgid "C_urrent playlist:" msgstr "Aktulny playlist" #: .././sonata/preferences.py:398 #, fuzzy msgid "_Library:" msgstr "Kninica:" #: .././sonata/preferences.py:399 #, fuzzy msgid "_Window title:" msgstr "Titulok okna:" #: .././sonata/preferences.py:400 #, fuzzy msgid "Current _song line 1:" msgstr "Aktulna skladba, riadok 1:" #: .././sonata/preferences.py:402 #, fuzzy msgid "Current s_ong line 2:" msgstr "Aktulna skladba, riadok 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Dostupn voby" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Meno umelca" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Meno albumu" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Meno stopy" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "slo stopy" #: .././sonata/preferences.py:430 #, fuzzy msgid "Disc number" msgstr "slo disku" #: .././sonata/preferences.py:433 #, fuzzy msgid "File path" msgstr "cesta_k_sboru" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Meno sboru" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Meno streamu" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Dka skladby" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Uplynul as (iba v nzve)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Informcie zobrazen len ke s vetky priloen tagy definovan" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Vytvor stpce v aktulnom playliste" #: .././sonata/preferences.py:473 #, fuzzy msgid "_About" msgstr "_O Sonate" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "" #: .././sonata/preferences.py:521 msgid "Description" msgstr "" #. Set up table #: .././sonata/preferences.py:532 #, fuzzy msgid "MPD" msgstr "_MPD" #: .././sonata/preferences.py:534 #, fuzzy msgid "Behavior" msgstr "_Chovanie" #: .././sonata/preferences.py:535 #, fuzzy msgid "Format" msgstr "_Formt" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Nov profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Vlastn obrzok albumu" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Meno obrzku albumu" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Upravi stream" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Nov stream" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL streamu" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Stream s tmto menom u existuje. Chcete ho prepsa?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" "Knihovna taglib nebo tagpy nie je dostupn, podpora pravy tagov vypnut." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Upravi tagy" #: .././sonata/tagedit.py:70 #, fuzzy msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" "Knihovna taglib nebo tagpy nie je dostupn, podpora pravy tagov vypnut." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Cesta" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "neexistuje. Prosm zadajte platn prieinok s hudbou v nastaven." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Sbor" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "neexistuje. Prosm zadajte platn prieinok s hudbou v nastaven." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Nie s dostupn sbory s upravitenmi tagmi." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Komentr" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Uloi _Vetko" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Prida kad vybran hudobn sbor, zaiatok od stopy 1 pre tento sbor." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Poui na vetky vybran hudobn sbory" #: .././sonata/tagedit.py:260 msgid "of" msgstr "z" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Nie je mon uloi tag do hudobnho sboru" #: .././sonata/tagedit.py:366 #, fuzzy msgid "Hide file path" msgstr "cesta_k_sboru" #: .././sonata/tagedit.py:369 #, fuzzy msgid "Show file path" msgstr "cesta_k_sboru" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Parameter potrebuje D-Bus. Ru sa.+" #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Aktualizova" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Webov strnka: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Povoli Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Zapn prelnanie" #~ msgid "Enable album art" #~ msgstr "Povoli obrzok albumu" #~ msgid "Enable lyrics" #~ msgstr "Povoli text skladieb" #~ msgid "Enable system tray icon" #~ msgstr "Povoli ikonu v systmovej oblasti" #~ msgid "_Display" #~ msgstr "_Zobrazenie" #~ msgid "_Extras" #~ msgstr "_Naviac" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 alebo gnome-python-extras neboli njden, podpora systmov " #~ "oblasti vypnut." #~ msgid "Reset to Default" #~ msgstr "Nastavi na pvodn" #~ msgid "_New Playlist..." #~ msgstr "_Nov playlist" #~ msgid "Notification" #~ msgstr "Oznamovnie" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 alebo python-elementtree bol njden, podpora pre " #~ "audioscrobbler vypnut." #~ msgid "Audioscrobbler Verification" #~ msgstr "Overenie Audioscrobbleru" #~ msgid "Update library for selected item(s)" #~ msgstr "Aktualizova kninicu pre vybran poloky" #~ msgid "_Shuffle" #~ msgstr "_Zamíchat" #~ msgid "Toggle shuffle mode" #~ msgstr "Přepnout mód míchání" #, fuzzy #~ msgid "not found. Exiting..." #~ msgstr "Slova nejsou dostupná" #~ msgid "Add to _Queue" #~ msgstr "Přidat do _fronty" #~ msgid "Remove from _Queue" #~ msgstr "Odstranit z _fronty" #~ msgid "seconds" #~ msgstr "sekund" #~ msgid "Not connected" #~ msgstr "Odpojeno" #~ msgid "Press enter to search for these terms." #~ msgstr "Stiskněte enter pro hledání tohoto výrazu." #~ msgid "Add new profile" #~ msgstr "Přidat nový profil" #~ msgid "Remove current profile" #~ msgstr "Smazat aktuální profil" #~ msgid "Play enqueued files on activate" #~ msgstr "Přehrát zařazené soubory při aktivaci" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Automaticky přehrát zařazené položky pokud jsou aktivovány dvojitým " #~ "kliknutím nebo entrem." #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Přidat vybrané skladby do playlistu" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Smazat vybrané skladby z playlistu" #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Přidat vybrané skladby nebo adresáře" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Přepsat vybranými skladbami nebo adresáři" #~ msgid "Song Info..." #~ msgstr "Informace o skladbě..." #~ msgid "Click to collapse the player" #~ msgstr "Klikni pro kompaktní zobrazení" #~ msgid "Click to expand the player" #~ msgstr "Klikni pro rozšířené zobrazení" #~ msgid "_Song Info" #~ msgstr "Informace o _skladbě" #~ msgid "_Search..." #~ msgstr "_Hledat..." #~ msgid "Remote only" #~ msgstr "Pouze vzdálený" #~ msgid "Remote, then local" #~ msgstr "Vzdálený, poté lokální" #~ msgid "To save artwork as" #~ msgstr "Pro uložení obrázku alba jako" #~ msgid "Artwork Verification" #~ msgstr "Ověření obrázku alba" #~ msgid "Switch to current playlist" #~ msgstr "Přepnout na aktuální playlist" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/sl.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000116152�11255764730�0014560�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: sonata 1.5.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-04-12 20:16+0100\n" "Last-Translator: Alan Pepelko <alan.pepelko@gmail.com>\n" "Language-Team: Slovenian <sl@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-SourceCharset: utf-8\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "O Sonati" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "Nastavitve" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Celozaslonski način prikaza naslovnice" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Preklopi na [1st-5th] zavihek" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Vzpostavi povezavo z MPD-jem" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Prekini povezavo z MPD-jem" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Premešaj trenutni seznam predvajanja" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Razširi predvajalnik" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Preklopi na prejšnji zavihek" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Preklopi na naslednji zavihek" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Zožaj predvajalnik" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "Išči po zbirki" #: .././sonata/about.py:64 msgid "Quit" msgstr "Končaj" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Posodobi celotno zbirko" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Prikaži popup meni" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Pomanjšaj v sistemski pult (če je omogočeno)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Predhodna sled" #: .././sonata/about.py:70 msgid "Next track" msgstr "Naslednja sled" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Predvajaj/Premor" #: .././sonata/about.py:72 msgid "Stop" msgstr "Ustavi" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Tišje" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Glasneje" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Predvajaj izbrano skladbo" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Odstrani izbrane skladbe" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Trenutno predvajano skladbo postavi v sredino" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Uredi oznake izbrane skladbe" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Shrani v nov seznam predvajanja" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Počisti seznam" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Premešaj seznam" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Dodaj izbrane skladbe ali vnesi imenik" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Pojdi na starševski imenik" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Dodaj izbrane predmete" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Zamenjaj z izbranimi predmeti" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Dodaj izbrane predmete in predvajaj" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Zamenjaj z izbranimi predmeti in predvajaj" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Posodobi izbrane predmete/poti" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Dodaj izbrane sezname predvajanja" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Odstrani izbrane sezname predvajanja" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Zamenjaj z izbranimi seznami predvajanja" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Dodaj izbrane sezname predvajanja in predvajaj" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Zamenjaj z izbranimi seznami predvajanja in predvajaj" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Dodaj izbrane pretoke" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Odstrani izbrane pretoke" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Zamenjaj z izbranimi pretoki" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Dodaj izbrane tokove in predvajaj" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Zamenjaj z izbranimi tokovi in predvajaj" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Uredi oznake predvajane skladbe" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Glavne bližnjice" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Bližnjice predvajanja" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Trenutne bližnjice" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Bližnjice zbirke" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Bližnjice seznama predvajanja" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Bližnjice pretokov" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Bližnjice informacij" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Bližnjice" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "Elegantni glasbeni odjemalec za MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Bližnjice" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Ne morem zagnati primernega brskalnika." #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Zaženi brskalnik" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Argumenta 'toggle' in 'popup' zahtevata D-Bus. Prekinitev." #: .././sonata/cli.py:97 msgid "Version" msgstr "Različica" #: .././sonata/cli.py:98 msgid "Website" msgstr "Spletna stran" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Uporaba: sonata [MOŽNOST] ... [UKAZ] ..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Možnosti" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Pokaži pomoč in končaj z delom" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Popup obvestilo o skladbi (zahteva D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "v pult ali vidno (zahteva D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Pokaži podatke o različici in končaj z delom" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Zaženi aplikacijo skrito (zahteva systray)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Zaženi aplikacijo vidno (zahteva systray)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Začni s profilom [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Ukazi" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Predvajaj skladbo v seznamu predvajanja" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Premor trenutno predvajane skladbe" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Ustavi trenutno predvajano skladbo" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Predvajaj naslednjo skladbo na seznamu" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Predvajaj prejšnjo skladbo na seznamu" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Nastavi ponavljajoče predvajanje" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Vklopi/izklopi naključno predvajanje" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Prikaži informacije o trenutni skladbi" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Prikaži stanje MPD-ja" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Zaganjanje Sonate s profilom %s ..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "Številka profila %d ne obstaja." #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Številke profilov morajo biti med 1 in %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python ne more interpretirati %s kot števila." #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "Privzeti profil" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr "od" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "z albuma" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "Ne morem se povezati z MPD-jem.\n" "Prosim, preverite vaše nastavitve Sonate ali spremenljivke okolja MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Naslov" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Izvajalec" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "Datum" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Sled" #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Žanr" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Datoteka" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "Čas" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitna hitrost" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD je ustavljen" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "Stanje" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Predvajanje" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Premor" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "Zaustavljen" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "Ponovi" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "Izključeno" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "Vključeno" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "Naključno" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Glasnost" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Prelivanje" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekunda" msgstr[1] "sekundi" msgstr[2] "sekunde" msgstr[3] "sekund" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Sonata ni mogla vzpostaviti povezave z D-BUS bus sejo: nemogoče je določiti naslov bus sporočil (za pomoč poskusite 'man dbus-launch' in 'man dbus-daemon')" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Oddaljenih ukazov ni bilo mogoče zagnati." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "" #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Morda Sonata ni zagnana?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata je že zagnana. Prikaz ..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Oddaljenega ukaza ni bilo mogoče zagnati." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Podatki o skladbi" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Odpri izvajalca v Wikipediji" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Odpri album v Wikipediji" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Vključi dodatne oznake" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Uredi oznake skladbe" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Besedilo skladbe" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Preišči Lyricwiki.org za besedilo skladbe" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Uredi besedilo skladbe na Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Informacije o albumu" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "več" #: .././sonata/info.py:215 msgid "hide" msgstr "skrij" #: .././sonata/info.py:281 msgid "edit tags" msgstr "uredi oznake" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Informacije o albumu niso bile najdene." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Naslov albuma ni določen." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI ni bil najden. Podpora za pridobivanje besedil skladb izključena." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Izvajalec ali naslov skladbe ni določen." #: .././sonata/info.py:371 msgid "search" msgstr "išči" #: .././sonata/info.py:372 msgid "edit" msgstr "uredi" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Besedila skladbe ni mogoče najti" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Prenašanje besedila skladbe ..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Povezava z LyricWiki ni uspela" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Prejemanje besedila skladbe je spodletelo" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Neoznačen" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Različni izvajalci" #: .././sonata/library.py:49 msgid "Filename" msgstr "Ime datoteke" #: .././sonata/library.py:49 msgid "Everything" msgstr "Vse" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Datotečni sistem" #: .././sonata/library.py:53 msgid "Artists" msgstr "Izvajalci" #: .././sonata/library.py:54 msgid "Albums" msgstr "Albumi" #: .././sonata/library.py:55 msgid "Genres" msgstr "Žanri" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Iskalni nizi" #: .././sonata/library.py:90 msgid "End Search" msgstr "Konec iskanja" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Pogled brskanja po zbirki" #: .././sonata/library.py:96 msgid "Search" msgstr "Iskanje" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "skladba" msgstr[1] "skladbi" msgstr[2] "skladbe" msgstr[3] "skladb" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" msgstr[1] "minuti" msgstr[2] "minute" msgstr[3] "minut" #: .././sonata/library.py:849 msgid "Song" msgstr "Skladba" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "Pot" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Trenutno" #: .././sonata/main.py:103 msgid "Library" msgstr "Zbirka" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Seznami predvajanja" #: .././sonata/main.py:105 msgid "Streams" msgstr "Pretoki" #: .././sonata/main.py:106 msgid "Info" msgstr "Podrobnosti" #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Celotna skladba" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Sortiraj seznam" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "S_hrani listo v" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Povezava" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "P_redvajaj po" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "_Posodobi" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Uporabi _oddaljeno sliko ..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Uporabi _lokalno sliko ..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Celozaslonski način" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Ponastavi sliko" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Predvajaj" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "_Premor" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Ustavi" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "_Prejšnja" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Naslednja" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Izhod" #: .././sonata/main.py:249 msgid "_Remove" msgstr "Odst_rani" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Počisti" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "c_elotno zbirko" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "i_zbrane predmete" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Nastavitve ..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_O programu ..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Uredi oznake ..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Dodaj" #: .././sonata/main.py:257 msgid "_Replace" msgstr "_Zamenjaj" #: .././sonata/main.py:258 msgid "Add" msgstr "Dodaj" #: .././sonata/main.py:259 msgid "Replace" msgstr "Zamenjaj" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Izbriši ..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Premešaj" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "_Pokaži Sonato" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Ponovi" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "Naključ_no" #: .././sonata/main.py:428 msgid "By Artist" msgstr "po izvajalcu" #: .././sonata/main.py:429 msgid "By Album" msgstr "po albumu" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "po naslovu skladbe" #: .././sonata/main.py:431 msgid "By File Name" msgstr "po imenu datoteke" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "po imeniku in imenu datoteke" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Obrni seznam predvajanja" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "_Nova ..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Uredi ..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "P_reimenuj ..." #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "Seznam predvajanja" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "Kliknite, da razširite" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Kliknite, da zožate" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "Ni povezave" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Ni dovoljenja za branje" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Naslovnica" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_GOSTITELJ/VRATA" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "Prekinitev povezave" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Leto" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Pretok" #: .././sonata/main.py:1193 msgid "Len" msgstr "Len" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Neznan" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "dan" msgstr[1] "dneva" msgstr[2] "dnevi" msgstr[3] "dni" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "ura" msgstr[1] "uri" msgstr[2] "ure" msgstr[3] "ur" #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr "in" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(posodabljam mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Išči besedilo pesmi" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Iskanje" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Izvajalec" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Skladba" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Odpri sliko" #: .././sonata/main.py:2379 msgid "Images" msgstr "Slike" #: .././sonata/main.py:2383 msgid "All files" msgstr "Vse datoteke" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Izberite naslovnico" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "_Izberi" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Uredi iskalni niz" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Izvajalec ali naslov albuma nista bila najdena." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Nobena naslovnica ni bila najdena" #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Izbrišem izbrani seznam predvajanja?" msgstr[1] "Izbrišem izbrana seznama predvajanja?" msgstr[2] "Izbrišem izbrane sezname predvajanja?" msgstr[3] "Izbrišem izbrane sezname predvajanja?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Izbriši seznam predvajanja" msgstr[1] "Izbriši seznama predvajanja" msgstr[2] "Izbriši sezname predvajanja" msgstr[3] "Izbriši sezname predvajanja" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Izbrišem izbrani pretok?" msgstr[1] "Izbrišem izbrana pretoka?" msgstr[2] "Izbrišem izbrane pretoke?" msgstr[3] "Izbrišem izbrane pretoke?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Izbriši pretok" msgstr[1] "Izbriši pretoka" msgstr[2] "Izbriši pretoke" msgstr[3] "Izbriši pretoke" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "Določiti morate veljaven glasbeni imenik, da bi lahko shranili besedilo skladbe v imenik glasbene datoteke. " #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Preverjanje verodostojnosti glasbenega imenika" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "Določiti morate veljaven glasbeni imenik, da bi lahko shranili naslovnico v imenik glasbene datoteke." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "albuma" msgstr[2] "albumi" msgstr[3] "albumov" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "izvajalec" msgstr[1] "izvajalca" msgstr[2] "izvajalci" msgstr[3] "izvajalcev" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "dan blaženosti" msgstr[1] "dneva blaženosti" msgstr[2] "dnevi blaženosti" msgstr[3] "dni blaženosti" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "ura blaženosti" msgstr[1] "uri blaženosti" msgstr[2] "ure blaženosti" msgstr[3] "ur blaženosti" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Shrani seznam predvajanja" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Želite zamenjati obstoječi seznam predvajanja ali dodati skladbe?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Obstoječ seznam predvajanja" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Zamenjaj seznam predvajanja" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Dodaj skladbe" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Seznam predvajanja s tem imenom že obstaja. Bi ga želeli zamenjati?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Ime seznama predvajanja" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Preimenuj seznam predvajanja" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "sistemski pult" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "zgoraj levo" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "zgoraj desno" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "spodaj levo" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "spodaj desno" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "sredina zaslona" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD povezava" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "I_me" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "G_ostitelj" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "V_rata" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "_Glasbeni imenik" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Izberite glasbeni imenik" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "Ge_slo" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Pustite prazno, če ni zahtevano geslo." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "S_amodejno poveži ob zagonu" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Uporabljam MPD_HOST/PORT" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "Dodatno" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "Pošiljanje skladb na Last.fm" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Uporabniško ime:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Geslo:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "Popup o_bvestilo ob spremembi skladbe" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Trajanje pojemanja" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "_Trajanje pojemanja" #: .././sonata/preferences.py:213 msgid "sec" msgstr "sek." #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "P_relivanje" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "Prikaži" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "N_aslovnica" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standardno" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Stilizirano" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Slog naslovnice:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "samo krajevno" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Lokalno, nato oddaljeno" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Išči lokacije:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 msgid "custom" msgstr "po meri" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Shrani naslovnico v:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "Gumb _predvajanja/glasnosti" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "Vrsti_ca napredka" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "Vrstica stanja" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "Besedilo skladbe" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Shrani besedilo skladbe v:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "Ikona sistemskega pulta" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Obnašanje oken" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "Prikaži okno na v_seh delovnih površinah" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "Obdrži o_kno nad drugimi okni" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "Skrij _nazivno vrstico okna" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "Po_manjšaj v sistemski pult ob zaprtju/izhodu" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "Če je omogočeno, se bo Sonata ob izhodu pomanjšala v sistemski pult. Podite pozorni na to, da je trenutno nemogoče zaznati, ali je sistemski pult dejansko omogočen, zato označite to možnost, če res deluje." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Razno" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "Ob zagon_u posodobi MPD zbirko" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "Če je omogočeno, bo Sonata ob zagonu samodejno posodobila MPD zbirko." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "Ob izhodu us_tavi predvajanje" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD omogoča predvajanje tudi, ko je odjemalec ustavljen. Če je omogočeno, bo Sonata delovala kot običajni predvajalnik glasbe in ustavila predvajanje ob izhodu iz programa." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "Zapiši _datoteko stanja:" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "Če je omogočeno, bo Sonata ustvarila datoteko podobno xmms-infopipe, ki vsebuje informacije o trenutni skladbi. Veliko aplikacij podpira datoteko xmms-info (takojšnji sporočilniki, IRC odjemalci ...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Način prikaza skladb" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "Tren_utni seznam predvajanja:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Zbirka:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "Nazi_v okna:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "1. vr_stica trenutne skladbe:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "2. vr_stica trenutne skladbe:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Razpoložljive možnosti" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Ime izvajalca" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Naslov albuma" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Naslov skladbe" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Številka sledi" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Številka diska" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Pot do datoteke" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Ime datoteke" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "Ime pretoka" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Trajanje skladbe" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Ocenjen čas (samo naslov)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Informacije so prikazane le, če so vse vključene oznake definirane" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Ustvari stolpce v trenutnem seznamu predvajanja" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_O programu" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Prikroji ..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Naloženo" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Opis" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Obnašanje" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Oblika" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Nov profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Poljubna naslovnica" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Ime datoteke naslovnice" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Uredi pretok" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "Nov pretok" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL pretoka" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Pretok s tem imenom že obstaja. Bi ga želeli zamenjati?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Taglib in/ali tagpy nista bila najdena. Podpora za urejanje oznak izključena." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Uredi oznake" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Različica tagpy-ja je manjša od 0.91. Prosimo, nadgradite jo na novejšo različico. Podpora za urejanje oznak izključena." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Pot" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "ne obstaja. Prosim, v nastavitvah določite veljaven glasbeni imenik." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Datoteka" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " ni najden. Prosim, v nastavitvah določite veljaven glasbeni imenik." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Najdena ni bila nobena glasbena datoteka z možnostjo urejanja oznak." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Komentar" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Shrani _vse" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Uveljavi vsem izbranim glasbenim datotekam." #: .././sonata/tagedit.py:260 msgid "of" msgstr "od" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Nisem mogel shraniti oznak v glasbeno datoteko." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Skrij pot do datoteke" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Pokaži pot do datoteke" #~ msgid "_Update Path" #~ msgstr "_Posodobi pot" #~ msgid "Enable Audioscrobbler" #~ msgstr "Omogoči Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Omogoči prelivanje" #~ msgid "Enable album art" #~ msgstr "Omogoči naslovnico" #~ msgid "Enable lyrics" #~ msgstr "Omogoči besedilo skladbe" #~ msgid "Enable system tray icon" #~ msgstr "Omogoči ikono v sistemski vrstici" #~ msgid "_Display" #~ msgstr "_Prikaz" #~ msgid "_Extras" #~ msgstr "_Dodatno" #, fuzzy #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Argument popup zahteva D-Bus. Prekinjam." #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 ali gnome-python-extras nista bila najdena. Podpora za " #~ "sistemski pult izključena." #~ msgid "Reset to Default" #~ msgstr "Vrni na privzeto" #~ msgid "_New Playlist..." #~ msgstr "_Nov seznam predvajanja ..." #~ msgid "_Shuffle" #~ msgstr "_Premešaj" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Spletna stran: http://sonata.berlios.de/" #~ msgid "Toggle shuffle mode" #~ msgstr "Nastavi premešano predvajanje" #~ msgid "Notification" #~ msgstr "Obvestilo" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 ali python-elementtree nista bila najdena. Podpora za " #~ "audioscrobbler izključena." #~ msgid "Audioscrobbler Verification" #~ msgstr "Preverjanje verodostojnosti audioscrobblerja" #~ msgid "Update library for selected item(s)" #~ msgstr "Posodobi zbirko za izbrane predmete" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/sv.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000120215�11255764730�0014565�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Swedish translation for sonata. # Copyright (C) 2007, 2009 Free Software Foundation, Inc. # This file is distributed under the same license as the sonata package. # Unknown translator, 2008. # Daniel Nylander <po@danielnylander.se>, 2007, 2009. # msgid "" msgstr "" "Project-Id-Version: sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-03-23 10:04+0100\n" "Last-Translator: Daniel Nylander <po@danielnylander.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Om Sonata" #: .././sonata/about.py:53 #: .././sonata/preferences.py:60 msgid "Preferences" msgstr "Inställningar" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "Omslag i helskärmsläge" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "Växla mellan flikarna [1-5]" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "Anslut till MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "Koppla från MPD" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Blanda aktuell spellista" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Fäll ut spelaren" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "Växla till föregående flik" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "Växla till nästa flik" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Fäll in spelaren" #: .././sonata/about.py:63 #: .././sonata/library.py:86 msgid "Search library" msgstr "Sök i biblioteket" #: .././sonata/about.py:64 msgid "Quit" msgstr "Avsluta" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Uppdatera hela biblioteket" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Visa popupmeny" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Minimera till aktivitetsfältet (om aktiverad)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Föregående spår" #: .././sonata/about.py:70 msgid "Next track" msgstr "Nästa spår" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Spela upp/Gör paus" #: .././sonata/about.py:72 msgid "Stop" msgstr "Stoppa" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Sänk volymen" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Höj volymen" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Spela markerad låt" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Ta bort markerade låt(ar)" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Centrera låten som spelas" #: .././sonata/about.py:79 #: .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Redigera taggar för markerad låt" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Spara som ny spellista" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Töm lista" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Blanda spellistan" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Lägg till markerade låt(ar) eller ange katalog" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Gå till föräldrakatalogen" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Lägg till markerade objekt" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Ersätt med markerade objekt" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Lägg till markerade objekt och spela upp" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Ersätt med markerade objekt och spela upp" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "Uppdatera markerade objekt/sökväg(ar)" #: .././sonata/about.py:93 #: .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Lägg till markerade spellistor" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Ta bort markerade spellistor" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Ersätt med markerade spellistor" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Lägg till markerade spellistor och spela upp" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Ersätt med markerade spellistor och spela upp" #: .././sonata/about.py:100 #: .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Lägg till markerade ström(mar)" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Ta bort markerade ström(mar)" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Ersätt med markerade ström(mar)" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Lägg till markerade ström(mar) och spela upp" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Ersätt med markerade ström(mar) och spela upp" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Redigera taggar för aktuell låt" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Allmänna genvägar" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Uppspelningsgenvägar" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Aktuella genvägar" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Biblioteksgenvägar" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Spellistgenvägar" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Strömgenvägar" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Låtinformationsgenvägar" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Genvägar" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "En elegant musikklient för MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Genvägar" #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Kunde inte starta en lämplig webbläsare." #: .././sonata/about.py:177 #: .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "Starta webbläsare" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Växlings- och popupargument kräver D-Bus. Avbryter." #: .././sonata/cli.py:97 msgid "Version" msgstr "Version" #: .././sonata/cli.py:98 msgid "Website" msgstr "Webbplats" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Användning: sonata [FLAGGA]... [KOMMANDO]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "Flaggor" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Visa den här hjälpen och avsluta" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "Popupnotifiering vid låtbyte (kräver D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Växlar huruvida programmet är minimerat" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "till brickan eller synligt (kräver D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "Starta inte program om D-Bus-kommandon misslyckas" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Visa versionsinformation och avsluta" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Starta programmet dolt (kräver systray)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Starta programmet synligt (kräver systray)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Starta med profil [NUM]" #: .././sonata/cli.py:116 msgid "Commands" msgstr "Kommandon" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Spela låt i spellistan" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Pausa för närvarande spelad låt" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Stoppa för närvarande spelad låt" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Spela nästa låt i spellistan" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Spela föregående låt i spellistan" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Växla spela/gör paus; spelar om stoppad" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Växla upprepningsläge" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "Växla blandningsläge" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Visa information om aktuell låt" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Visa MPD-status" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "Startar Sonata med profilen %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d är inte ett tillgängligt profilnummer." #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Profilnummer måste vara mellan 1 och %d." #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python kunde inte tolka %s som ett nummer." #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "Default Profile" msgstr "Standardprofil" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "by" msgstr "av" #: .././sonata/cli.py:154 #: .././sonata/main.py:179 msgid "from" msgstr "från" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "Kunde inte ansluta till MPD.\n" "Kontrollera dina inställningar i Sonata eller miljövariablerna MPD_HOST/MPD_PORT." #: .././sonata/cli.py:208 #: .././sonata/info.py:91 #: .././sonata/info.py:245 #: .././sonata/library.py:49 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "Titel" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/info.py:246 #: .././sonata/library.py:49 #: .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Artist" #: .././sonata/cli.py:210 #: .././sonata/info.py:91 #: .././sonata/info.py:247 #: .././sonata/library.py:49 #: .././sonata/main.py:1185 #: .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Album" #: .././sonata/cli.py:211 #: .././sonata/info.py:91 #: .././sonata/info.py:248 msgid "Date" msgstr "Datum" #: .././sonata/cli.py:212 #: .././sonata/info.py:91 #: .././sonata/info.py:250 #: .././sonata/main.py:1186 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "Spår" #: .././sonata/cli.py:213 #: .././sonata/info.py:91 #: .././sonata/info.py:249 #: .././sonata/library.py:49 #: .././sonata/main.py:1189 #: .././sonata/preferences.py:432 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "Genre" #: .././sonata/cli.py:214 #: .././sonata/info.py:91 #: .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Fil" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "Tid" #: .././sonata/cli.py:222 #: .././sonata/info.py:91 #: .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitfrekvens" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD stoppad" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "Tillstånd" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Spelar" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Pausad" #: .././sonata/cli.py:232 #: .././sonata/main.py:559 #: .././sonata/main.py:564 #: .././sonata/main.py:1836 #: .././sonata/main.py:1847 msgid "Stopped" msgstr "Stoppad" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "Upprepa" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "Av" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "På" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "Blanda" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Volym" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Toning" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "sekund" msgstr[1] "sekunder" #: .././sonata/current.py:64 msgid "Filter" msgstr "Filter" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Sonata misslyckades med att ansluta till D-BUS-sessionsbussen: Kunde inte fastställa adressen för meddelandebussen (prova med \"man dbus-launch\" och \"man dbus-daemon\" för hjälp)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "Misslyckades med att köra fjärrkommandon." #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "Startar Sonata istället..." #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "Kanske Sonata inte är igång?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "En instans av Sonata körs redan. Visar den..." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "Misslyckades med att köra fjärrkommando." #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Låtinformation" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Öppna artisten i Wikipedia" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Öppna albumet i Wikipedia" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Växla mellan extra taggar" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Redigera låttaggar" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Låttext" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Sök efter låttext via Lyricwiki.org" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "Redigera låttext på Lyricwiki.org" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Albuminformation" #: .././sonata/info.py:213 #: .././sonata/info.py:218 msgid "more" msgstr "mer information" #: .././sonata/info.py:215 msgid "hide" msgstr "dölj" #: .././sonata/info.py:281 msgid "edit tags" msgstr "redigera taggar" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Albuminformation hittades inte." #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Albumnamnet inte inställt." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI hittades inte, stöd för hämtning av låttexter har inaktiverats." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Artist- eller låttitel inte inställd." #: .././sonata/info.py:371 msgid "search" msgstr "sök" #: .././sonata/info.py:372 msgid "edit" msgstr "redigera" #: .././sonata/info.py:381 #: .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Låttexten hittades inte" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Hämtar låttexter..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Kunde inte ansluta till LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Hämtning av låttexter misslyckades" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Inte taggad" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Diverse artister" #: .././sonata/library.py:49 msgid "Filename" msgstr "Filnamn" #: .././sonata/library.py:49 msgid "Everything" msgstr "Allting" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Filsystem" #: .././sonata/library.py:53 msgid "Artists" msgstr "Artister" #: .././sonata/library.py:54 msgid "Albums" msgstr "Album" #: .././sonata/library.py:55 msgid "Genres" msgstr "Genrer" #: .././sonata/library.py:84 msgid "Search terms" msgstr "Söktermer" #: .././sonata/library.py:90 msgid "End Search" msgstr "Avsluta sökning" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Biblioteksbläddringsvy" #: .././sonata/library.py:96 msgid "Search" msgstr "Sök" #. Show text: #: .././sonata/library.py:761 #: .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "låt" msgstr[1] "låtar" #: .././sonata/library.py:761 #: .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "minut" msgstr[1] "minuter" #: .././sonata/library.py:849 msgid "Song" msgstr "Låt" #: .././sonata/library.py:849 #: .././sonata/main.py:1190 msgid "Path" msgstr "Sökväg" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Aktuell" #: .././sonata/main.py:103 msgid "Library" msgstr "Bibliotek" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Spellistor" #: .././sonata/main.py:105 msgid "Streams" msgstr "Strömmar" #: .././sonata/main.py:106 msgid "Info" msgstr "Låtinformation" #: .././sonata/main.py:137 #: .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Hela låten" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "_Sortera lista" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Sp_ara spellista till" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Anslutning" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "_Spela efter" #: .././sonata/main.py:238 #: .././sonata/main.py:2454 msgid "_Update" msgstr "_Uppdatera" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Använd _fjärrbild..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Använd _lokal bild..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "_Helskärmsläge" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "Återställ bild" #: .././sonata/main.py:243 msgid "_Play" msgstr "_Spela" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "_Gör paus" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Stoppa" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "Före_gående" #: .././sonata/main.py:247 msgid "_Next" msgstr "_Nästa" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Avsluta" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Ta bort" #: .././sonata/main.py:250 msgid "_Clear" msgstr "Tö_m" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "Hela _biblioteket" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "_Markerade objekt" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "_Inställningar..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_Om..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "R_edigera taggar..." #: .././sonata/main.py:256 msgid "_Add" msgstr "_Lägg till" #: .././sonata/main.py:257 msgid "_Replace" msgstr "E_rsätt" #: .././sonata/main.py:258 msgid "Add" msgstr "Lägg till" #: .././sonata/main.py:259 msgid "Replace" msgstr "Ersätt" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Ta bort..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Blanda" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "V_isa Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Upprepa" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "_Blanda" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Efter artist" #: .././sonata/main.py:429 msgid "By Album" msgstr "Efter album" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Efter låttitel" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Efter filnamn" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Efter katalog- och filnamn" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Omvänd lista" #: .././sonata/main.py:456 #: .././sonata/main.py:467 msgid "_New..." msgstr "_Ny..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "R_edigera..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Byt namn..." #: .././sonata/main.py:530 #: .././sonata/main.py:597 #: .././sonata/main.py:598 msgid "Playlist" msgstr "Spellista" #: .././sonata/main.py:560 #: .././sonata/main.py:1840 #: .././sonata/main.py:2049 msgid "Click to expand" msgstr "Klicka för att fälla ut" #: .././sonata/main.py:565 #: .././sonata/main.py:1838 #: .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Klicka för att fälla in" #: .././sonata/main.py:570 #: .././sonata/main.py:1732 #: .././sonata/main.py:1843 msgid "Not Connected" msgstr "Inte ansluten" #: .././sonata/main.py:572 #: .././sonata/main.py:1730 #: .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Saknar läsrättigheter" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "Omslagsbild" #: .././sonata/main.py:850 #: .././sonata/main.py:863 #: .././sonata/main.py:884 msgid "Profile" msgstr "Profil" #: .././sonata/main.py:863 #: .././sonata/main.py:864 #: .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_VÄRD/PORT" #: .././sonata/main.py:865 #: .././sonata/main.py:871 msgid "Disconnect" msgstr "Koppla från" #: .././sonata/main.py:1187 #: .././sonata/main.py:1194 msgid "#" msgstr "Nr" #: .././sonata/main.py:1188 #: .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "År" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Ström" #: .././sonata/main.py:1193 msgid "Len" msgstr "Speltid" #: .././sonata/main.py:1214 #: .././sonata/main.py:1221 #: .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Okänd" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "dag" msgstr[1] "dagar" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "timme" msgstr[1] "timmar" #: .././sonata/main.py:1766 #: .././sonata/main.py:1768 msgid "and" msgstr "och" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(uppdaterar mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Sök låttext" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Sök" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Artistnamn" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Låttitel" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Öppna bild" #: .././sonata/main.py:2379 msgid "Images" msgstr "Bilder" #: .././sonata/main.py:2383 msgid "All files" msgstr "Alla filer" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Välj omslagsbild" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "_Välj" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Redigera söktermer" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Inget artist- eller albumnamn hittades." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Ingen omslagsbild hittades." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Ta bort markerad spellista?" msgstr[1] "Ta bort markerade spellistor?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Ta bort spellista" msgstr[1] "Ta bort spellistor" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Ta bort markerade strömmar?" msgstr[1] "Ta bort markerade strömmar?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Ta bort ström" msgstr[1] "Ta bort strömmar" #: .././sonata/main.py:2909 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "För att spara låttexten till musikfilens katalog så måste du ange en giltig musikkatalog." #: .././sonata/main.py:2909 #: .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Verifikation av musikkatalog" #: .././sonata/main.py:2916 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "För att spara omslag till musikfilens katalog så måste du ange en giltig musikkatalog." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "album" msgstr[1] "album" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "artist" msgstr[1] "artister" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "dag av fullständig lycka." msgstr[1] "dagar av fullständig lycka." #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "timme av fullständig lycka." msgstr[1] "timmar av fullständig lycka." #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Spara spellista" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "Vill du ersätta den befintliga spellistan eller lägga till låtarna till listan?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "Befintlig spellista" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "Ersätt spellista" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "Lägg till låtar" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "En spellista med det här namnet finns redan. Vill du ersätta den?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Spellistans namn" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Byt namn på spellista" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Aktivitetsfält" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Övre vänster" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Övre höger" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Nedre vänster" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Nedre höger" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Mitten av skärmen" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD-anslutning" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "_Namn" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "_Värd" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "_Port" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "Musikkatal_og" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "Välj en musikkatalog" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "L_ösenord" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Lämna blank om inget lösenord krävs." #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "_Anslut automatiskt vid uppstart" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "Använder MPD_VÄRD/PORT" #: .././sonata/preferences.py:163 #: .././sonata/preferences.py:536 msgid "Extras" msgstr "Extrafunktioner" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "_Användarnamn:" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "_Lösenord:" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "Popup_notifiering vid låtbyte" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Toningslängd" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "Ton_ingslängd" #: .././sonata/preferences.py:213 msgid "sec" msgstr "s" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "Ko_rstoning" #. Display tab #: .././sonata/preferences.py:246 #: .././sonata/preferences.py:533 msgid "Display" msgstr "Visa" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "Album_omslag" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Standard" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Stiliserad" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Stil på omslagsbild:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Endast lokal" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "Lokal och fjärr" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "Sökplatser:" #: .././sonata/preferences.py:267 #: .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "LÅTKAT" #: .././sonata/preferences.py:269 msgid "custom" msgstr "anpassad" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Spara omslag till:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "Knappar för _uppspelning/volym" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "Förlo_ppsmätare" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "_Statusrad" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "Låt_text" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Spara låttext till:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "Aktivitets_fältsikon" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Fönsterbeteende" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "_Visa fönstret på alla arbetsytor" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "_Håll fönstret ovanför andra fönster" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "_Dölj fönstrets titellist" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "_Minimera till aktivitetsfält vid stängning" #: .././sonata/preferences.py:336 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "Om aktiverad kommer en stängning av Sonata att minimera den till meddelandefältet. Observera att det för närvarande inte är möjligt att identifiera om det verkligen finns ett meddelandefält. Använd endast den här funktionen om du har ett meddelandefält." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Diverse" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "_Uppdatera MPD-biblioteket vid uppstart" #: .././sonata/preferences.py:356 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "Om aktiverad kommer Sonata att automatiskt uppdatera ditt MPD-bibliotek när den startar upp." #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "S_toppa uppspelning vid avslut" #: .././sonata/preferences.py:360 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD tillåter uppspelning även när klienten inte är öppnad. Om aktiverad kommer Sonata att bete sig mer som en vanlig musikspelare och istället stoppa uppspelningen vid avslut." #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "S_kriv statusfil:" #: .././sonata/preferences.py:364 #: .././sonata/preferences.py:366 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "Om aktiverad kommer Sonata att skapa en xmms-infopipe-liknande fil som innehåller information om den aktuella låten. Många program har stöd för xmms-info-filer (snabbmeddelandeklienter, IRC-klienter...)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Låtformatering" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "A_ktuell spellista:" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "_Bibliotek:" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "F_önstertitel:" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "Aktuell _låt rad 1:" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "Aktuell l_åt rad 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Tillgängliga alternativ" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Artistnamn" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Albumnamn" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Spårnummer" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Spårnummer" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "Skivnummer" #: .././sonata/preferences.py:433 msgid "File path" msgstr "Filsökväg" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Filnamn" #: .././sonata/preferences.py:435 #: .././sonata/streams.py:109 msgid "Stream name" msgstr "Strömnamn" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Låtlängd" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Speltid (endast titel)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Information visas endast om alla bifogade taggar har definierats" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Skapar kolumner i den aktuella spellistan" #: .././sonata/preferences.py:473 msgid "_About" msgstr "_Om" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "_Konfigurera..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "Inläst" #: .././sonata/preferences.py:521 msgid "Description" msgstr "Beskrivning" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "Beteende" #: .././sonata/preferences.py:535 msgid "Format" msgstr "Format" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Ny profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Anpassat omslag" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Filnamn för omslagsbild" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Redigera ström" #: .././sonata/streams.py:107 #: .././sonata/streams.py:138 msgid "New Stream" msgstr "Ny ström" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "URL för ström" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "En ström med det här namnet finns redan. Vill du ersätta den?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Taglib och/eller tagpy hittades inte, stöd för taggredigering har inaktiverats." #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Redigera taggar" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "Tagpy version < 0.91. Uppgradera till en senare version, stöd för taggredigering har inaktiverats." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Sökvägen" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "finns inte. Ange en giltig musikkatalog i inställningarna." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Filen" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " finns inte. Ange en giltig musikkatalog i inställningarna." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Inga musikfiler med redigerbara taggar hittades." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Kommentar" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "Spara _alla" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Öka varje markerad musikfil, börjar med spår 1 för den här filen." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Verkställ på alla markerade musikfiler." #: .././sonata/tagedit.py:260 msgid "of" msgstr "av" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Kunde inte spara tagg till musikfil." #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "Dölj filsökväg" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "Visa filsökväg" #~ msgid "_Update Path" #~ msgstr "_Uppdatera sökväg" #~ msgid "Enable Audioscrobbler" #~ msgstr "Aktivera Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "Aktivera korstoning" #~ msgid "Enable album art" #~ msgstr "Aktivera albumomslag" #~ msgid "Enable lyrics" #~ msgstr "Aktivera låttexter" #~ msgid "Enable system tray icon" #~ msgstr "Aktivera aktivitetsfältsikon" #~ msgid "_Display" #~ msgstr "_Visa" #~ msgid "_Extras" #~ msgstr "_Extrafunktioner" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Popupargumentet kräver D-Bus. Avbryter." #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Webbplats: http://sonata.berlios.de/" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 eller gnome-python-extras hittades inte, stöd för " #~ "meddelandefält har inaktiverats." #~ msgid "Reset to Default" #~ msgstr "Återställ till standardvärden" #~ msgid "_New Playlist..." #~ msgstr "_Ny spellista..." #~ msgid "Notification" #~ msgstr "Notifiering" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 eller python-elementtree hittades inte, stöd för " #~ "audioscrobbler har inaktiverats." #~ msgid "Audioscrobbler Verification" #~ msgstr "Verifiering för Audioscrobbler" #~ msgid "Update library for selected item(s)" #~ msgstr "Uppdatera biblioteket för markerade poster" #~ msgid "_Shuffle" #~ msgstr "B_landa" #~ msgid "Toggle shuffle mode" #~ msgstr "Växla blandningsläge" #~ msgid "Not connected" #~ msgstr "Inte ansluten" #~ msgid "Press enter to search for these terms." #~ msgstr "Tryck Enter för att söka efter dessa termer." #~ msgid "Add new profile" #~ msgstr "Lägg till ny profil" #~ msgid "Remove current profile" #~ msgstr "Ta bort aktuell profil" #~ msgid "Play enqueued files on activate" #~ msgstr "Spela kölagda filer vid aktivering" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Spela automatiskt upp kölagda objekt när de aktiveras via dubbelklick " #~ "eller Enter." #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "Lägg till markerade låt(ar) eller katalog(er)" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "Ersätt med markerade låt(ar) eller katalog(er)" #, fuzzy #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Lägg till markerade spellistor" #, fuzzy #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Ta bort markerade låt(ar)?" #~ msgid "seconds" #~ msgstr "sekunder" #~ msgid "Song Info..." #~ msgstr "Låtinformation..." #~ msgid "Click to collapse the player" #~ msgstr "Klicka för att fälla in spelaren" #~ msgid "Click to expand the player" #~ msgstr "Klicka för att fälla ut spelaren" #~ msgid "_Song Info" #~ msgstr "_Låtinformation" #~ msgid "_Search..." #~ msgstr "_Sök..." #~ msgid "Remote only" #~ msgstr "Endast fjärr" #~ msgid "Remote, then local" #~ msgstr "Fjärr sedan lokal" #~ msgid "To save artwork as" #~ msgstr "För att spara omslagsbild som" #~ msgid "Artwork Verification" #~ msgstr "Verifiering av omslagsbild" #~ msgid "Switch to current playlist" #~ msgstr "Växla till aktuell spellista" #~ msgid "Toggle filter bar for jumping straight to track" #~ msgstr "Växla filterrad för hopp direkt till spår" #~ msgid "Song name" #~ msgstr "Låtnamn" #~ msgid "By" #~ msgstr "Av" #~ msgid "Enable" #~ msgstr "Aktivera" #~ msgid "Dis_play" #~ msgstr "Vis_ning" #~ msgid "songs." #~ msgstr "låtar." �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/tr.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000114626�11255764730�0014573�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Turkish translaitons for sonata package. # Copyright (C) 2008 THE sonata'S COPYRIGHT HOLDER # This file is distributed under the same license as the sonata package. # # Gökmen Görgen <gkmngrgn@gmail.com>, 2008. # Fatih Altınok <photonia@gmail.com>, 2008. # msgid "" msgstr "" "Project-Id-Version: Sonata 1.5.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2008-05-17 21:04+0200\n" "Last-Translator: Gökmen Görgen <gkmngrgn@gmail.com>\n" "Language-Team: Sonata-translations <sonata-translations@list.berlios.de>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Fatih Altınok <photonia@gmail.com>\n" "Plural-Forms: nplurals=1; plural=0;\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "Sonata Hakkında" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Tercihler" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "[1-5]'inci sekmeye geç" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "MPD'ye bağlan" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "MPD bağlantısını kes" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "Çalma listesini karıştır" #: .././sonata/about.py:59 msgid "Expand player" msgstr "Çalıcıyı genişlet" #: .././sonata/about.py:60 #, fuzzy msgid "Switch to previous tab" msgstr "[1-5]'inci sekmeye geç" #: .././sonata/about.py:61 #, fuzzy msgid "Switch to next tab" msgstr "[1-5]'inci sekmeye geç" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "Çalıcıyı daralt" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "Kitaplıkta ara" #: .././sonata/about.py:64 msgid "Quit" msgstr "Kapat" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "Tüm kütüphaneyi güncelle" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "Bilgilendirme penceresini göster" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "Sistem çekmecesine yerleş (eğer etkinse)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "Önceki şarkı" #: .././sonata/about.py:70 msgid "Next track" msgstr "Sonraki şarkı" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "Çal/Duraklat" #: .././sonata/about.py:72 msgid "Stop" msgstr "Durdur" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "Sesi azalt" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "Sesi yükselt" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "Seçili şarkıyı çal" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "Seçili şarkı(lar)ı sil" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "Çalınan şarkıyı ortaya getir" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "Seçili şarkının etiketlerini düzenle" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "Yeni çalma listesine kaydet" #: .././sonata/about.py:81 msgid "Clear list" msgstr "Listeyi temizle" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "Listeyi karıştır" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "Seçili şarkı(lar)ı ekle veya dizin gir" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "Üst dizine git" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "Seçili olan(lar)ı ekle" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "Seçili olan(lar)la değiştir" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "Seçili olan(lar)ı ekle ve çal" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "Seçili olan(lar)la değiştir ve çal" #: .././sonata/about.py:91 #, fuzzy msgid "Update selected item(s)/path(s)" msgstr "Seçili olan(lar)ı ekle" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "Seçili çalma listesini/listelerini ekle" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "Seçili çalma listesini/listelerini sil" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "Seçili şarkı listesi/listeleri ile değiştir" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "Seçili şarkı listesi/listelerini ekle ve çal" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "Seçili şarkı listesi/listeleri ile değiştir ve çal" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "Seçili yayın(lar)ı ekle" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "Seçili yayın(lar)ı sil" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "Seçili yayın(lar) ile değiştir" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "Seçili yayın(lar)ı ekle ve çal" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "Seçili yayın(lar) ile değiştir ve çal" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "Çalan şarkının etiketlerini düzenle" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "Ana Kısayollar" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "Çalma Kısayolları" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "Geçerli Kısayollar" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "Kütüphane Kısayolları" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "Çalma Listesi Kısayolları" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "Yayın Kısayolları" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "Bilgi Kısayolları" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "Kısayollar" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "MPD için zarif bir müzik istemcisi." #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "_Kısayollar" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "" #: .././sonata/cli.py:81 #, fuzzy msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Geçiş argümanı için D-Bus gerekli, durduruluyor." #: .././sonata/cli.py:97 #, fuzzy msgid "Version" msgstr "Sürüm: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 #, fuzzy msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Kullanım: sonata [OPTION]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Seçenekler" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Bu yardımı göster ve çık" #: .././sonata/cli.py:107 #, fuzzy msgid "Popup song notification (requires D-Bus)" msgstr "Bilgilendirme penceresi (DBus gerekli)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Uygulamanın sistem çekmecesine gizlenmesi" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "veya görünmesi arasında geçiş yapar (D-Bus gerekli)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Sürüm bilgisini göster ve çık" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "Uygulamayı gizli başlat (sistem çekmecesi gerekli)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "Uygulamayı görünür başlat (sistem çekmecesi gerekli)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "Profil [NUM] ile başlat" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Yorum" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Çalma listesinden şarkı çal" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Çalmakta olan şarkıyı duraklat" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Çalmakta olan şarkıyı durdur" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Çalma listesinde sonraki şarkıyı çal" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Çalma listesinde önceki şarkıyı çal" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Çal/duraklat; şarkı durmuşsa başlatır" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "Tekrarlama durumunu değiştir" #: .././sonata/cli.py:124 #, fuzzy msgid "Toggle random mode" msgstr "Tekrarlama durumunu değiştir" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Çalmakta olan şarkı bilgisini göster" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "MPD durumunu göster" #: .././sonata/cli.py:134 #, fuzzy, python-format msgid "Starting Sonata with profile %s..." msgstr "Sonata, şu profil ile başlıyor:" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, fuzzy, python-format msgid "Profile numbers must be between 1 and %d." msgstr "Geçerli bir profil numarası değil. Profil numarası aralığı, 1 - " #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "Öntanımlı Profil" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "-" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "MPD'ye bağlanılamıyor.\n" "Lütfen Sonata tercihlerinizi veya MPD_HOST/ MPD_PORT çevre değişkenlerinizi " "kontrol edin." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Şarkı" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Sanatçı" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Albüm" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Tarih" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Parça" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Tür" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Dosya" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Zaman" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Bitrate" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD durduruldu" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Durum" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Çalıyor" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Duraklatıldı" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Durduruldu" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Yinele" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Kapalı" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Açık" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Rastgele" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Ses seviyesi" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Crossfade" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "" msgstr[1] "saniye" #: .././sonata/current.py:64 msgid "Filter" msgstr "Süzgeç" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonara D-BUS oturumuna bağlanamadı: Adres belirlenemedi (yardım için 'man " "dbus-launch' ve 'man dbus-daemon'a bakın)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 #, fuzzy msgid "Starting Sonata instead..." msgstr "Sonata, şu profil ile başlıyor:" #: .././sonata/dbus_plugin.py:100 #, fuzzy msgid "Maybe Sonata is not running?" msgstr "Sonata şu an çalışıyor." #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata şu an çalışıyor." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Şarkı Bilgisi" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "Sanatçıyı Wikipedia'da arat" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "Albümü Wikipedia'da arat" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "Diğer etiketler" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "Şarkı etiketlerini düzenle" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "Şarkı sözleri" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "Lyricwiki.org'tan şarkı sözü ara" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "Albüm Bilgisi" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "daha fazla" #: .././sonata/info.py:215 msgid "hide" msgstr "gizle" #: .././sonata/info.py:281 msgid "edit tags" msgstr "etiketleri düzenle" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "Albüm bilgisi bulunamadı" #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Albüm ismi belirtilmemiş." #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI bulunamadı, şarkı sözü indirme desteği devre dışı." #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Sanatçı ya da şarkı ismi belirtilmemiş." #: .././sonata/info.py:371 msgid "search" msgstr "ara" #: .././sonata/info.py:372 #, fuzzy msgid "edit" msgstr "etiketleri düzenle" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Şarkı sözü bulunamadı" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Şarkı sözleri getiriliyor..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "LyricWiki'ye bağlanılamadı" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Şarkı sözleri getirilemedi" #: .././sonata/library.py:47 msgid "Untagged" msgstr "Etiketlenmemiş" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Çeşitli Sanatçılar" #: .././sonata/library.py:49 msgid "Filename" msgstr "Dosya adı" #: .././sonata/library.py:49 msgid "Everything" msgstr "Hepsi" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Dosya sistemi" #: .././sonata/library.py:53 #, fuzzy msgid "Artists" msgstr "Sanatçı" #: .././sonata/library.py:54 #, fuzzy msgid "Albums" msgstr "Albüm" #: .././sonata/library.py:55 #, fuzzy msgid "Genres" msgstr "Tür" #: .././sonata/library.py:84 #, fuzzy msgid "Search terms" msgstr "Arama terimlerini düzenle" #: .././sonata/library.py:90 #, fuzzy msgid "End Search" msgstr "_Aramayı Bitir" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Kütüphane arama görünümü" #: .././sonata/library.py:96 #, fuzzy msgid "Search" msgstr "_Ara" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "" msgstr[1] "şarkı" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "" msgstr[1] "dakika" #: .././sonata/library.py:849 #, fuzzy msgid "Song" msgstr "Şarkı Bilgisi" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Çalınan" #: .././sonata/main.py:103 msgid "Library" msgstr "Kütüphane" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Çalma Listeleri" #: .././sonata/main.py:105 msgid "Streams" msgstr "Yayınlar" #: .././sonata/main.py:106 msgid "Info" msgstr "Bilgi" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Tüm şarkı" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "Lis_teyi Sırala" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "Listeyi K_aydet" #: .././sonata/main.py:236 msgid "_Connection" msgstr "_Bağlantı" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "Ardından ça_l" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "_Güncelle" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "_Harici Resim Kullan" #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Y_erel Resim Kullan" #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 #, fuzzy msgid "Reset Image" msgstr "Resmi Aç" #: .././sonata/main.py:243 msgid "_Play" msgstr "Ça_l" #: .././sonata/main.py:244 #, fuzzy msgid "Pa_use" msgstr "Du_raklat" #: .././sonata/main.py:245 msgid "_Stop" msgstr "_Durdur" #: .././sonata/main.py:246 #, fuzzy msgid "Pre_vious" msgstr "_Geri" #: .././sonata/main.py:247 msgid "_Next" msgstr "İle_ri" #: .././sonata/main.py:248 msgid "_Quit" msgstr "_Kapat" #: .././sonata/main.py:249 msgid "_Remove" msgstr "_Sil" #: .././sonata/main.py:250 msgid "_Clear" msgstr "_Temizle" #: .././sonata/main.py:251 #, fuzzy msgid "_Entire Library" msgstr "Kütüphaneyi _Güncelle" #: .././sonata/main.py:252 #, fuzzy msgid "_Selected Items" msgstr "Seçili olan(lar)ı ekle" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "T_ercihler..." #: .././sonata/main.py:254 msgid "_About..." msgstr "_Hakkında..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "_Etiketleri Düzenle" #: .././sonata/main.py:256 msgid "_Add" msgstr "E_kle" #: .././sonata/main.py:257 msgid "_Replace" msgstr "Değişti_r" #: .././sonata/main.py:258 msgid "Add" msgstr "Ekle" #: .././sonata/main.py:259 msgid "Replace" msgstr "Değiştir" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "_Sil..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Karıştır" #: .././sonata/main.py:286 #, fuzzy msgid "S_how Sonata" msgstr "_Sonata'yı Göster" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "_Tekrarla" #: .././sonata/main.py:288 #, fuzzy msgid "Rando_m" msgstr "Rastgele" #: .././sonata/main.py:428 msgid "By Artist" msgstr "Sanatçıya göre" #: .././sonata/main.py:429 msgid "By Album" msgstr "Albüme göre" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "Şarkı İsmine göre" #: .././sonata/main.py:431 msgid "By File Name" msgstr "Dosya İsmine göre" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "Dizin ve Dosya İsmine göre" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Listeyi Ters Çevir" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "_Yeni..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "_Düzenle..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "_Yeniden Adlandır..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Çalma Listesi" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Genişletmek için tıklayın" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Daraltmak için tıklayın" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Bağlı Değil" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "Okuma İzni Yok" #: .././sonata/main.py:645 #, fuzzy msgid "Cover Art" msgstr "Kapak Resmi Seç" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 #, fuzzy msgid "Profile" msgstr "Yeni Profil" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 #, fuzzy msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT kullanılıyor" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "Bağlantıyı kes" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Yıl" #: .././sonata/main.py:1192 msgid "Stream" msgstr "Yayın" #: .././sonata/main.py:1193 msgid "Len" msgstr "Uzunluk" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Bilinmeyen" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "gün" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "" msgstr[1] "saat" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "ve" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(mpd güncelleniyor)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "Şarkı Sözü Ara" #: .././sonata/main.py:2117 msgid "_Search" msgstr "_Ara" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "Sanatçı İsmi" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Şarkı İsmi" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Resmi Aç" #: .././sonata/main.py:2379 msgid "Images" msgstr "Resimler" #: .././sonata/main.py:2383 msgid "All files" msgstr "Tüm Dosyalar" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Kapak Resmi Seç" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "S_eç" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Arama terimlerini düzenle" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Sanatçı veya albüm ismi bulunamadı." #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Albüm kapağı bulunamadı." #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "" msgstr[1] "Seçili çalma listeleri silinsin mi?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "" msgstr[1] "Çalma listelerini sil" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "" msgstr[1] "Seçili yayınlar silinsin mi?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "" msgstr[1] "Yayınları Sil" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "Şarkı sözlerini müzik dosyasının dizinine kaydetmek için, geçerli müzik " "dizini belirtmeniz gerekmektedir." #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "Müzik Dizini Doğrulaması" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "Albüm resimlerini müzik dosyasının dizinine kaydetmek için, geçerli müzik " "dizini belirtmeniz gerekmektedir." #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "" msgstr[1] "albüm" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "" msgstr[1] "sanatçı" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "" msgstr[1] "günlük mutluluk" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "" msgstr[1] "saatlik mutluluk" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Çalma Listesini Kaydet" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" #: .././sonata/playlists.py:120 #, fuzzy msgid "Existing Playlist" msgstr "Çalma Listesi" #: .././sonata/playlists.py:120 #, fuzzy msgid "Replace playlist" msgstr "Çalma Listesini Yeniden Adlandır" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Bu isimde çalma listesi zaten var. Başka isim dener misiniz?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Çalma listesi ismi" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "Çalma Listesini Yeniden Adlandır" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Sistem çekmecesi" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Sol Üst" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Sağ Üst" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Sol Alt" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Sağ Alt" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "Ekran Merkezi" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD Bağlantısı" #: .././sonata/preferences.py:76 #, fuzzy msgid "_Name" msgstr "İsim" #: .././sonata/preferences.py:79 #, fuzzy msgid "_Host" msgstr "Sunucu" #: .././sonata/preferences.py:82 #, fuzzy msgid "_Port" msgstr "Port" #: .././sonata/preferences.py:86 #, fuzzy msgid "_Music dir" msgstr "Müzik dizini" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:91 #, fuzzy msgid "Pa_ssword" msgstr "Parola" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Şifre gerekmiyorsa boş bırakın." #: .././sonata/preferences.py:95 #, fuzzy msgid "_Autoconnect on start" msgstr "Başlangıçta otomatik bağlan" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "MPD_HOST/PORT kullanılıyor" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "Ekler" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 #, fuzzy msgid "_Username:" msgstr "Kullanıcı Adı:" #: .././sonata/preferences.py:171 #, fuzzy msgid "_Password:" msgstr "Şifre:" #: .././sonata/preferences.py:188 #, fuzzy msgid "Popup _notification on song changes" msgstr "Şarkı değişikliklerinde bilgilendirme göster" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Fade uzunluğu" #: .././sonata/preferences.py:211 #, fuzzy msgid "_Fade length" msgstr "Fade uzunluğu" #: .././sonata/preferences.py:213 msgid "sec" msgstr "saniye" #: .././sonata/preferences.py:218 #, fuzzy msgid "C_rossfade" msgstr "Crossfade" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Göster" #: .././sonata/preferences.py:251 #, fuzzy msgid "_Album art" msgstr "Albüm ismi" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "Temel" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "Şekilli" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "Albüm resmi biçimi:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Sadece yerel" #: .././sonata/preferences.py:258 #, fuzzy msgid "Local and remote" msgstr "Önce yerel, sonra harici" #: .././sonata/preferences.py:260 #, fuzzy msgid "Search locations:" msgstr "Arama sırası:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 msgid "custom" msgstr "özel" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "Albüm kapaklarını buraya kaydet:" #: .././sonata/preferences.py:277 #, fuzzy msgid "_Playback/volume buttons" msgstr "Tekrar çalma/ses butonları" #: .././sonata/preferences.py:280 #, fuzzy msgid "Pr_ogressbar" msgstr "İlerleme çubuğu" #: .././sonata/preferences.py:283 #, fuzzy msgid "_Statusbar" msgstr "Durum çubuğu" #: .././sonata/preferences.py:286 #, fuzzy msgid "Song Ly_rics" msgstr "Şarkı sözleri" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "Şarkı sözlerini buraya kaydet:" #: .././sonata/preferences.py:297 #, fuzzy msgid "System _tray icon" msgstr "Sistem çekmecesi" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Pencere Davranışı" #: .././sonata/preferences.py:323 #, fuzzy msgid "_Show window on all workspaces" msgstr "Pencereyi tüm çalışma alanlarında göster" #: .././sonata/preferences.py:326 #, fuzzy msgid "_Keep window above other windows" msgstr "Pencereyi diğer pencerelerin üstünde tut" #: .././sonata/preferences.py:329 #, fuzzy msgid "_Hide window titlebar" msgstr "Pencere başlığı:" #: .././sonata/preferences.py:334 #, fuzzy msgid "_Minimize to system tray on close/escape" msgstr "Pencere kapatıldığında sistem çekmecesine yerleş" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Eğer seçiliyse, Sonata kapanırken sistem çekmecesine yerleşecek. Panelde " "sistem çekmecenizin olduğundan emin olun, aksi halde Sonata penceresini geri " "açamayabilirsiniz." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Çeşitli" #: .././sonata/preferences.py:354 #, fuzzy msgid "_Update MPD library on start" msgstr "Başlangıçta MPD kütüphanesini güncelle" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Eğer seçiliyse, Sonata otomatik olarak MPD kütüphanenizi başlangıçta " "güncelleyecektir." #: .././sonata/preferences.py:358 #, fuzzy msgid "S_top playback on exit" msgstr "Çıkışta şarkıyı durdur" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD, istemci kapalı olduğu halde çalmaya devam eder. Eğer seçiliyse, Sonata " "genel müzik çalıcılar gibi davranacak ve uygulama kapatıldığında tekrar " "çalma da duracak." #: .././sonata/preferences.py:362 #, fuzzy msgid "_Write status file:" msgstr "Durumu dosyaya yaz:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Eğer seçiliyse, Sonata xmms-infopipe tarzı şarkı hakkında bilgi içeren bir " "dosya oluşturacak. Birçok uygulama (Anlık-İleti araçları, IRC istemciler...) " "xmms-info dosyalarını destekler." #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Şarkı Biçimi" #: .././sonata/preferences.py:397 #, fuzzy msgid "C_urrent playlist:" msgstr "Çalınanlar listesi:" #: .././sonata/preferences.py:398 #, fuzzy msgid "_Library:" msgstr "Kütüphane:" #: .././sonata/preferences.py:399 #, fuzzy msgid "_Window title:" msgstr "Pencere başlığı:" #: .././sonata/preferences.py:400 #, fuzzy msgid "Current _song line 1:" msgstr "Çalınan şarkı satır 1:" #: .././sonata/preferences.py:402 #, fuzzy msgid "Current s_ong line 2:" msgstr "Çalınan şarkı satır 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Kullanılabilir seçenekler" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Sanatçı ismi" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Albüm ismi" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "Şarkı ismi" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Şarkı numarası" #: .././sonata/preferences.py:430 #, fuzzy msgid "Disc number" msgstr "Disk Numarası" #: .././sonata/preferences.py:433 #, fuzzy msgid "File path" msgstr "dosya_yolu" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Dosya ismi" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Yayın ismi" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Şarkı uzunluğu" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Geçen süre (sadece başlık)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Yalnız etiketler tanımlanmışsa bilgi gösterilecek" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "Çalınanlar listesinde sütunlar oluşturur" #: .././sonata/preferences.py:473 #, fuzzy msgid "_About" msgstr "_Hakkında..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "" #: .././sonata/preferences.py:521 msgid "Description" msgstr "" #. Set up table #: .././sonata/preferences.py:532 #, fuzzy msgid "MPD" msgstr "_MPD" #: .././sonata/preferences.py:534 #, fuzzy msgid "Behavior" msgstr "_Davranış" #: .././sonata/preferences.py:535 #, fuzzy msgid "Format" msgstr "_Biçim" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "Yeni Profil" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "Özel Resim" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "Resim ismi" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Yayını Düzenle" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Yeni Yayın" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "Yayın URL'si" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Bu isimde bir yayın zaten var. Başka bir isim dener misiniz?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "Taglib ve/veya tagpy bulunamadı, etiket düzenleme desteği kaldırıldı." #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Etiketleri Düzenle" #: .././sonata/tagedit.py:70 #, fuzzy msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "Taglib ve/veya tagpy bulunamadı, etiket düzenleme desteği kaldırıldı." #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Yol" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "mevcut değil. Lütfen tercihlerde geçerli müzik dizini belirtin." #: .././sonata/tagedit.py:99 msgid "File " msgstr "Dosya" #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " bulunamadı. Lütfen tercihlerde geçerli müzik dizini belirtin." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Düzenlenebilir etikete sahip hiç müzik dosyası bulunamadı." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Yorum" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "_Hepsini Kaydet" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "Seçilen dosyaların numarasını bu dosya 1 olacak şekilde birer birer artır." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Tüm müzik dosyaları için uygula" #: .././sonata/tagedit.py:260 msgid "of" msgstr "" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Etiket müzik dosyasına kaydedilemiyor." #: .././sonata/tagedit.py:366 #, fuzzy msgid "Hide file path" msgstr "dosya_yolu" #: .././sonata/tagedit.py:369 #, fuzzy msgid "Show file path" msgstr "dosya_yolu" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Bilgilendirme penceresi için D-Bus gerekli, durduruluyor." #, fuzzy #~ msgid "_Update Path" #~ msgstr "_Güncelle" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "İnternet Sitesi: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "Audioscrobbler etkinleştir" #~ msgid "Enable Crossfade" #~ msgstr "Crossfade aktif" #~ msgid "Enable album art" #~ msgstr "Albüm resmi seçili" #~ msgid "Enable lyrics" #~ msgstr "Şarkı sözleri" #~ msgid "Enable system tray icon" #~ msgstr "Sistem çekmecesi" #~ msgid "_Display" #~ msgstr "_Göster" #~ msgid "_Extras" #~ msgstr "_Ekler" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "" #~ "PyGTK+ 2.10 ya da gnome-python-extras bulunamadı, sistem çekmecesi " #~ "desteği şu an uygun değil." #~ msgid "Reset to Default" #~ msgstr "Öntanımlı Ayarlara Dön" #~ msgid "_New Playlist..." #~ msgstr "_Yeni Çalma Listesi..." #~ msgid "_Shuffle" #~ msgstr "_Karıştır" #~ msgid "Toggle shuffle mode" #~ msgstr "Karıştırma durumunu değiştir" #~ msgid "Notification" #~ msgstr "Bilgilendirme" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "Python 2.5 ya da python-elementtree bulunamadı, audioscrobbler desteği " #~ "devre dışı." #~ msgid "Audioscrobbler Verification" #~ msgstr "Audioscrobbler Doğrulaması" #~ msgid "Update library for selected item(s)" #~ msgstr "Kütüphaneyi seçili olan(lar) için güncelle" ����������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/uk.po�����������������������������������������������������������������������������0000664�0000000�0000000�00000126335�11255764730�0014565�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: Sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2007-02-09 11:04+0200\n" "Last-Translator: Dogmatist Demon <dogmaton@gmail.com>\n" "Language-Team: Ukranian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "Налаштування" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "" #: .././sonata/about.py:56 #, fuzzy msgid "Connect to MPD" msgstr "З'єднатися" #: .././sonata/about.py:57 #, fuzzy msgid "Disconnect from MPD" msgstr "Роз'єднати" #: .././sonata/about.py:58 #, fuzzy msgid "Randomize current playlist" msgstr "Список програвання" #: .././sonata/about.py:59 #, fuzzy msgid "Expand player" msgstr "Розгорнути програвач" #: .././sonata/about.py:60 #, fuzzy msgid "Switch to previous tab" msgstr "Список програвання" #: .././sonata/about.py:61 #, fuzzy msgid "Switch to next tab" msgstr "Список програвання" #: .././sonata/about.py:62 #, fuzzy msgid "Collapse player" msgstr "Згорнути програвач" #: .././sonata/about.py:63 .././sonata/library.py:86 #, fuzzy msgid "Search library" msgstr "Кінець пошуку" #: .././sonata/about.py:64 #, fuzzy msgid "Quit" msgstr "Вихід" #: .././sonata/about.py:65 #, fuzzy msgid "Update entire library" msgstr "Поновити фонотеку" #: .././sonata/about.py:66 #, fuzzy msgid "Display popup menu" msgstr "Пказувати на протязі" #: .././sonata/about.py:67 #, fuzzy msgid "Minimize to system tray (if enabled)" msgstr "Закриття згортає програму в зону сповіщення" #: .././sonata/about.py:69 #, fuzzy msgid "Previous track" msgstr "Попередня" #: .././sonata/about.py:70 #, fuzzy msgid "Next track" msgstr "Новий потік" #: .././sonata/about.py:71 #, fuzzy msgid "Play/Pause" msgstr "Пауза" #: .././sonata/about.py:72 #, fuzzy msgid "Stop" msgstr "Зупинити" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "" #: .././sonata/about.py:77 #, fuzzy msgid "Remove selected song(s)" msgstr "Видалити обраний потік" #: .././sonata/about.py:78 #, fuzzy msgid "Center currently playing song" msgstr "Зупинити програвання" #: .././sonata/about.py:79 .././sonata/about.py:88 #, fuzzy msgid "Edit selected song's tags" msgstr "Видалити потік" #: .././sonata/about.py:80 #, fuzzy msgid "Save to new playlist" msgstr "Зберегти список" #: .././sonata/about.py:81 #, fuzzy msgid "Clear list" msgstr "Список програвання" #: .././sonata/about.py:82 #, fuzzy msgid "Randomize list" msgstr "Зберегти список" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "" #: .././sonata/about.py:86 #, fuzzy msgid "Add selected item(s)" msgstr "Видалити потік" #: .././sonata/about.py:87 #, fuzzy msgid "Replace with selected item(s)" msgstr "Видалити обраний потік" #: .././sonata/about.py:89 #, fuzzy msgid "Add selected item(s) and play" msgstr "Видалити потік" #: .././sonata/about.py:90 #, fuzzy msgid "Replace with selected item(s) and play" msgstr "Видалити обраний потік" #: .././sonata/about.py:91 #, fuzzy msgid "Update selected item(s)/path(s)" msgstr "Видалити потік" #: .././sonata/about.py:93 .././sonata/about.py:95 #, fuzzy msgid "Add selected playlist(s)" msgstr "Видалити список" #: .././sonata/about.py:94 #, fuzzy msgid "Remove selected playlist(s)" msgstr "Видалити обраний список" #: .././sonata/about.py:96 #, fuzzy msgid "Replace with selected playlist(s)" msgstr "Видалити обраний список" #: .././sonata/about.py:97 #, fuzzy msgid "Add selected playlist(s) and play" msgstr "Видалити список" #: .././sonata/about.py:98 #, fuzzy msgid "Replace with selected playlist(s) and play" msgstr "Видалити обраний список" #: .././sonata/about.py:100 .././sonata/about.py:102 #, fuzzy msgid "Add selected stream(s)" msgstr "Видалити потік" #: .././sonata/about.py:101 #, fuzzy msgid "Remove selected stream(s)" msgstr "Видалити обраний потік" #: .././sonata/about.py:103 #, fuzzy msgid "Replace with selected stream(s)" msgstr "Видалити обраний потік" #: .././sonata/about.py:104 #, fuzzy msgid "Add selected stream(s) and play" msgstr "Видалити потік" #: .././sonata/about.py:105 #, fuzzy msgid "Replace with selected stream(s) and play" msgstr "Видалити обраний потік" #: .././sonata/about.py:107 #, fuzzy msgid "Edit playing song's tags" msgstr "Видалити потік" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 #, fuzzy msgid "Main Shortcuts" msgstr "Сортувати" #: .././sonata/about.py:111 #, fuzzy msgid "Playback Shortcuts" msgstr "Сортувати" #: .././sonata/about.py:112 #, fuzzy msgid "Current Shortcuts" msgstr "Сортувати" #: .././sonata/about.py:113 #, fuzzy msgid "Library Shortcuts" msgstr "Сортувати" #: .././sonata/about.py:114 #, fuzzy msgid "Playlist Shortcuts" msgstr "Списки програвання" #: .././sonata/about.py:115 #, fuzzy msgid "Stream Shortcuts" msgstr "Сортувати" #: .././sonata/about.py:116 #, fuzzy msgid "Info Shortcuts" msgstr "Сортувати" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "" #: .././sonata/about.py:153 #, fuzzy msgid "An elegant music client for MPD." msgstr "Елегантний клієнт для MPD." #. Add button to show keybindings: #: .././sonata/about.py:166 #, fuzzy msgid "_Shortcuts" msgstr "Сортувати" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "Не вдаєть запустити переглядач." #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "" #: .././sonata/cli.py:81 #, fuzzy msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "Перемикання вимагає наявності D-Bus. Скасовано." #: .././sonata/cli.py:97 #, fuzzy msgid "Version" msgstr "Версія: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "" #: .././sonata/cli.py:103 #, fuzzy msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "Використання: sonata [OPTION]" #: .././sonata/cli.py:105 msgid "Options" msgstr "Налаштування" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "Показати довідку та вийти" #: .././sonata/cli.py:107 #, fuzzy msgid "Popup song notification (requires D-Bus)" msgstr "Сповіщення про зміну композиції" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "Згорнути програвач в зону сповіщення," #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "аба показати (вимагається наявність D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "Показати версію та вийти" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "" #: .././sonata/cli.py:113 #, fuzzy msgid "Start app visible (requires systray)" msgstr "аба показати (вимагається наявність D-Bus)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "" #: .././sonata/cli.py:116 #, fuzzy msgid "Commands" msgstr "Коментар" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "Грати композицію зі списку" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "Зробити паузу" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "Зупинити програвання" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "Грати наступну пісню зі списку" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "Грати попередню пісню зі списку" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "Грати/Пауза" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "Показати інформацію про композицію" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "Показати стан MPD" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr " " #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "з" #: .././sonata/cli.py:176 #, fuzzy msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "Не вдається приєднатися до MPD.\n" "Будьласка, перевірьте налаштування програми." #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "Назва" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "Виконавець" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "Альбом" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "Дата" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "Трек" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "Жанр" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "Файл" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "Час" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "Бітрейт" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD зупинений" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "Стан" #: .././sonata/cli.py:228 msgid "Playing" msgstr "Програвання" #: .././sonata/cli.py:230 msgid "Paused" msgstr "Пауза" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "Зупинено" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "Повторення" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "Вимкнути" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "Увімкнути" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "Випадково" #: .././sonata/cli.py:241 msgid "Volume" msgstr "Гучність" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "Накладання" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 #, fuzzy msgid "second" msgid_plural "seconds" msgstr[0] "секунда" msgstr[1] "секунда" #: .././sonata/current.py:64 #, fuzzy msgid "Filter" msgstr "Файл" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Не вдалося з'єднатися з D-BUS. Налаштуйте D-BUS, та спробуйте знову " "(спробуйте 'man dbus-launch' та 'man dbus-daemon' для довідки)." #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "" #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "" #: .././sonata/dbus_plugin.py:100 #, fuzzy msgid "Maybe Sonata is not running?" msgstr "Sonata вже запущено." #: .././sonata/dbus_plugin.py:114 #, fuzzy msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata вже запущено." #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "Про композицію" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "" #: .././sonata/info.py:130 #, fuzzy msgid "Edit song tags" msgstr "Видалити потік" #. Lyrics #: .././sonata/info.py:140 #, fuzzy msgid "Lyrics" msgstr "Текст композиції" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "" #. Album info #: .././sonata/info.py:161 #, fuzzy msgid "Album Info" msgstr "Про альбом" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "" #: .././sonata/info.py:215 msgid "hide" msgstr "" #: .././sonata/info.py:281 #, fuzzy msgid "edit tags" msgstr "Редагувати тег" #: .././sonata/info.py:308 #, fuzzy msgid "Album info not found." msgstr "Не вказано альбом" #: .././sonata/info.py:311 msgid "Album name not set." msgstr "Не вказано альбом" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "" #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "Виконавець або назва не вказані" #: .././sonata/info.py:371 #, fuzzy msgid "search" msgstr "Кінець пошуку" #: .././sonata/info.py:372 #, fuzzy msgid "edit" msgstr "Редагувати тег" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "Тексту не знайдено" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "Завантаження текстів..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "Не вдається з'єднатися з LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "Невдале завантаження тексту" #: .././sonata/library.py:47 msgid "Untagged" msgstr "" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "Різні виконавці" #: .././sonata/library.py:49 msgid "Filename" msgstr "Назва файлу" #: .././sonata/library.py:49 msgid "Everything" msgstr "" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "Файлова система" #: .././sonata/library.py:53 #, fuzzy msgid "Artists" msgstr "Виконавець" #: .././sonata/library.py:54 #, fuzzy msgid "Albums" msgstr "Альбом" #: .././sonata/library.py:55 #, fuzzy msgid "Genres" msgstr "Жанр" #: .././sonata/library.py:84 #, fuzzy msgid "Search terms" msgstr "Редагувати рядок пошуку" #: .././sonata/library.py:90 #, fuzzy msgid "End Search" msgstr "Кінець пошуку" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "Перегляд фонотеки" #: .././sonata/library.py:96 #, fuzzy msgid "Search" msgstr "Кінець пошуку" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "композиція" msgstr[1] "композицій" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "хвилина" msgstr[1] "хвилин" #: .././sonata/library.py:849 #, fuzzy msgid "Song" msgstr "композиція" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "Шлях" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "Поточна" #: .././sonata/main.py:103 msgid "Library" msgstr "Фонотека" #: .././sonata/main.py:104 msgid "Playlists" msgstr "Списки програвання" #: .././sonata/main.py:105 msgid "Streams" msgstr "Потоки" #: .././sonata/main.py:106 #, fuzzy msgid "Info" msgstr "Про композицію" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "Протягом композиції" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "Сортувати" #: .././sonata/main.py:235 #, fuzzy msgid "Sa_ve List to" msgstr "Зберегти список" #: .././sonata/main.py:236 #, fuzzy msgid "_Connection" msgstr "З'єднання з MPD" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "" #: .././sonata/main.py:238 .././sonata/main.py:2454 #, fuzzy msgid "_Update" msgstr "Поновити фонотеку" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "Використати зображення с мережі" #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "Використати локальне зображення" #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "" #: .././sonata/main.py:242 #, fuzzy msgid "Reset Image" msgstr "Завантажити зображення" #: .././sonata/main.py:243 msgid "_Play" msgstr "Грати" #: .././sonata/main.py:244 #, fuzzy msgid "Pa_use" msgstr "Пауза" #: .././sonata/main.py:245 msgid "_Stop" msgstr "Зупинити" #: .././sonata/main.py:246 #, fuzzy msgid "Pre_vious" msgstr "Попередня" #: .././sonata/main.py:247 msgid "_Next" msgstr "Наступна" #: .././sonata/main.py:248 msgid "_Quit" msgstr "Вихід" #: .././sonata/main.py:249 msgid "_Remove" msgstr "Видалити" #: .././sonata/main.py:250 msgid "_Clear" msgstr "Видалити усі" #: .././sonata/main.py:251 #, fuzzy msgid "_Entire Library" msgstr "Поновити фонотеку" #: .././sonata/main.py:252 #, fuzzy msgid "_Selected Items" msgstr "Видалити потік" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "Налаштування" #: .././sonata/main.py:254 msgid "_About..." msgstr "Про..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "Редагувати теги" #: .././sonata/main.py:256 msgid "_Add" msgstr "Додати" #: .././sonata/main.py:257 msgid "_Replace" msgstr "Замінити" #: .././sonata/main.py:258 #, fuzzy msgid "Add" msgstr "Додати" #: .././sonata/main.py:259 #, fuzzy msgid "Replace" msgstr "Замінити" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "Видалити" #: .././sonata/main.py:261 msgid "Shuffle" msgstr "Випадково" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "Повторювати" #: .././sonata/main.py:288 #, fuzzy msgid "Rando_m" msgstr "Випадково" #: .././sonata/main.py:428 #, fuzzy msgid "By Artist" msgstr "Виконавець" #: .././sonata/main.py:429 #, fuzzy msgid "By Album" msgstr "Альбом" #: .././sonata/main.py:430 #, fuzzy msgid "By Song Title" msgstr "Назва композиції" #: .././sonata/main.py:431 #, fuzzy msgid "By File Name" msgstr "Назва файлу" #: .././sonata/main.py:432 #, fuzzy msgid "By Dir & File Name" msgstr "Назва файлу" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "Зворотній порядок" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "Новий" #: .././sonata/main.py:457 msgid "_Edit..." msgstr "Редагувати" #: .././sonata/main.py:468 #, fuzzy msgid "_Rename..." msgstr "Видалити" #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "Список програвання" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "Розгорнути" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "Згорнути" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "Немає з'єднання" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "" #: .././sonata/main.py:645 #, fuzzy msgid "Cover Art" msgstr "Обкладинка" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "" #: .././sonata/main.py:865 .././sonata/main.py:871 #, fuzzy msgid "Disconnect" msgstr "Роз'єднати" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "Рік" #: .././sonata/main.py:1192 #, fuzzy msgid "Stream" msgstr "Потоки" #: .././sonata/main.py:1193 msgid "Len" msgstr "" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "Невідомо" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: .././sonata/main.py:1761 #, fuzzy msgid "hour" msgid_plural "hours" msgstr[0] "година" msgstr[1] "годин" #: .././sonata/main.py:1766 .././sonata/main.py:1768 #, fuzzy msgid "and" msgstr "Випадково" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "" #: .././sonata/main.py:2116 #, fuzzy msgid "Lyrics Search" msgstr "Текст композиції" #: .././sonata/main.py:2117 #, fuzzy msgid "_Search" msgstr "Кінець пошуку" #: .././sonata/main.py:2120 #, fuzzy msgid "Artist Name" msgstr "Виконавець" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "Назва композиції" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "Завантажити зображення" #: .././sonata/main.py:2379 msgid "Images" msgstr "Зображення" #: .././sonata/main.py:2383 msgid "All files" msgstr "Усі файли" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "Оберіть обкладинку" #: .././sonata/main.py:2426 #, fuzzy msgid "C_hoose" msgstr "Вибір" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "Редагувати рядок пошуку" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "Не знайдено ні виконавці ні альбому з таким ім'ям" #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "Обкладинки не знайдено" #: .././sonata/main.py:2843 #, fuzzy msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "Видалити обраний список" msgstr[1] "Видалити обраний список" #: .././sonata/main.py:2843 #, fuzzy msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "Видалити список" msgstr[1] "Видалити список" #: .././sonata/main.py:2851 #, fuzzy msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "Видалити обраний потік" msgstr[1] "Видалити обраний потік" #: .././sonata/main.py:2851 #, fuzzy msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "Видалити потік" msgstr[1] "Видалити потік" #: .././sonata/main.py:2909 #, fuzzy msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "" "нічого не знайдено. Будь ласка, задайте вірний каталог з музикою у " "налалаштуваннях програми." #: .././sonata/main.py:2909 .././sonata/main.py:2916 #, fuzzy msgid "Music Dir Verification" msgstr "Сповіщення" #: .././sonata/main.py:2916 #, fuzzy msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "" "нічого не знайдено. Будь ласка, задайте вірний каталог з музикою у " "налалаштуваннях програми." #: .././sonata/main.py:3332 #, fuzzy msgid "album" msgid_plural "albums" msgstr[0] "Альбоми." msgstr[1] "Альбоми." #: .././sonata/main.py:3333 #, fuzzy msgid "artist" msgid_plural "artists" msgstr[0] "Виконавці." msgstr[1] "Виконавці." #: .././sonata/main.py:3340 #, fuzzy msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "годин прослуховування." msgstr[1] "годин прослуховування." #: .././sonata/main.py:3342 #, fuzzy msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "годин прослуховування." msgstr[1] "годин прослуховування." #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "Зберегти список" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "" #: .././sonata/playlists.py:120 #, fuzzy msgid "Existing Playlist" msgstr "Список програвання" #: .././sonata/playlists.py:120 #, fuzzy msgid "Replace playlist" msgstr "Зберегти список" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "" #: .././sonata/playlists.py:141 #, fuzzy msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "Список з такою назвою вже є." #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "Ім'я списку" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 #, fuzzy msgid "Rename Playlist" msgstr "Зберегти список" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "Біля зони сповіщення" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "Вгорі ліворуч" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "Вгорі праворуч" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "Знизу ліворуч" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "Знизу праворуч" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "З'єднання з MPD" #: .././sonata/preferences.py:76 #, fuzzy msgid "_Name" msgstr "Назва файлу" #: .././sonata/preferences.py:79 #, fuzzy msgid "_Host" msgstr "Адреса" #: .././sonata/preferences.py:82 #, fuzzy msgid "_Port" msgstr "Порт" #: .././sonata/preferences.py:86 #, fuzzy msgid "_Music dir" msgstr "Директорія музики" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "" #: .././sonata/preferences.py:91 #, fuzzy msgid "Pa_ssword" msgstr "Пароль" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "Залишіть вільним, якщо пароль не потрібний" #: .././sonata/preferences.py:95 #, fuzzy msgid "_Autoconnect on start" msgstr "З'єднуватися під час запуску" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 #, fuzzy msgid "Extras" msgstr "Потоки" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:170 #, fuzzy msgid "_Username:" msgstr "Видалити" #: .././sonata/preferences.py:171 #, fuzzy msgid "_Password:" msgstr "Пароль" #: .././sonata/preferences.py:188 #, fuzzy msgid "Popup _notification on song changes" msgstr "Сповіщення про зміну композиції" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "Час стихання" #: .././sonata/preferences.py:211 #, fuzzy msgid "_Fade length" msgstr "Час стихання" #: .././sonata/preferences.py:213 msgid "sec" msgstr "секунд" #: .././sonata/preferences.py:218 #, fuzzy msgid "C_rossfade" msgstr "Накладання" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "Інтерфейс" #: .././sonata/preferences.py:251 #, fuzzy msgid "_Album art" msgstr "Альбом" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "Тільки локальні" #: .././sonata/preferences.py:258 #, fuzzy msgid "Local and remote" msgstr "Спочатку локальні, потім - з мережі" #: .././sonata/preferences.py:260 #, fuzzy msgid "Search locations:" msgstr "Кінець пошуку" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:269 #, fuzzy msgid "custom" msgstr "Альбом" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "" #: .././sonata/preferences.py:277 #, fuzzy msgid "_Playback/volume buttons" msgstr "Показувати клавіші програвання" #: .././sonata/preferences.py:280 #, fuzzy msgid "Pr_ogressbar" msgstr "Накладання" #: .././sonata/preferences.py:283 #, fuzzy msgid "_Statusbar" msgstr "Показувати рядок стану" #: .././sonata/preferences.py:286 #, fuzzy msgid "Song Ly_rics" msgstr "Текст композиції" #: .././sonata/preferences.py:288 #, fuzzy msgid "Save lyrics to:" msgstr "Зберегти список" #: .././sonata/preferences.py:297 #, fuzzy msgid "System _tray icon" msgstr "Біля зони сповіщення" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "Розміщення програми" #: .././sonata/preferences.py:323 #, fuzzy msgid "_Show window on all workspaces" msgstr "Показувати на усіх робочих столах" #: .././sonata/preferences.py:326 #, fuzzy msgid "_Keep window above other windows" msgstr "Зверху інших вікон" #: .././sonata/preferences.py:329 #, fuzzy msgid "_Hide window titlebar" msgstr "Заголовок вікна:" #: .././sonata/preferences.py:334 #, fuzzy msgid "_Minimize to system tray on close/escape" msgstr "Закриття згортає програму в зону сповіщення" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "Програма не зупиняє свого виконання, а ховається до зони сповіщення. Але це " "зручно, якщо є зона сповіщення." #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "Різне" #: .././sonata/preferences.py:354 #, fuzzy msgid "_Update MPD library on start" msgstr "Поновлювати фонотеку при запуску" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "" "Якщо ввімкнено, Sonata автоматично оновлюватиме фонотеку MPD під час запуску." #: .././sonata/preferences.py:358 #, fuzzy msgid "S_top playback on exit" msgstr "Зупинити програвання при виході" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "MPD дозволяє програвати музику, якщо не запущено контролюючої програми. Якщо " "ввімкнено, то Sonata буде себе поводити як більшість інших програвачів, " "тобто зупинить програвання при закритті." #: .././sonata/preferences.py:362 #, fuzzy msgid "_Write status file:" msgstr "Записати файл стану:" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "Якщо ввімкнено, Sonata створить файл про поточну композицію на кшталт xmms. " "Це зручно для передачі цих даних іншим програмам." #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "Формат інформації про композицію" #: .././sonata/preferences.py:397 #, fuzzy msgid "C_urrent playlist:" msgstr "Список програвання" #: .././sonata/preferences.py:398 #, fuzzy msgid "_Library:" msgstr "Фонотека:" #: .././sonata/preferences.py:399 #, fuzzy msgid "_Window title:" msgstr "Заголовок вікна:" #: .././sonata/preferences.py:400 #, fuzzy msgid "Current _song line 1:" msgstr "Поточна композиція, рядок 1:" #: .././sonata/preferences.py:402 #, fuzzy msgid "Current s_ong line 2:" msgstr "Поточна композиція, рядок 2:" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "Доступні налаштування" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "Виконавець" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "Альбом" #: .././sonata/preferences.py:428 #, fuzzy msgid "Track name" msgstr "Трек" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "Трек" #: .././sonata/preferences.py:430 #, fuzzy msgid "Disc number" msgstr "Трек" #: .././sonata/preferences.py:433 #, fuzzy msgid "File path" msgstr "Шлях до файлу" #: .././sonata/preferences.py:434 msgid "File name" msgstr "Файл" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "Ім'я потоку" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "Час композиції" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "Поточний час (тільки в заголовок)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "Виводитиметься увипадку, якщо заповнений тег композиції" #: .././sonata/preferences.py:448 #, fuzzy msgid "Creates columns in the current playlist" msgstr "Список програвання" #: .././sonata/preferences.py:473 #, fuzzy msgid "_About" msgstr "Про..." #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "" #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "" #: .././sonata/preferences.py:521 msgid "Description" msgstr "" #. Set up table #: .././sonata/preferences.py:532 #, fuzzy msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 #, fuzzy msgid "Behavior" msgstr "Поведінка" #: .././sonata/preferences.py:535 #, fuzzy msgid "Format" msgstr "Формат" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "Редагування потоку" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "Новий потік" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "Адреса потоку" #: .././sonata/streams.py:138 #, fuzzy msgid "A stream with this name already exists. Would you like to replace it?" msgstr "Потік з таким ім'ям вже є." #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "" #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "Редагувати тег" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "" #: .././sonata/tagedit.py:75 msgid "The path" msgstr "Шлях" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "" "нічого не знайдено. Будь ласка, задайте вірний каталог з музикою у " "налалаштуваннях програми." #: .././sonata/tagedit.py:99 #, fuzzy msgid "File " msgstr "Файл" #: .././sonata/tagedit.py:99 #, fuzzy msgid " not found. Please specify a valid music directory in preferences." msgstr "" "нічого не знайдено. Будь ласка, задайте вірний каталог з музикою у " "налалаштуваннях програми." #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "Не знайдено файлів з підтримкою тегів." #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "Коментар" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 #, fuzzy msgid "Save _All" msgstr "Зберегти список" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "Якщо позначено, то номер кожного наступного треку буде на один більше." #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "Застосувати до усіх обраних фійлів." #: .././sonata/tagedit.py:260 msgid "of" msgstr "з" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "Не вдається записати тег у файл." #: .././sonata/tagedit.py:366 #, fuzzy msgid "Hide file path" msgstr "Шлях до файлу" #: .././sonata/tagedit.py:369 #, fuzzy msgid "Show file path" msgstr "Шлях до файлу" #, fuzzy #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "Перемикання вимагає наявності D-Bus. Скасовано." #, fuzzy #~ msgid "_Update Path" #~ msgstr "Поновити фонотеку" #, fuzzy #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "Сторінка: http://sonata.berlios.de" #, fuzzy #~ msgid "Enable Crossfade" #~ msgstr "Накладання" #~ msgid "Enable album art" #~ msgstr "Показувати обкладинку альбому" #~ msgid "Enable lyrics" #~ msgstr "Текст пісні" #~ msgid "Enable system tray icon" #~ msgstr "Ввімкнути значок в зоні сповіщення" #, fuzzy #~ msgid "_Display" #~ msgstr "Інтерфейс" #, fuzzy #~ msgid "_New Playlist..." #~ msgstr "Зберегти список" #~ msgid "Notification" #~ msgstr "Сповіщення" #, fuzzy #~ msgid "Audioscrobbler Verification" #~ msgstr "Сповіщення" #, fuzzy #~ msgid "Update library for selected item(s)" #~ msgstr "Поновлювати фонотеку при запуску" #~ msgid "_Shuffle" #~ msgstr "Випадково" #~ msgid "Not connected" #~ msgstr "Нема з'єднання" #~ msgid "Press enter to search for these terms." #~ msgstr "Нажміть Enter для пошуку." #~ msgid "Play enqueued files on activate" #~ msgstr "Програвати чергу файлів при активації" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "" #~ "Автоматично програвати чергу елементів активовану подвійним кліком або " #~ "Enter." #, fuzzy #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "Видалити список" #, fuzzy #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "Видалити обраний потік" #~ msgid "seconds" #~ msgstr "секунд" #~ msgid "Song Info..." #~ msgstr "Про композицію" #~ msgid "Click to collapse the player" #~ msgstr "Згорнути програвач" #~ msgid "Click to expand the player" #~ msgstr "Розгорнути програвач" #~ msgid "_Song Info" #~ msgstr "Про композицію" #, fuzzy #~ msgid "_Search..." #~ msgstr "Кінець пошуку" #~ msgid "Remote only" #~ msgstr "Тільки з мережі" #~ msgid "Remote, then local" #~ msgstr "Спочатку з мережі, потім - локальні" #, fuzzy #~ msgid "Artwork Verification" #~ msgstr "Сповіщення" #~ msgid "Song name" #~ msgstr "Назва" #~ msgid "songs." #~ msgstr "Композиції." #~ msgid "By" #~ msgstr " " #~ msgid "Enable" #~ msgstr "Ввімкнути" #~ msgid "Dis_play" #~ msgstr "Інтерфейс" #, fuzzy #~ msgid "album.jpg" #~ msgstr "Альбоми." #~ msgid "_Show Player" #~ msgstr "Показати програвач" #~ msgid "Enable volume button" #~ msgstr "Показувати регулятор гучності" #~ msgid "_Help" #~ msgstr "Довідка" #~ msgid "minutes" #~ msgstr "хвилин" #~ msgid "hours and" #~ msgstr "годин" #~ msgid "by Unknown" #~ msgstr "Невідомий" #~ msgid "Location" #~ msgstr "Положення" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/zh_CN.po��������������������������������������������������������������������������0000664�0000000�0000000�00000115117�11255764730�0015143�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Simplified Chinese translation for Sonata. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Sonata package. # Desmond O. Chang <dochang@gmail.com>, 2007-2008. # msgid "" msgstr "" "Project-Id-Version: Sonata 1.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-22 22:01-0600\n" "PO-Revision-Date: 2009-03-25 06:25+0800\n" "Last-Translator: Desmond O. Chang <dochang@gmail.com>\n" "Language-Team: Simplified Chinese\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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:52 msgid "About Sonata" msgstr "关于 Sonata" #: .././sonata/about.py:53 .././sonata/preferences.py:60 msgid "Preferences" msgstr "偏好" #: .././sonata/about.py:54 msgid "Fullscreen Artwork Mode" msgstr "全屏封面模式" #: .././sonata/about.py:55 msgid "Switch to [1st-5th] tab" msgstr "切换到第 1-5 个标签页" #: .././sonata/about.py:56 msgid "Connect to MPD" msgstr "连接到 MPD" #: .././sonata/about.py:57 msgid "Disconnect from MPD" msgstr "断开与 MPD 的连接" #: .././sonata/about.py:58 msgid "Randomize current playlist" msgstr "随机排列当前播放列表" #: .././sonata/about.py:59 msgid "Expand player" msgstr "展开播放器" #: .././sonata/about.py:60 msgid "Switch to previous tab" msgstr "切换到上一个标签页" #: .././sonata/about.py:61 msgid "Switch to next tab" msgstr "切换到下一个标签页" #: .././sonata/about.py:62 msgid "Collapse player" msgstr "折叠播放器" #: .././sonata/about.py:63 .././sonata/library.py:86 msgid "Search library" msgstr "搜索数据库" #: .././sonata/about.py:64 msgid "Quit" msgstr "退出" #: .././sonata/about.py:65 msgid "Update entire library" msgstr "更新整个数据库" #: .././sonata/about.py:66 msgid "Display popup menu" msgstr "显示弹出菜单" #: .././sonata/about.py:67 msgid "Minimize to system tray (if enabled)" msgstr "最小化到系统托盘(如果可以)" #: .././sonata/about.py:69 msgid "Previous track" msgstr "上一条音轨" #: .././sonata/about.py:70 msgid "Next track" msgstr "下一条音轨" #: .././sonata/about.py:71 msgid "Play/Pause" msgstr "播放/暂停" #: .././sonata/about.py:72 msgid "Stop" msgstr "停止" #: .././sonata/about.py:73 msgid "Lower the volume" msgstr "降低音量" #: .././sonata/about.py:74 msgid "Raise the volume" msgstr "提高音量" #: .././sonata/about.py:76 msgid "Play selected song" msgstr "播放选择的曲目" #: .././sonata/about.py:77 msgid "Remove selected song(s)" msgstr "删除选择的曲目" #: .././sonata/about.py:78 msgid "Center currently playing song" msgstr "居中显示当前播放的曲目" #: .././sonata/about.py:79 .././sonata/about.py:88 msgid "Edit selected song's tags" msgstr "编辑已选择曲目的标签" #: .././sonata/about.py:80 msgid "Save to new playlist" msgstr "保存到新的播放列表" #: .././sonata/about.py:81 msgid "Clear list" msgstr "清除列表" #: .././sonata/about.py:82 msgid "Randomize list" msgstr "随机排列列表" #: .././sonata/about.py:84 msgid "Add selected song(s) or enter directory" msgstr "添加选择的曲目或进入目录" #: .././sonata/about.py:85 msgid "Go to parent directory" msgstr "转到上一级目录" #: .././sonata/about.py:86 msgid "Add selected item(s)" msgstr "添加选择的项" #: .././sonata/about.py:87 msgid "Replace with selected item(s)" msgstr "替换为选择的项" #: .././sonata/about.py:89 msgid "Add selected item(s) and play" msgstr "添加选择的项并播放" #: .././sonata/about.py:90 msgid "Replace with selected item(s) and play" msgstr "替换为选择的项并播放" #: .././sonata/about.py:91 msgid "Update selected item(s)/path(s)" msgstr "更新选择的项目/路径" #: .././sonata/about.py:93 .././sonata/about.py:95 msgid "Add selected playlist(s)" msgstr "添加选择的播放列表" #: .././sonata/about.py:94 msgid "Remove selected playlist(s)" msgstr "删除选择的播放列表" #: .././sonata/about.py:96 msgid "Replace with selected playlist(s)" msgstr "替换为选择的播放列表" #: .././sonata/about.py:97 msgid "Add selected playlist(s) and play" msgstr "添加选择的播放列表并播放" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s) and play" msgstr "替换为选择的播放列表并播放" #: .././sonata/about.py:100 .././sonata/about.py:102 msgid "Add selected stream(s)" msgstr "添加选择的流" #: .././sonata/about.py:101 msgid "Remove selected stream(s)" msgstr "删除选择的流" #: .././sonata/about.py:103 msgid "Replace with selected stream(s)" msgstr "替换为选择的流" #: .././sonata/about.py:104 msgid "Add selected stream(s) and play" msgstr "添加选择的流并播放" #: .././sonata/about.py:105 msgid "Replace with selected stream(s) and play" msgstr "替换为选择的流并播放" #: .././sonata/about.py:107 msgid "Edit playing song's tags" msgstr "编辑当前曲目的标签" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:110 msgid "Main Shortcuts" msgstr "全局快捷键" #: .././sonata/about.py:111 msgid "Playback Shortcuts" msgstr "播放快捷键" #: .././sonata/about.py:112 msgid "Current Shortcuts" msgstr "当前曲目快捷键" #: .././sonata/about.py:113 msgid "Library Shortcuts" msgstr "数据库快捷键" #: .././sonata/about.py:114 msgid "Playlist Shortcuts" msgstr "播放列表快捷键" #: .././sonata/about.py:115 msgid "Stream Shortcuts" msgstr "流媒体快捷键" #: .././sonata/about.py:116 msgid "Info Shortcuts" msgstr "曲目信息快捷键" #: .././sonata/about.py:117 msgid "Shortcuts" msgstr "快捷键" #: .././sonata/about.py:153 msgid "An elegant music client for MPD." msgstr "一个精美的 MPD 客户端" #. Add button to show keybindings: #: .././sonata/about.py:166 msgid "_Shortcuts" msgstr "快捷键(_S)" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Unable to launch a suitable browser." msgstr "无法启动合适的浏览器。" #: .././sonata/about.py:177 .././sonata/main.py:3088 #: .././sonata/preferences.py:738 msgid "Launch Browser" msgstr "启动浏览器" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "参数 toggle 和 popup 需要 D-Bus。放弃中。" #: .././sonata/cli.py:97 msgid "Version" msgstr "版本" #: .././sonata/cli.py:98 msgid "Website" msgstr "网站" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "用法: sonata [选项]... [命令]..." #: .././sonata/cli.py:105 msgid "Options" msgstr "选项" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "显示帮助信息并退出" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "弹出曲目提示(需要 D-Bus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "切换是否将应用程序最小化" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "到托盘或可见(需要 D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "如果 D-Bus 命令失败,不启动应用程序" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "显示版本信息并退出" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "启动应用程序时隐藏(需要系统托盘)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "启动应用程序时可见(需要系统托盘)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "以档案 NUM 启动" #: .././sonata/cli.py:116 msgid "Commands" msgstr "命令" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "播放列表中的曲目" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "暂停当前播放的曲目" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "停止当前播放的曲目" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "播放队列中的下一曲目" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "播放队列中的上一曲目" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "切换播放/暂停;如果已停止就播放" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "切换重复模式" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "切换随机模式" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "显示当前曲目信息" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "显示 MPD 状态" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "启动 Sonata 以档案 %s..." #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d 不是合法的档案编号。" #: .././sonata/cli.py:137 .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "档案编号必须介于 1 和 %d 之间。" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python 不能将 %s 解释为数字。" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "Default Profile" msgstr "默认档案" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "by" msgstr "by" #: .././sonata/cli.py:154 .././sonata/main.py:179 msgid "from" msgstr "from" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment " "variables." msgstr "" "不能连接到 MPD。\n" "请检查你的偏好设置或环境变量 MPD_HOST/MPD_PORT 。" #: .././sonata/cli.py:208 .././sonata/info.py:91 .././sonata/info.py:245 #: .././sonata/library.py:49 .././sonata/tagedit.py:125 msgid "Title" msgstr "标题" #: .././sonata/cli.py:209 .././sonata/info.py:91 .././sonata/info.py:246 #: .././sonata/library.py:49 .././sonata/main.py:1184 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "艺术家" #: .././sonata/cli.py:210 .././sonata/info.py:91 .././sonata/info.py:247 #: .././sonata/library.py:49 .././sonata/main.py:1185 .././sonata/main.py:2439 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "专辑" #: .././sonata/cli.py:211 .././sonata/info.py:91 .././sonata/info.py:248 msgid "Date" msgstr "日期" #: .././sonata/cli.py:212 .././sonata/info.py:91 .././sonata/info.py:250 #: .././sonata/main.py:1186 .././sonata/tagedit.py:130 msgid "Track" msgstr "音轨" #: .././sonata/cli.py:213 .././sonata/info.py:91 .././sonata/info.py:249 #: .././sonata/library.py:49 .././sonata/main.py:1189 #: .././sonata/preferences.py:432 .././sonata/tagedit.py:139 msgid "Genre" msgstr "风格" #: .././sonata/cli.py:214 .././sonata/info.py:91 .././sonata/info.py:251 #: .././sonata/main.py:1191 msgid "File" msgstr "文件" #: .././sonata/cli.py:219 .././sonata/cli.py:221 msgid "Time" msgstr "时间" #: .././sonata/cli.py:222 .././sonata/info.py:91 .././sonata/info.py:244 msgid "Bitrate" msgstr "比特率" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD 已停止" #: .././sonata/cli.py:228 .././sonata/cli.py:230 .././sonata/cli.py:232 msgid "State" msgstr "状态" #: .././sonata/cli.py:228 msgid "Playing" msgstr "播放中" #: .././sonata/cli.py:230 msgid "Paused" msgstr "已暂停" #: .././sonata/cli.py:232 .././sonata/main.py:559 .././sonata/main.py:564 #: .././sonata/main.py:1836 .././sonata/main.py:1847 msgid "Stopped" msgstr "已停止" #: .././sonata/cli.py:234 .././sonata/cli.py:236 msgid "Repeat" msgstr "重复" #: .././sonata/cli.py:234 .././sonata/cli.py:238 msgid "Off" msgstr "关" #: .././sonata/cli.py:236 .././sonata/cli.py:240 msgid "On" msgstr "开" #: .././sonata/cli.py:238 .././sonata/cli.py:240 msgid "Random" msgstr "随机" #: .././sonata/cli.py:241 msgid "Volume" msgstr "音量" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "淡入淡出" #: .././sonata/cli.py:242 .././sonata/preferences.py:192 msgid "second" msgid_plural "seconds" msgstr[0] "秒" #: .././sonata/current.py:64 msgid "Filter" msgstr "过滤" #: .././sonata/dbus_plugin.py:83 msgid "" "Sonata failed to connect to the D-BUS session bus: Unable to determine the " "address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for " "help)" msgstr "" "Sonata 连接到 D-BUS session bus 失败:无法决定 message bus 的地址(尝试 'man " "dbus-launch' 和 'man dbus-daemon' 来获取帮助)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "执行远程命令失败。" #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "正在启动 Sonata ……" #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "也许 Sonata 没有运行?" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "Sonata 已经在运行中。正在显示……" #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "执行远程命令失败。" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "曲目信息" #: .././sonata/info.py:93 msgid "Launch artist in Wikipedia" msgstr "显示维基百科上该艺术家的资料" #: .././sonata/info.py:93 msgid "Launch album in Wikipedia" msgstr "显示维基百科上该专辑的资料" #: .././sonata/info.py:127 msgid "Toggle extra tags" msgstr "切换显示余下的标签" #: .././sonata/info.py:130 msgid "Edit song tags" msgstr "编辑曲目标签" #. Lyrics #: .././sonata/info.py:140 msgid "Lyrics" msgstr "歌词" #: .././sonata/info.py:152 msgid "Search Lyricwiki.org for lyrics" msgstr "在 Lyricwiki.org 上搜索歌词" #: .././sonata/info.py:153 msgid "Edit lyrics at Lyricwiki.org" msgstr "在 Lyricwiki.org 上编辑歌词" #. Album info #: .././sonata/info.py:161 msgid "Album Info" msgstr "专辑信息" #: .././sonata/info.py:213 .././sonata/info.py:218 msgid "more" msgstr "更多" #: .././sonata/info.py:215 msgid "hide" msgstr "隐藏" #: .././sonata/info.py:281 msgid "edit tags" msgstr "编辑标签" #: .././sonata/info.py:308 msgid "Album info not found." msgstr "未发现专辑信息。" #: .././sonata/info.py:311 msgid "Album name not set." msgstr "专辑名未设置。" #: .././sonata/info.py:324 msgid "ZSI not found, fetching lyrics support disabled." msgstr "ZSI 未找到,不能获取歌词。" #: .././sonata/info.py:329 msgid "Artist or song title not set." msgstr "艺术家或曲目标题未设置。" #: .././sonata/info.py:371 msgid "search" msgstr "搜索" #: .././sonata/info.py:372 msgid "edit" msgstr "编辑" #: .././sonata/info.py:381 .././sonata/info.py:436 msgid "Lyrics not found" msgstr "未发现歌词" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:401 msgid "Fetching lyrics..." msgstr "歌词获取中..." #: .././sonata/info.py:411 msgid "Couldn't connect to LyricWiki" msgstr "无法连接到 LyricWiki" #: .././sonata/info.py:439 msgid "Fetching lyrics failed" msgstr "获取歌词失败" #: .././sonata/library.py:47 msgid "Untagged" msgstr "无标签" #: .././sonata/library.py:48 msgid "Various Artists" msgstr "多位艺术家" #: .././sonata/library.py:49 msgid "Filename" msgstr "文件名" #: .././sonata/library.py:49 msgid "Everything" msgstr "所有" #: .././sonata/library.py:52 msgid "Filesystem" msgstr "文件系统" #: .././sonata/library.py:53 msgid "Artists" msgstr "艺术家" #: .././sonata/library.py:54 msgid "Albums" msgstr "专辑" #: .././sonata/library.py:55 msgid "Genres" msgstr "风格" #: .././sonata/library.py:84 msgid "Search terms" msgstr "搜索条件" #: .././sonata/library.py:90 msgid "End Search" msgstr "结束搜索" #: .././sonata/library.py:92 msgid "Library browsing view" msgstr "数据库浏览方式" #: .././sonata/library.py:96 msgid "Search" msgstr "搜索" #. Show text: #: .././sonata/library.py:761 .././sonata/main.py:1763 #: .././sonata/main.py:3331 msgid "song" msgid_plural "songs" msgstr[0] "首曲目" #: .././sonata/library.py:761 .././sonata/main.py:1757 msgid "minute" msgid_plural "minutes" msgstr[0] "分钟" #: .././sonata/library.py:849 msgid "Song" msgstr "曲目" #: .././sonata/library.py:849 .././sonata/main.py:1190 msgid "Path" msgstr "路径" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "当前曲目" #: .././sonata/main.py:103 msgid "Library" msgstr "数据库" #: .././sonata/main.py:104 msgid "Playlists" msgstr "播放列表" #: .././sonata/main.py:105 msgid "Streams" msgstr "流媒体" #: .././sonata/main.py:106 msgid "Info" msgstr "曲目信息" #: .././sonata/main.py:137 .././sonata/preferences.py:193 #: .././sonata/preferences.py:194 msgid "Entire song" msgstr "整首曲目" #: .././sonata/main.py:234 msgid "_Sort List" msgstr "排序列表(_S)" #: .././sonata/main.py:235 msgid "Sa_ve List to" msgstr "保存列表到(_v)" #: .././sonata/main.py:236 msgid "_Connection" msgstr "连接(_C)" #: .././sonata/main.py:237 msgid "P_lay after" msgstr "在动作执行后播放(_l)" #: .././sonata/main.py:238 .././sonata/main.py:2454 msgid "_Update" msgstr "更新(_U)" #: .././sonata/main.py:239 msgid "Use _Remote Image..." msgstr "使用远程图像(_R)..." #: .././sonata/main.py:240 msgid "Use _Local Image..." msgstr "使用本地图像(_L)..." #: .././sonata/main.py:241 msgid "_Fullscreen Mode" msgstr "全屏模式(_F)" #: .././sonata/main.py:242 msgid "Reset Image" msgstr "重置图像" #: .././sonata/main.py:243 msgid "_Play" msgstr "播放(_P)" #: .././sonata/main.py:244 msgid "Pa_use" msgstr "暂停(_u)" #: .././sonata/main.py:245 msgid "_Stop" msgstr "停止(_S)" #: .././sonata/main.py:246 msgid "Pre_vious" msgstr "上一首(_v)" #: .././sonata/main.py:247 msgid "_Next" msgstr "下一首(_N)" #: .././sonata/main.py:248 msgid "_Quit" msgstr "退出(_Q)" #: .././sonata/main.py:249 msgid "_Remove" msgstr "删除(_R)" #: .././sonata/main.py:250 msgid "_Clear" msgstr "清除(_C)" #: .././sonata/main.py:251 msgid "_Entire Library" msgstr "更新数据库全部(_E)" #: .././sonata/main.py:252 msgid "_Selected Items" msgstr "更新选择的项(_S)" #: .././sonata/main.py:253 msgid "_Preferences..." msgstr "偏好(_P)..." #: .././sonata/main.py:254 msgid "_About..." msgstr "关于(_A)..." #: .././sonata/main.py:255 msgid "_Edit Tags..." msgstr "编辑标签(_E)..." #: .././sonata/main.py:256 msgid "_Add" msgstr "添加(_A)" #: .././sonata/main.py:257 msgid "_Replace" msgstr "替换(_R)" #: .././sonata/main.py:258 msgid "Add" msgstr "添加" #: .././sonata/main.py:259 msgid "Replace" msgstr "替换" #: .././sonata/main.py:260 msgid "_Delete..." msgstr "删除(_D)..." #: .././sonata/main.py:261 msgid "Shuffle" msgstr "乱序" #: .././sonata/main.py:286 msgid "S_how Sonata" msgstr "显示(_h) Sonata" #: .././sonata/main.py:287 msgid "_Repeat" msgstr "重复(_R)" #: .././sonata/main.py:288 msgid "Rando_m" msgstr "随机(_m)" #: .././sonata/main.py:428 msgid "By Artist" msgstr "按 艺术家" #: .././sonata/main.py:429 msgid "By Album" msgstr "按 专辑" #: .././sonata/main.py:430 msgid "By Song Title" msgstr "按 曲目标题" #: .././sonata/main.py:431 msgid "By File Name" msgstr "按 文件名" #: .././sonata/main.py:432 msgid "By Dir & File Name" msgstr "按 目录及文件名" #: .././sonata/main.py:433 msgid "Reverse List" msgstr "反转列表" #: .././sonata/main.py:456 .././sonata/main.py:467 msgid "_New..." msgstr "新建(_N)..." #: .././sonata/main.py:457 msgid "_Edit..." msgstr "编辑(_E)..." #: .././sonata/main.py:468 msgid "_Rename..." msgstr "重命名(_R)..." #: .././sonata/main.py:530 .././sonata/main.py:597 .././sonata/main.py:598 msgid "Playlist" msgstr "播放列表" #: .././sonata/main.py:560 .././sonata/main.py:1840 .././sonata/main.py:2049 msgid "Click to expand" msgstr "点击展开" #: .././sonata/main.py:565 .././sonata/main.py:1838 .././sonata/main.py:2047 msgid "Click to collapse" msgstr "点击折叠" #: .././sonata/main.py:570 .././sonata/main.py:1732 .././sonata/main.py:1843 msgid "Not Connected" msgstr "未连接" #: .././sonata/main.py:572 .././sonata/main.py:1730 .././sonata/main.py:1845 msgid "No Read Permission" msgstr "没有读取权限" #: .././sonata/main.py:645 msgid "Cover Art" msgstr "封面" #: .././sonata/main.py:850 .././sonata/main.py:863 .././sonata/main.py:884 msgid "Profile" msgstr "档案" #: .././sonata/main.py:863 .././sonata/main.py:864 .././sonata/main.py:884 msgid "MPD_HOST/PORT" msgstr "MPD_HOST/PORT" #: .././sonata/main.py:865 .././sonata/main.py:871 msgid "Disconnect" msgstr "断开连接" #: .././sonata/main.py:1187 .././sonata/main.py:1194 msgid "#" msgstr "#" #: .././sonata/main.py:1188 .././sonata/preferences.py:431 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "年份" #: .././sonata/main.py:1192 msgid "Stream" msgstr "流媒体" #: .././sonata/main.py:1193 msgid "Len" msgstr "长度" #: .././sonata/main.py:1214 .././sonata/main.py:1221 .././sonata/main.py:1262 #: .././sonata/main.py:1269 msgid "Unknown" msgstr "未知" #: .././sonata/main.py:1753 msgid "day" msgid_plural "days" msgstr[0] "天" #: .././sonata/main.py:1761 msgid "hour" msgid_plural "hours" msgstr[0] "小时" #: .././sonata/main.py:1766 .././sonata/main.py:1768 msgid "and" msgstr "" #: .././sonata/main.py:1776 msgid "(updating mpd)" msgstr "(正在更新 mpd)" #: .././sonata/main.py:2116 msgid "Lyrics Search" msgstr "歌词搜索" #: .././sonata/main.py:2117 msgid "_Search" msgstr "搜索(_S)" #: .././sonata/main.py:2120 msgid "Artist Name" msgstr "艺术家" #: .././sonata/main.py:2125 msgid "Song Title" msgstr "曲目标题" #: .././sonata/main.py:2377 msgid "Open Image" msgstr "打开图像" #: .././sonata/main.py:2379 msgid "Images" msgstr "图像" #: .././sonata/main.py:2383 msgid "All files" msgstr "所有文件" #: .././sonata/main.py:2425 msgid "Choose Cover Art" msgstr "选择封面" #: .././sonata/main.py:2426 msgid "C_hoose" msgstr "选择(_h)" #: .././sonata/main.py:2459 msgid "Edit search terms" msgstr "编辑搜索条目" #: .././sonata/main.py:2516 msgid "No artist or album name found." msgstr "未发现艺术家或专辑名。" #: .././sonata/main.py:2519 msgid "No cover art found." msgstr "未发现封面。" #: .././sonata/main.py:2843 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "删除已选择的播放列表?" #: .././sonata/main.py:2843 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "删除播放列表" #: .././sonata/main.py:2851 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "删除已选择的流媒体?" #: .././sonata/main.py:2851 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "删除流媒体" #: .././sonata/main.py:2909 msgid "" "To save lyrics to the music file's directory, you must specify a valid music " "directory." msgstr "要将歌词保存到音乐文件的目录中,你必须指定一个有效的音乐目录。" #: .././sonata/main.py:2909 .././sonata/main.py:2916 msgid "Music Dir Verification" msgstr "音乐目录确认" #: .././sonata/main.py:2916 msgid "" "To save artwork to the music file's directory, you must specify a valid " "music directory." msgstr "要将封面保存到音乐文件的目录中,你必须指定一个有效的音乐目录。" #: .././sonata/main.py:3332 msgid "album" msgid_plural "albums" msgstr[0] "张专辑" #: .././sonata/main.py:3333 msgid "artist" msgid_plural "artists" msgstr[0] "位艺术家" #: .././sonata/main.py:3340 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "天的幸福" #: .././sonata/main.py:3342 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "个小时的幸福" #: .././sonata/playlists.py:103 .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "保存播放列表" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "你想替换掉现有的播放列表,还是添加这些曲目?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "现有播放列表" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "替换播放列表" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "添加曲目" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "播放列表的名字已经存在。是否替换?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "播放列表名字" #: .././sonata/playlists.py:182 .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "重命名播放列表" #. Constants: #: .././sonata/preferences.py:35 msgid "System tray" msgstr "系统托盘" #: .././sonata/preferences.py:35 msgid "Top Left" msgstr "左上角" #: .././sonata/preferences.py:35 msgid "Top Right" msgstr "右上角" #: .././sonata/preferences.py:35 msgid "Bottom Left" msgstr "左下角" #: .././sonata/preferences.py:35 msgid "Bottom Right" msgstr "右下角" #: .././sonata/preferences.py:35 msgid "Screen Center" msgstr "屏幕中央" #. MPD tab #: .././sonata/preferences.py:64 msgid "MPD Connection" msgstr "MPD 连接" #: .././sonata/preferences.py:76 msgid "_Name" msgstr "名字(_N)" #: .././sonata/preferences.py:79 msgid "_Host" msgstr "主机(_H)" #: .././sonata/preferences.py:82 msgid "_Port" msgstr "端口(_P)" #: .././sonata/preferences.py:86 msgid "_Music dir" msgstr "音乐目录(_M)" #: .././sonata/preferences.py:87 msgid "Select a Music Directory" msgstr "选择音乐目录" #: .././sonata/preferences.py:91 msgid "Pa_ssword" msgstr "口令(_s)" #: .././sonata/preferences.py:94 msgid "Leave blank if no password is required." msgstr "如果不需要口令则留空。" #: .././sonata/preferences.py:95 msgid "_Autoconnect on start" msgstr "启动时自动连接(_A)" #: .././sonata/preferences.py:113 msgid "Using MPD_HOST/PORT" msgstr "使用 MPD_HOST/PORT" #: .././sonata/preferences.py:163 .././sonata/preferences.py:536 msgid "Extras" msgstr "其它" #: .././sonata/preferences.py:168 msgid "_Audioscrobbling (Last.fm)" msgstr "_Audioscrobbling (Last.fm)" #: .././sonata/preferences.py:170 msgid "_Username:" msgstr "用户名(_U):" #: .././sonata/preferences.py:171 msgid "_Password:" msgstr "口令(_P):" #: .././sonata/preferences.py:188 msgid "Popup _notification on song changes" msgstr "当曲目改变时弹出提示(_n)" #: .././sonata/preferences.py:210 msgid "Fade length" msgstr "淡入淡出长度" #: .././sonata/preferences.py:211 msgid "_Fade length" msgstr "淡入淡出长度(_F)" #: .././sonata/preferences.py:213 msgid "sec" msgstr "秒" #: .././sonata/preferences.py:218 msgid "C_rossfade" msgstr "淡入淡出(_r)" #. Display tab #: .././sonata/preferences.py:246 .././sonata/preferences.py:533 msgid "Display" msgstr "显示" #: .././sonata/preferences.py:251 msgid "_Album art" msgstr "专辑封面(_A)" #: .././sonata/preferences.py:253 msgid "Standard" msgstr "标准" #: .././sonata/preferences.py:253 msgid "Stylized" msgstr "风格化" #: .././sonata/preferences.py:256 msgid "Artwork style:" msgstr "封面样式:" #: .././sonata/preferences.py:258 msgid "Local only" msgstr "仅限本地" #: .././sonata/preferences.py:258 msgid "Local and remote" msgstr "本地与远程" #: .././sonata/preferences.py:260 msgid "Search locations:" msgstr "搜索位置:" #: .././sonata/preferences.py:267 .././sonata/preferences.py:289 msgid "SONG_DIR" msgstr "曲目目录" #: .././sonata/preferences.py:269 msgid "custom" msgstr "自定义" #: .././sonata/preferences.py:274 msgid "Save art to:" msgstr "保存封面到:" #: .././sonata/preferences.py:277 msgid "_Playback/volume buttons" msgstr "播放/音量按钮(_P)" #: .././sonata/preferences.py:280 msgid "Pr_ogressbar" msgstr "进度条(_o)" #: .././sonata/preferences.py:283 msgid "_Statusbar" msgstr "状态栏(_S)" #: .././sonata/preferences.py:286 msgid "Song Ly_rics" msgstr "歌词(_r)" #: .././sonata/preferences.py:288 msgid "Save lyrics to:" msgstr "保存歌词到:" #: .././sonata/preferences.py:297 msgid "System _tray icon" msgstr "系统托盘(_t)" #. Behavior tab #: .././sonata/preferences.py:319 msgid "Window Behavior" msgstr "窗口行为" #: .././sonata/preferences.py:323 msgid "_Show window on all workspaces" msgstr "在所有工作区显示窗口(_S)" #: .././sonata/preferences.py:326 msgid "_Keep window above other windows" msgstr "将窗口置于其它窗口上方(_K)" #: .././sonata/preferences.py:329 msgid "_Hide window titlebar" msgstr "隐藏窗口标题栏(_H)" #: .././sonata/preferences.py:334 msgid "_Minimize to system tray on close/escape" msgstr "关闭时最小化到系统托盘(_M)" #: .././sonata/preferences.py:336 msgid "" "If enabled, closing Sonata will minimize it to the system tray. Note that " "it's currently impossible to detect if there actually is a system tray, so " "only check this if you have one." msgstr "" "如果启用,Sonata 关闭时将会最小化到系统托盘上。注意目前它还不能检测到是否真的" "有系统托盘,所以仅当你有系统托盘时才选择此选项。" #: .././sonata/preferences.py:350 msgid "Miscellaneous" msgstr "其它" #: .././sonata/preferences.py:354 msgid "_Update MPD library on start" msgstr "启动时更新 MPD 数据库(_U)" #: .././sonata/preferences.py:356 msgid "" "If enabled, Sonata will automatically update your MPD library when it starts " "up." msgstr "如果启用,Sonata 将在启动时自动更新你的 MPD 数据库。" #: .././sonata/preferences.py:358 msgid "S_top playback on exit" msgstr "退出时停止播放(_t)" #: .././sonata/preferences.py:360 msgid "" "MPD allows playback even when the client is not open. If enabled, Sonata " "will behave like a more conventional music player and, instead, stop " "playback upon exit." msgstr "" "即使客户端没有打开,MPD 仍然允许播放。如果启用此选项,Sonata 将更像一个习惯上" "的音乐播放器,在退出的时候停止播放。" #: .././sonata/preferences.py:362 msgid "_Write status file:" msgstr "将状态写入文件(_W):" #: .././sonata/preferences.py:364 .././sonata/preferences.py:366 msgid "" "If enabled, Sonata will create a xmms-infopipe like file containing " "information about the current song. Many applications support the xmms-info " "file (Instant Messengers, IRC Clients...)" msgstr "" "如果启用,Sonata 将建立一个类似管道的文件 xmms-info,包含关于当前曲目的信息。" "许多应用程序支持 xmms-info 文件(即时通讯软件、IRC 客户端……)" #. Format tab #: .././sonata/preferences.py:392 msgid "Song Formatting" msgstr "曲目格式" #: .././sonata/preferences.py:397 msgid "C_urrent playlist:" msgstr "当前播放列表(_u):" #: .././sonata/preferences.py:398 msgid "_Library:" msgstr "数据库(_L):" #: .././sonata/preferences.py:399 msgid "_Window title:" msgstr "窗口标题(_W):" #: .././sonata/preferences.py:400 msgid "Current _song line 1:" msgstr "当前曲目第一行(_s):" #: .././sonata/preferences.py:402 msgid "Current s_ong line 2:" msgstr "当前曲目第二行(_o):" #: .././sonata/preferences.py:422 msgid "Available options" msgstr "可用选项" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:426 msgid "Artist name" msgstr "艺术家名字" #: .././sonata/preferences.py:427 msgid "Album name" msgstr "专辑名" #: .././sonata/preferences.py:428 msgid "Track name" msgstr "音轨名" #: .././sonata/preferences.py:429 msgid "Track number" msgstr "音轨编号" #: .././sonata/preferences.py:430 msgid "Disc number" msgstr "唱片编号" #: .././sonata/preferences.py:433 msgid "File path" msgstr "文件路径" #: .././sonata/preferences.py:434 msgid "File name" msgstr "文件名" #: .././sonata/preferences.py:435 .././sonata/streams.py:109 msgid "Stream name" msgstr "流媒体名字" #: .././sonata/preferences.py:436 msgid "Song length" msgstr "曲目长度" #: .././sonata/preferences.py:437 msgid "Elapsed time (title only)" msgstr "已播放时间(仅限标题用)" #: .././sonata/preferences.py:448 msgid "Info displayed only if all enclosed tags are defined" msgstr "仅当结组中的所有标签都有定义时才会显示信息" #: .././sonata/preferences.py:448 msgid "Creates columns in the current playlist" msgstr "在当前播放列表建立分栏" #: .././sonata/preferences.py:473 msgid "_About" msgstr "关于(_A)" #: .././sonata/preferences.py:474 msgid "_Configure..." msgstr "配置(_C)..." #: .././sonata/preferences.py:513 msgid "Loaded" msgstr "已载入" #: .././sonata/preferences.py:521 msgid "Description" msgstr "描述" #. Set up table #: .././sonata/preferences.py:532 msgid "MPD" msgstr "MPD" #: .././sonata/preferences.py:534 msgid "Behavior" msgstr "行为" #: .././sonata/preferences.py:535 msgid "Format" msgstr "格式" #: .././sonata/preferences.py:605 msgid "New Profile" msgstr "新档案" #. Prompt user for playlist name: #: .././sonata/preferences.py:659 msgid "Custom Artwork" msgstr "自定义封面" #: .././sonata/preferences.py:661 msgid "Artwork filename" msgstr "封面文件名" #: .././sonata/streams.py:105 msgid "Edit Stream" msgstr "编辑流" #: .././sonata/streams.py:107 .././sonata/streams.py:138 msgid "New Stream" msgstr "新建流" #: .././sonata/streams.py:116 msgid "Stream URL" msgstr "流媒体 URL" #: .././sonata/streams.py:138 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "流的名字已经存在。是否替换?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "TagLib 与/或 TagPy 未找到,不能编辑标签。" #: .././sonata/tagedit.py:61 .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "编辑标签" #: .././sonata/tagedit.py:70 msgid "" "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support " "disabled." msgstr "TagPy 版本 < 0.91 ,不能编辑标签。请升级到较新的版本。" #: .././sonata/tagedit.py:75 msgid "The path" msgstr "路径" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "不存在。请在偏好设置中指定一个有效的音乐目录。" #: .././sonata/tagedit.py:99 msgid "File " msgstr "文件 " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr " 未找到。请在偏好设置中指定一个有效的音乐目录。" #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "没有可以编辑标签的音乐文件。" #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "注解" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "保存全部(_A)" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "" "设置此文件的音轨编号为 1,从此文件开始递增地设置每一个已选择的音乐文件的音轨" "编号。" #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "应用到所有已选择的音乐文件。" #: .././sonata/tagedit.py:260 msgid "of" msgstr "of" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "不能将标签保存到音乐文件。" #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "隐藏文件路径" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "显示文件路径" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "popup 参数需要 D-Bus。放弃中。" #, fuzzy #~ msgid "_Update Path" #~ msgstr "更新(_U)" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "网站: http://sonata.berlios.de/" #~ msgid "Enable Audioscrobbler" #~ msgstr "启用 Audioscrobbler" #~ msgid "Enable Crossfade" #~ msgstr "启用渐变" #~ msgid "Enable album art" #~ msgstr "启用封面" #~ msgid "Enable lyrics" #~ msgstr "启用歌词" #~ msgid "Enable system tray icon" #~ msgstr "启用系统托盘图标" #~ msgid "_Display" #~ msgstr "显示(_D)" #~ msgid "_Extras" #~ msgstr "其它(_E)" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "PyGTK+ 2.10 或 gnome-python-extras 未找到,禁用系统托盘。" #~ msgid "Reset to Default" #~ msgstr "重置为默认" #~ msgid "_New Playlist..." #~ msgstr "新建播放列表(_N)..." #~ msgid "Notification" #~ msgstr "提示" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "Python 2.5 或 python-elementtree 未找到,禁用 audioscrobbler。" #~ msgid "Audioscrobbler Verification" #~ msgstr "Audioscrobbler 确认" #~ msgid "Update library for selected item(s)" #~ msgstr "更新选择的项" #~ msgid "_Shuffle" #~ msgstr "随机(_S)" #~ msgid "Toggle shuffle mode" #~ msgstr "切换随机模式" #~ msgid "Not connected" #~ msgstr "未连接" #~ msgid "Press enter to search for these terms." #~ msgstr "按 enter 键来搜索这些词条。" #~ msgid "Add new profile" #~ msgstr "添加新的档案" #~ msgid "Remove current profile" #~ msgstr "删除当前档案" #~ msgid "Play enqueued files on activate" #~ msgstr "播放加入队列的文件" #~ msgid "" #~ "Automatically play enqueued items when activated via double-click or " #~ "enter." #~ msgstr "当通过双击或按 enter 键向队列中加入曲目后,自动播放加入的曲目。" #~ msgid "Add selected song(s) or directory(s)" #~ msgstr "添加选择的曲目或目录" #~ msgid "Replace with selected song(s) or directory(s)" #~ msgstr "替换为选择的曲目或目录" #~ msgid "Add to _Queue" #~ msgstr "添加到队列(_Q)" #~ msgid "Remove from _Queue" #~ msgstr "从队列删除(_Q)" #~ msgid "Add selected song(s) to playlist queue" #~ msgstr "添加选择的曲目到播放队列" #~ msgid "Remove selected song(s) from playlist queue" #~ msgstr "从播放队列中删除选择的曲目" #~ msgid "seconds" #~ msgstr "秒" #~ msgid "Song Info..." #~ msgstr "曲目信息..." #~ msgid "Click to collapse the player" #~ msgstr "点击折叠播放器" #~ msgid "Click to expand the player" #~ msgstr "点击展开播放器" #~ msgid "_Song Info" #~ msgstr "曲目信息(_S)" #~ msgid "_Search..." #~ msgstr "搜索(_S)..." #~ msgid "Remote only" #~ msgstr "仅限远程" #~ msgid "Remote, then local" #~ msgstr "先远程,后本地" #~ msgid "To save artwork as" #~ msgstr "要保存封面为" #~ msgid "Artwork Verification" #~ msgstr "封面确认" #~ msgid "Switch to current playlist" #~ msgstr "切换到当前曲目" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/po/zh_TW.po��������������������������������������������������������������������������0000664�0000000�0000000�00000110651�11255764730�0015173�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������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. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: sonata\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-04-10 10:01+0800\n" "PO-Revision-Date: 2009-04-10 10:22+0800\n" "Last-Translator: b4283 <da.mi.spirit@gmail.com>\n" "Language-Team: Traditional Chinese (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" #. define the shortcuts and their descriptions #. these are all gettextable #: .././sonata/about.py:54 msgid "About Sonata" msgstr "關於 Sonata" #: .././sonata/about.py:55 #: .././sonata/preferences.py:96 msgid "Preferences" msgstr "偏好設定" #: .././sonata/about.py:56 msgid "Fullscreen Artwork Mode" msgstr "全螢幕封面模式" #: .././sonata/about.py:57 msgid "Switch to [1st-5th] tab" msgstr "切換至第一至第五個分頁" #: .././sonata/about.py:58 msgid "Connect to MPD" msgstr "連線至 MPD" #: .././sonata/about.py:59 msgid "Disconnect from MPD" msgstr "自 MPD 斷線" #: .././sonata/about.py:60 msgid "Randomize current playlist" msgstr "將當前清單亂數化" #: .././sonata/about.py:61 msgid "Expand player" msgstr "放大播放器" #: .././sonata/about.py:62 msgid "Switch to previous tab" msgstr "切換至第一至第五個分頁" #: .././sonata/about.py:63 msgid "Switch to next tab" msgstr "切換至第一至第五個分頁" #: .././sonata/about.py:64 msgid "Collapse player" msgstr "縮小播放器" #: .././sonata/about.py:65 #: .././sonata/library.py:79 msgid "Search library" msgstr "搜尋音樂庫" #: .././sonata/about.py:66 msgid "Quit" msgstr "離開" #: .././sonata/about.py:67 msgid "Update entire library" msgstr "更新整個音樂庫" #: .././sonata/about.py:68 msgid "Display popup menu" msgstr "顯示跳出菜單" #: .././sonata/about.py:69 msgid "Minimize to system tray (if enabled)" msgstr "縮至系統列 (如果有開啟)" #: .././sonata/about.py:71 msgid "Previous track" msgstr "前一軌" #: .././sonata/about.py:72 msgid "Next track" msgstr "下一軌" #: .././sonata/about.py:73 msgid "Play/Pause" msgstr "播放/暫停" #: .././sonata/about.py:74 msgid "Stop" msgstr "停止" #: .././sonata/about.py:75 msgid "Lower the volume" msgstr "降低音量" #: .././sonata/about.py:76 msgid "Raise the volume" msgstr "提高音量" #: .././sonata/about.py:78 msgid "Play selected song" msgstr "播放選定歌曲" #: .././sonata/about.py:79 msgid "Remove selected song(s)" msgstr "移除選定歌曲" #: .././sonata/about.py:80 msgid "Center currently playing song" msgstr "移至目前播放中的曲子" #: .././sonata/about.py:81 #: .././sonata/about.py:90 msgid "Edit selected song's tags" msgstr "編輯選定歌曲的標籤" #: .././sonata/about.py:82 msgid "Save to new playlist" msgstr "存至新清單" #: .././sonata/about.py:83 msgid "Clear list" msgstr "清除清單" #: .././sonata/about.py:84 msgid "Randomize list" msgstr "清單亂數化" #: .././sonata/about.py:86 msgid "Add selected song(s) or enter directory" msgstr "新增選定歌曲,或進入目錄" #: .././sonata/about.py:87 msgid "Go to parent directory" msgstr "回上一目錄" #: .././sonata/about.py:88 msgid "Add selected item(s)" msgstr "新增選定項目" #: .././sonata/about.py:89 msgid "Replace with selected item(s)" msgstr "用選定項目替代" #: .././sonata/about.py:91 msgid "Add selected item(s) and play" msgstr "新增選定項目並播放" #: .././sonata/about.py:92 msgid "Replace with selected item(s) and play" msgstr "以選定項目替代並播放" #: .././sonata/about.py:93 msgid "Update selected item(s)/path(s)" msgstr "新增選定項目" #: .././sonata/about.py:95 #: .././sonata/about.py:97 msgid "Add selected playlist(s)" msgstr "新增選定清單" #: .././sonata/about.py:96 msgid "Remove selected playlist(s)" msgstr "移除選定清單" #: .././sonata/about.py:98 msgid "Replace with selected playlist(s)" msgstr "以選定清單替代" #: .././sonata/about.py:99 msgid "Add selected playlist(s) and play" msgstr "新增選定清單並播放" #: .././sonata/about.py:100 msgid "Replace with selected playlist(s) and play" msgstr "以選定清單替代並播放" #: .././sonata/about.py:102 #: .././sonata/about.py:104 msgid "Add selected stream(s)" msgstr "新增選定串流" #: .././sonata/about.py:103 msgid "Remove selected stream(s)" msgstr "移除選定串流" #: .././sonata/about.py:105 msgid "Replace with selected stream(s)" msgstr "以選定串流替代" #: .././sonata/about.py:106 msgid "Add selected stream(s) and play" msgstr "新增選定串流並播放" #: .././sonata/about.py:107 msgid "Replace with selected stream(s) and play" msgstr "以選定串流替代並播放" #: .././sonata/about.py:109 msgid "Edit playing song's tags" msgstr "編輯目前播放歌曲的標籤" #. define the main array- this adds headings to each section of #. shortcuts that will be displayed #: .././sonata/about.py:112 msgid "Main Shortcuts" msgstr "主要捷徑" #: .././sonata/about.py:113 msgid "Playback Shortcuts" msgstr "播放控制捷徑" #: .././sonata/about.py:114 msgid "Current Shortcuts" msgstr "「當前清單」捷徑" #: .././sonata/about.py:115 msgid "Library Shortcuts" msgstr "「音樂庫」分頁捷徑" #: .././sonata/about.py:116 msgid "Playlist Shortcuts" msgstr "「清單列」捷徑" #: .././sonata/about.py:117 msgid "Stream Shortcuts" msgstr "「串流」分頁捷徑" #: .././sonata/about.py:118 msgid "Info Shortcuts" msgstr "「詳細」分頁捷徑" #: .././sonata/about.py:119 msgid "Shortcuts" msgstr "捷徑" #. XXX translate expressions, not words #. Show text: #: .././sonata/about.py:147 #: .././sonata/library.py:856 #: .././sonata/main.py:1756 msgid "song" msgid_plural "songs" msgstr[0] "首歌曲" msgstr[1] "首歌曲" #: .././sonata/about.py:148 msgid "album" msgid_plural "albums" msgstr[0] "張專輯" msgstr[1] "張專輯" #: .././sonata/about.py:149 msgid "artist" msgid_plural "artists" msgstr[0] "位演奏人" msgstr[1] "位演奏人" #: .././sonata/about.py:156 msgid "day of bliss" msgid_plural "days of bliss" msgstr[0] "晝夜的天籟" msgstr[1] "晝夜的天籟" #: .././sonata/about.py:158 msgid "hour of bliss" msgid_plural "hours of bliss" msgstr[0] "時辰的天籟" msgstr[1] "時辰的天籟" #: .././sonata/about.py:172 msgid "An elegant music client for MPD." msgstr "優雅的 MPD 音樂客端。" #. Add button to show keybindings: #: .././sonata/about.py:185 msgid "_Shortcuts" msgstr "捷徑 (_S)" #: .././sonata/about.py:196 #: .././sonata/main.py:3103 #: .././sonata/preferences.py:880 msgid "Unable to launch a suitable browser." msgstr "無法開啟合適的瀏覽器。" #: .././sonata/about.py:196 #: .././sonata/main.py:3103 #: .././sonata/preferences.py:880 msgid "Launch Browser" msgstr "開啟瀏覽器" #: .././sonata/cli.py:81 msgid "The toggle and popup arguments require D-Bus. Aborting." msgstr "這個開關需要 D-Bus,中止。" #: .././sonata/cli.py:97 msgid "Version" msgstr "版本: Sonata" #: .././sonata/cli.py:98 msgid "Website" msgstr "網站" #: .././sonata/cli.py:103 msgid "Usage: sonata [OPTION]... [COMMAND]..." msgstr "用法: sonata [選項]" #: .././sonata/cli.py:105 msgid "Options" msgstr "選項" #: .././sonata/cli.py:106 msgid "Show this help and exit" msgstr "顯示本說明並離開" #: .././sonata/cli.py:107 msgid "Popup song notification (requires D-Bus)" msgstr "跳出視窗提示 (需要 DBus)" #: .././sonata/cli.py:108 msgid "Toggles whether the app is minimized" msgstr "不管程式縮至系統列" #: .././sonata/cli.py:109 msgid "to tray or visible (requires D-Bus)" msgstr "或者顯示都打開視窗(需要 D-Bus)" #: .././sonata/cli.py:110 msgid "Don't start app if D-Bus commands fail" msgstr "如果 D-Bus 命令失效就不要開啟程式" #: .././sonata/cli.py:111 msgid "Show version information and exit" msgstr "顯示版本資料後離開" #: .././sonata/cli.py:112 msgid "Start app hidden (requires systray)" msgstr "以隱藏方式啟動 (需要系統列)" #: .././sonata/cli.py:113 msgid "Start app visible (requires systray)" msgstr "以明顯視窗啟動 (需要系統列)" #: .././sonata/cli.py:114 msgid "Start with profile [NUM]" msgstr "使用 [NUM] 號設定檔啟動" #: .././sonata/cli.py:116 msgid "Commands" msgstr "註解" #: .././sonata/cli.py:117 msgid "Play song in playlist" msgstr "播放清單中的曲子" #: .././sonata/cli.py:118 msgid "Pause currently playing song" msgstr "暫停目前的曲子" #: .././sonata/cli.py:119 msgid "Stop currently playing song" msgstr "停止目前的曲子" #: .././sonata/cli.py:120 msgid "Play next song in playlist" msgstr "跳至清單的下一首" #: .././sonata/cli.py:121 msgid "Play previous song in playlist" msgstr "跳至清單的前一首" #: .././sonata/cli.py:122 msgid "Toggle play/pause; plays if stopped" msgstr "播放/暫停之間切換" #: .././sonata/cli.py:123 msgid "Toggle repeat mode" msgstr "啟動重複播放" #: .././sonata/cli.py:124 msgid "Toggle random mode" msgstr "啟動重複播放" #: .././sonata/cli.py:125 msgid "Display current song info" msgstr "顯示目前歌曲詳細" #: .././sonata/cli.py:126 msgid "Display MPD status" msgstr "顯示 MPD 狀態" #: .././sonata/cli.py:134 #, python-format msgid "Starting Sonata with profile %s..." msgstr "使用 %s 號設定檔開啟 Sonata…" #: .././sonata/cli.py:136 #, python-format msgid "%d is not an available profile number." msgstr "%d 不是有效的設定檔號碼。" #: .././sonata/cli.py:137 #: .././sonata/cli.py:141 #, python-format msgid "Profile numbers must be between 1 and %d." msgstr "不是有效的設定檔號碼,號碼必須介於 1 和 %d 之間。" #: .././sonata/cli.py:140 #, python-format msgid "Python is unable to interpret %s as a number." msgstr "Python 無法識讀 %s 為一個號碼。" #: .././sonata/cli.py:154 #: .././sonata/main.py:178 msgid "Default Profile" msgstr "預設設定檔" #: .././sonata/cli.py:154 #: .././sonata/main.py:178 msgid "by" msgstr "" #: .././sonata/cli.py:154 #: .././sonata/main.py:178 msgid "from" msgstr "" #: .././sonata/cli.py:176 msgid "" "Unable to connect to MPD.\n" "Please check your Sonata preferences or MPD_HOST/MPD_PORT environment variables." msgstr "" "無法連線至 MPD。\n" "請檢查你的 Sonata 設定,和 MPD_HOST/MPD_PORT 環境變數。" #: .././sonata/cli.py:208 #: .././sonata/info.py:90 #: .././sonata/library.py:45 #: .././sonata/tagedit.py:125 msgid "Title" msgstr "曲名" #: .././sonata/cli.py:209 #: .././sonata/info.py:91 #: .././sonata/library.py:45 #: .././sonata/main.py:1180 #: .././sonata/tagedit.py:126 msgid "Artist" msgstr "演奏人" #: .././sonata/cli.py:210 #: .././sonata/info.py:93 #: .././sonata/library.py:45 #: .././sonata/main.py:1181 #: .././sonata/main.py:2432 #: .././sonata/tagedit.py:127 msgid "Album" msgstr "專輯" #: .././sonata/cli.py:211 #: .././sonata/info.py:95 msgid "Date" msgstr "日期" #: .././sonata/cli.py:212 #: .././sonata/info.py:96 #: .././sonata/main.py:1182 #: .././sonata/tagedit.py:130 msgid "Track" msgstr "音軌" #: .././sonata/cli.py:213 #: .././sonata/info.py:97 #: .././sonata/library.py:45 #: .././sonata/main.py:1185 #: .././sonata/preferences.py:557 #: .././sonata/tagedit.py:139 msgid "Genre" msgstr "類型" #: .././sonata/cli.py:214 #: .././sonata/info.py:98 #: .././sonata/main.py:1187 msgid "File" msgstr "檔案" #: .././sonata/cli.py:219 #: .././sonata/cli.py:221 msgid "Time" msgstr "時間" #: .././sonata/cli.py:222 #: .././sonata/info.py:99 msgid "Bitrate" msgstr "位元率" #: .././sonata/cli.py:224 msgid "MPD stopped" msgstr "MPD 已停止" #: .././sonata/cli.py:228 #: .././sonata/cli.py:230 #: .././sonata/cli.py:232 msgid "State" msgstr "狀態" #: .././sonata/cli.py:228 msgid "Playing" msgstr "播放中" #: .././sonata/cli.py:230 msgid "Paused" msgstr "暫停" #: .././sonata/cli.py:232 #: .././sonata/main.py:562 #: .././sonata/main.py:567 #: .././sonata/main.py:1829 #: .././sonata/main.py:1840 msgid "Stopped" msgstr "已停止" #: .././sonata/cli.py:234 #: .././sonata/cli.py:236 msgid "Repeat" msgstr "重複" #: .././sonata/cli.py:234 #: .././sonata/cli.py:238 msgid "Off" msgstr "關閉" #: .././sonata/cli.py:236 #: .././sonata/cli.py:240 msgid "On" msgstr "開啟" #: .././sonata/cli.py:238 #: .././sonata/cli.py:240 msgid "Random" msgstr "隨機" #: .././sonata/cli.py:241 msgid "Volume" msgstr "音量" #: .././sonata/cli.py:242 msgid "Crossfade" msgstr "淡入淡出" #: .././sonata/cli.py:242 #: .././sonata/preferences.py:277 msgid "second" msgid_plural "seconds" msgstr[0] "秒" msgstr[1] "秒" #: .././sonata/current.py:64 msgid "Filter" msgstr "篩選" #: .././sonata/dbus_plugin.py:83 msgid "Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)" msgstr "Sonata 無法連線至 D-BUS: 無法得知 message bus 的位址。(試著用 man dbus-launch 和 man dbus-daemon 指令獲取協助)" #: .././sonata/dbus_plugin.py:96 msgid "Failed to execute remote commands." msgstr "無法執行遠端命令。" #: .././sonata/dbus_plugin.py:98 msgid "Starting Sonata instead..." msgstr "使用設定檔開啟 Sonata" #: .././sonata/dbus_plugin.py:100 msgid "Maybe Sonata is not running?" msgstr "已經有另一個 Sonata 使用中。" #: .././sonata/dbus_plugin.py:114 msgid "An instance of Sonata is already running. Showing it..." msgstr "已經有另一個 Sonata 使用中。" #: .././sonata/dbus_plugin.py:120 msgid "Failed to execute remote command." msgstr "無法執行遠端命令。" #. Song info #: .././sonata/info.py:78 msgid "Song Info" msgstr "歌曲詳細" #: .././sonata/info.py:92 msgid "Launch artist in Wikipedia" msgstr "在維基百科中搜尋該演奏人" #: .././sonata/info.py:94 msgid "Launch album in Wikipedia" msgstr "在維基百科中搜尋該專輯" #: .././sonata/info.py:128 msgid "Toggle extra tags" msgstr "啟動額外的標籤設定" #: .././sonata/info.py:131 msgid "Edit song tags" msgstr "編輯歌曲標籤" #. Lyrics #: .././sonata/info.py:141 msgid "Lyrics" msgstr "歌詞" #: .././sonata/info.py:153 msgid "Search Lyricwiki.org for lyrics" msgstr "在 lyricwiki.org 上搜尋歌曲" #: .././sonata/info.py:154 msgid "Edit lyrics at Lyricwiki.org" msgstr "在 lyricwiki.org 編輯歌詞" #. Album info #: .././sonata/info.py:162 msgid "Album Info" msgstr "專輯詳細" #: .././sonata/info.py:214 #: .././sonata/info.py:219 msgid "more" msgstr "更多" #: .././sonata/info.py:216 msgid "hide" msgstr "隱藏" #: .././sonata/info.py:282 msgid "edit tags" msgstr "編輯標籤" #: .././sonata/info.py:309 msgid "Album info not found." msgstr "找不到專輯資料。" #: .././sonata/info.py:312 msgid "Album name not set." msgstr "未設定專輯名。" #: .././sonata/info.py:326 msgid "ZSI not found, fetching lyrics support disabled." msgstr "沒有 ZSI,抓取歌詞關閉。" #: .././sonata/info.py:331 msgid "Artist or song title not set." msgstr "未設定演奏人或曲名" #: .././sonata/info.py:373 msgid "search" msgstr "搜尋" #: .././sonata/info.py:374 msgid "edit" msgstr "編輯標籤" #: .././sonata/info.py:383 #: .././sonata/info.py:438 msgid "Lyrics not found" msgstr "找不到歌詞" #. Fetch lyrics from lyricwiki.org #: .././sonata/info.py:403 msgid "Fetching lyrics..." msgstr "抓取歌詞中..." #: .././sonata/info.py:413 msgid "Couldn't connect to LyricWiki" msgstr "無法連線至 LyricWiki" #: .././sonata/info.py:441 msgid "Fetching lyrics failed" msgstr "抓取歌詞失敗" #: .././sonata/library.py:43 msgid "Untagged" msgstr "未標籤" #: .././sonata/library.py:44 msgid "Various Artists" msgstr "多元演奏人" #: .././sonata/library.py:45 msgid "Filename" msgstr "檔名" #: .././sonata/library.py:45 msgid "Everything" msgstr "所有" #: .././sonata/library.py:77 msgid "Search terms" msgstr "編輯搜尋詞" #: .././sonata/library.py:83 msgid "End Search" msgstr "結束搜尋" #: .././sonata/library.py:85 msgid "Library browsing view" msgstr "瀏覽音樂庫" #. disabled as breadcrumbs replace this: #. self.searchbox.pack_start(self.libraryview, False, False, 1) #. self.searchbox.pack_start(gtk.VSeparator(), False, False, 2) #: .././sonata/library.py:89 msgid "Search" msgstr "搜尋" #: .././sonata/library.py:110 msgid "Filesystem" msgstr "檔案系統" #: .././sonata/library.py:112 msgid "Albums" msgstr "專輯" #: .././sonata/library.py:114 msgid "Artists" msgstr "演奏人" #: .././sonata/library.py:116 msgid "Genres" msgstr "類型" #. add the views button first #: .././sonata/library.py:376 msgid " v " msgstr "" #: .././sonata/library.py:856 #: .././sonata/main.py:1750 msgid "minute" msgid_plural "minutes" msgstr[0] "分" msgstr[1] "分" #: .././sonata/library.py:944 msgid "Song" msgstr "曲" #: .././sonata/library.py:944 #: .././sonata/main.py:1186 msgid "Path" msgstr "路徑" #. Constants #: .././sonata/main.py:102 msgid "Current" msgstr "當前" #: .././sonata/main.py:103 msgid "Library" msgstr "音樂庫" #: .././sonata/main.py:104 msgid "Playlists" msgstr "播放清單" #: .././sonata/main.py:105 msgid "Streams" msgstr "串流" #: .././sonata/main.py:106 msgid "Info" msgstr "詳細" #: .././sonata/main.py:137 #: .././sonata/preferences.py:278 #: .././sonata/preferences.py:279 msgid "Entire song" msgstr "整首曲子" #: .././sonata/main.py:236 msgid "_Sort List" msgstr "排序 (_S)" #: .././sonata/main.py:237 msgid "Sa_ve List to" msgstr "儲存清單至 (_V)" #: .././sonata/main.py:238 msgid "_Connection" msgstr "連線 (_C)" #: .././sonata/main.py:239 msgid "P_lay after" msgstr "在...之後播放 (_L)" #: .././sonata/main.py:240 #: .././sonata/main.py:2446 msgid "_Update" msgstr "更新 (_U)" #: .././sonata/main.py:241 msgid "Use _Remote Image..." msgstr "使用遠端圖案... (_R)" #: .././sonata/main.py:242 msgid "Use _Local Image..." msgstr "使用本地圖案... (_L)" #: .././sonata/main.py:243 msgid "_Fullscreen Mode" msgstr "全螢幕模式 (_F)" #: .././sonata/main.py:244 msgid "Reset Image" msgstr "打開影像" #: .././sonata/main.py:245 msgid "_Play" msgstr "播放 (_P)" #: .././sonata/main.py:246 msgid "Pa_use" msgstr "暫停 (_P)" #: .././sonata/main.py:247 msgid "_Stop" msgstr "停止 (_S)" #: .././sonata/main.py:248 msgid "Pre_vious" msgstr "前一首 (_V)" #: .././sonata/main.py:249 msgid "_Next" msgstr "下一首 (_N)" #: .././sonata/main.py:250 msgid "_Quit" msgstr "離開 (_Q)" #: .././sonata/main.py:251 msgid "_Remove" msgstr "移除 (_R)" #: .././sonata/main.py:252 msgid "_Clear" msgstr "清除 (_C)" #: .././sonata/main.py:253 msgid "_Entire Library" msgstr "整個音樂庫 (_E)" #: .././sonata/main.py:254 msgid "_Selected Items" msgstr "選定項目 (_S)" #: .././sonata/main.py:255 msgid "_Preferences..." msgstr "偏好設定 (_P)" #: .././sonata/main.py:256 msgid "_About..." msgstr "關於 (_A)" #: .././sonata/main.py:257 msgid "_Edit Tags..." msgstr "編輯標籤... (_E)" #: .././sonata/main.py:258 msgid "_Add" msgstr "新增 (_A)" #: .././sonata/main.py:259 msgid "_Replace" msgstr "替代 (_R)" #: .././sonata/main.py:260 msgid "Add" msgstr "新增" #: .././sonata/main.py:261 msgid "Replace" msgstr "替代" #: .././sonata/main.py:262 msgid "_Delete..." msgstr "刪除 (_D)" #: .././sonata/main.py:263 msgid "Shuffle" msgstr "隨機" #: .././sonata/main.py:288 msgid "S_how Sonata" msgstr "顯示 Sonata (_H)" #: .././sonata/main.py:289 msgid "_Repeat" msgstr "重複 (_R)" #: .././sonata/main.py:290 msgid "Rando_m" msgstr "隨機 (_M)" #: .././sonata/main.py:431 msgid "By Artist" msgstr "演奏人" #: .././sonata/main.py:432 msgid "By Album" msgstr "專輯" #: .././sonata/main.py:433 msgid "By Song Title" msgstr "曲名" #: .././sonata/main.py:434 msgid "By File Name" msgstr "檔名" #: .././sonata/main.py:435 msgid "By Dir & File Name" msgstr "路徑及檔名" #: .././sonata/main.py:436 msgid "Reverse List" msgstr "反轉清單" #: .././sonata/main.py:459 #: .././sonata/main.py:470 msgid "_New..." msgstr "新的... (_N)" #: .././sonata/main.py:460 msgid "_Edit..." msgstr "編輯... (_E)" #: .././sonata/main.py:471 msgid "_Rename..." msgstr "重新命名... (_R)" #: .././sonata/main.py:533 #: .././sonata/main.py:600 #: .././sonata/main.py:601 msgid "Playlist" msgstr "清單" #: .././sonata/main.py:563 #: .././sonata/main.py:1833 #: .././sonata/main.py:2042 msgid "Click to expand" msgstr "按下放大" #: .././sonata/main.py:568 #: .././sonata/main.py:1831 #: .././sonata/main.py:2040 msgid "Click to collapse" msgstr "按下縮小" #: .././sonata/main.py:573 #: .././sonata/main.py:1725 #: .././sonata/main.py:1836 msgid "Not Connected" msgstr "尚未連線" #: .././sonata/main.py:575 #: .././sonata/main.py:1723 #: .././sonata/main.py:1838 msgid "No Read Permission" msgstr "沒有讀取權限" #: .././sonata/main.py:648 msgid "Cover Art" msgstr "選擇封面圖案" #: .././sonata/main.py:872 msgid "MPD_HOST/PORT" msgstr "使用 MPD_HOST/PORT 中" #: .././sonata/main.py:877 msgid "Disconnect" msgstr "斷線" #: .././sonata/main.py:1183 #: .././sonata/main.py:1190 msgid "#" msgstr "" #: .././sonata/main.py:1184 #: .././sonata/preferences.py:556 #: .././sonata/tagedit.py:128 msgid "Year" msgstr "年" #: .././sonata/main.py:1188 msgid "Stream" msgstr "串流" #: .././sonata/main.py:1189 msgid "Len" msgstr "" #: .././sonata/main.py:1210 #: .././sonata/main.py:1217 #: .././sonata/main.py:1258 #: .././sonata/main.py:1265 msgid "Unknown" msgstr "未知" #: .././sonata/main.py:1746 msgid "day" msgid_plural "days" msgstr[0] "日" msgstr[1] "日" #: .././sonata/main.py:1754 msgid "hour" msgid_plural "hours" msgstr[0] "小時" msgstr[1] "小時" #: .././sonata/main.py:1759 #: .././sonata/main.py:1761 msgid "and" msgstr "和" #: .././sonata/main.py:1769 msgid "(updating mpd)" msgstr "(更新 mpd 中)" #: .././sonata/main.py:2109 msgid "Lyrics Search" msgstr "搜尋歌詞" #: .././sonata/main.py:2110 msgid "_Search" msgstr "搜尋 (_S)" #: .././sonata/main.py:2113 msgid "Artist Name" msgstr "演奏人名稱" #: .././sonata/main.py:2118 msgid "Song Title" msgstr "歌曲標題" #: .././sonata/main.py:2370 msgid "Open Image" msgstr "打開影像" #: .././sonata/main.py:2372 msgid "Images" msgstr "影像" #: .././sonata/main.py:2376 msgid "All files" msgstr "所有檔案" #: .././sonata/main.py:2418 msgid "Choose Cover Art" msgstr "選擇封面圖案" #: .././sonata/main.py:2419 msgid "C_hoose" msgstr "選擇 (_H)" #: .././sonata/main.py:2451 msgid "Edit search terms" msgstr "編輯搜尋詞" #: .././sonata/main.py:2508 msgid "No artist or album name found." msgstr "找不到演奏人或專輯名。" #: .././sonata/main.py:2511 msgid "No cover art found." msgstr "找不到封面圖案。" #: .././sonata/main.py:2835 msgid "Delete the selected playlist?" msgid_plural "Delete the selected playlists?" msgstr[0] "刪除選擇的清單?" msgstr[1] "刪除選擇的清單?" #: .././sonata/main.py:2835 msgid "Delete Playlist" msgid_plural "Delete Playlists" msgstr[0] "刪除清單" msgstr[1] "刪除清單" #: .././sonata/main.py:2843 msgid "Delete the selected stream?" msgid_plural "Delete the selected streams?" msgstr[0] "刪除選擇的串流?" msgstr[1] "刪除選擇的串流?" #: .././sonata/main.py:2843 msgid "Delete Stream" msgid_plural "Delete Streams" msgstr[0] "刪除串流" msgstr[1] "刪除串流" #: .././sonata/playlists.py:103 #: .././sonata/playlists.py:105 msgid "Save Playlist" msgstr "儲存清單" #: .././sonata/playlists.py:120 msgid "Would you like to replace the existing playlist or append these songs?" msgstr "你想替代現存的清單,還是附加於清單末端?" #: .././sonata/playlists.py:120 msgid "Existing Playlist" msgstr "清單" #: .././sonata/playlists.py:120 msgid "Replace playlist" msgstr "重新命名清單" #: .././sonata/playlists.py:120 msgid "Append songs" msgstr "附加歌曲" #: .././sonata/playlists.py:141 msgid "A playlist with this name already exists. Would you like to replace it?" msgstr "已經有同名的清單,是否取代之?" #: .././sonata/playlists.py:153 msgid "Playlist name" msgstr "清單名稱" #: .././sonata/playlists.py:182 #: .././sonata/playlists.py:186 msgid "Rename Playlist" msgstr "重新命名清單" #: .././sonata/preferences.py:27 msgid "System tray" msgstr "系統列" #: .././sonata/preferences.py:27 msgid "Top Left" msgstr "左上" #: .././sonata/preferences.py:27 msgid "Top Right" msgstr "右上" #: .././sonata/preferences.py:28 msgid "Bottom Left" msgstr "左下" #: .././sonata/preferences.py:28 msgid "Bottom Right" msgstr "右下" #: .././sonata/preferences.py:29 msgid "Screen Center" msgstr "畫面中央" #: .././sonata/preferences.py:99 msgid "MPD" msgstr "" #: .././sonata/preferences.py:100 #: .././sonata/preferences.py:343 msgid "Display" msgstr "顯示" #: .././sonata/preferences.py:101 msgid "Behavior" msgstr "行為" #: .././sonata/preferences.py:102 msgid "Format" msgstr "格式" #: .././sonata/preferences.py:103 #: .././sonata/preferences.py:245 msgid "Extras" msgstr "額外功能" #: .././sonata/preferences.py:104 msgid "Plugins" msgstr "插件" #: .././sonata/preferences.py:128 msgid "MPD Connection" msgstr "MPD 連線" #: .././sonata/preferences.py:141 msgid "_Name" msgstr "名稱 (_N)" #: .././sonata/preferences.py:144 msgid "_Host" msgstr "站台 (_H)" #: .././sonata/preferences.py:147 msgid "_Port" msgstr "格式 (_P)" #: .././sonata/preferences.py:151 msgid "_Music dir" msgstr "音樂根目錄 (_M)" #: .././sonata/preferences.py:152 msgid "Select a Music Directory" msgstr "選擇音樂目錄" #: .././sonata/preferences.py:158 msgid "Pa_ssword" msgstr "密碼 (_S)" #: .././sonata/preferences.py:161 msgid "Leave blank if no password is required." msgstr "如果沒有密碼就留白。" #: .././sonata/preferences.py:162 msgid "_Autoconnect on start" msgstr "啟動時自動連線 (_A)" #: .././sonata/preferences.py:182 msgid "Using MPD_HOST/PORT" msgstr "使用 MPD_HOST/PORT 中" #: .././sonata/preferences.py:250 msgid "_Audioscrobbling (Last.fm)" msgstr "" #: .././sonata/preferences.py:252 msgid "_Username:" msgstr "用戶名 (_U):" #: .././sonata/preferences.py:253 msgid "_Password:" msgstr "密碼 (_P):" #: .././sonata/preferences.py:273 msgid "Popup _notification on song changes" msgstr "歌曲變換時跳出提醒窗 (_N)" #: .././sonata/preferences.py:299 msgid "Fade length" msgstr "淡出淡入長度" #: .././sonata/preferences.py:300 msgid "_Fade length" msgstr "淡出淡入長度 (_F)" #: .././sonata/preferences.py:302 msgid "sec" msgstr "秒" #: .././sonata/preferences.py:307 msgid "C_rossfade" msgstr "淡入淡出 (_R)" #: .././sonata/preferences.py:348 msgid "_Album art" msgstr "專輯名稱 (_A)" #: .././sonata/preferences.py:350 msgid "Standard" msgstr "標準" #: .././sonata/preferences.py:351 msgid "Stylized" msgstr "風格化" #: .././sonata/preferences.py:356 msgid "Artwork style:" msgstr "圖案風格:" #: .././sonata/preferences.py:358 msgid "Local only" msgstr "只有本地" #: .././sonata/preferences.py:359 msgid "Local and remote" msgstr "先本地,後遠端" #: .././sonata/preferences.py:362 msgid "Search locations:" msgstr "搜尋次序:" #: .././sonata/preferences.py:369 #: .././sonata/preferences.py:396 msgid "SONG_DIR" msgstr "" #: .././sonata/preferences.py:371 msgid "custom" msgstr "自訂" #: .././sonata/preferences.py:378 msgid "Save art to:" msgstr "儲存圖案至:" #: .././sonata/preferences.py:383 msgid "_Playback/volume buttons" msgstr "啟動控制/音量按鈕 (_P)" #: .././sonata/preferences.py:386 msgid "Pr_ogressbar" msgstr "啟動歌曲進度列 (_O_" #: .././sonata/preferences.py:389 msgid "_Statusbar" msgstr "啟動狀態列 (_S)" #: .././sonata/preferences.py:392 msgid "Song Ly_rics" msgstr "歌詞 (_R)" #: .././sonata/preferences.py:394 msgid "Save lyrics to:" msgstr "儲存歌詞至:" #: .././sonata/preferences.py:405 msgid "System _tray icon" msgstr "系統列 (_T)" #: .././sonata/preferences.py:429 msgid "Window Behavior" msgstr "視窗行為" #: .././sonata/preferences.py:433 msgid "_Show window on all workspaces" msgstr "在所有桌面顯示視窗 (_S)" #: .././sonata/preferences.py:436 msgid "_Keep window above other windows" msgstr "視窗置頂 (_K)" #: .././sonata/preferences.py:439 msgid "_Hide window titlebar" msgstr "視窗標題 (_H):" #: .././sonata/preferences.py:442 msgid "_Minimize to system tray on close/escape" msgstr "關閉/ESC鍵縮至系統列 (_M)" #: .././sonata/preferences.py:444 msgid "If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one." msgstr "如果開啟,關閉 Sonata 的按鈕將導致它縮至系統列而非真的關閉。" #: .././sonata/preferences.py:460 msgid "Miscellaneous" msgstr "其他雜項" #: .././sonata/preferences.py:464 msgid "_Update MPD library on start" msgstr "啟動就更新 MPD 音樂庫 (_U)" #: .././sonata/preferences.py:466 msgid "If enabled, Sonata will automatically update your MPD library when it starts up." msgstr "如果開啟,Sonata 會在它啟動就自動更新 MPD 資料庫。" #: .././sonata/preferences.py:469 msgid "S_top playback on exit" msgstr "離開時停止音樂 (_T)" #: .././sonata/preferences.py:471 msgid "MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit." msgstr "MPD 在沒有客端軟體時亦可以播放。然而如果啟動此選項,Sonata 將會模仿傳統音樂播放器,在程式離開同時停止音樂。" #: .././sonata/preferences.py:474 msgid "_Write status file:" msgstr "寫入狀態檔至 (_W):" #: .././sonata/preferences.py:476 #: .././sonata/preferences.py:478 msgid "If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)" msgstr "如果開啟,Sonata 會創建一個類似 xmms-infopipe 的檔案,以供其他程式利用。(例如聊天軟體)" #: .././sonata/preferences.py:512 msgid "Song Formatting" msgstr "歌曲格式" #: .././sonata/preferences.py:517 msgid "C_urrent playlist:" msgstr "當前清單 (_U):" #: .././sonata/preferences.py:518 msgid "_Library:" msgstr "音樂庫 (_L):" #: .././sonata/preferences.py:519 msgid "_Window title:" msgstr "視窗標題 (_W):" #: .././sonata/preferences.py:520 msgid "Current _song line 1:" msgstr "歌曲提示第一行 (_S):" #: .././sonata/preferences.py:522 msgid "Current s_ong line 2:" msgstr "歌曲提示第二行 (_O):" #: .././sonata/preferences.py:547 msgid "Available options" msgstr "可用選項" #. XXX get these directly from the formatting function: #: .././sonata/preferences.py:551 msgid "Artist name" msgstr "演奏人名稱" #: .././sonata/preferences.py:552 msgid "Album name" msgstr "專輯名稱" #: .././sonata/preferences.py:553 msgid "Track name" msgstr "音軌名稱" #: .././sonata/preferences.py:554 msgid "Track number" msgstr "音軌號" #: .././sonata/preferences.py:555 msgid "Disc number" msgstr "碟片號" #: .././sonata/preferences.py:558 msgid "File path" msgstr "檔案路徑" #: .././sonata/preferences.py:559 msgid "File name" msgstr "檔名" #: .././sonata/preferences.py:560 #: .././sonata/streams.py:107 msgid "Stream name" msgstr "串流名稱" #: .././sonata/preferences.py:561 msgid "Song length" msgstr "歌曲長度" #: .././sonata/preferences.py:562 msgid "Elapsed time (title only)" msgstr "經過時間 (只能用在標題)" #: .././sonata/preferences.py:572 msgid "Info displayed only if all enclosed tags are defined" msgstr "只有框起來的所有變數都有值時才顯示" #: .././sonata/preferences.py:572 msgid "Creates columns in the current playlist" msgstr "在「當前清單」中畫出直列" #: .././sonata/preferences.py:598 msgid "_About" msgstr "關於 (_A)" #: .././sonata/preferences.py:601 msgid "_Configure..." msgstr "設定… (_C)" #: .././sonata/preferences.py:641 msgid "Enabled" msgstr "啟動淡出淡入" #: .././sonata/preferences.py:649 msgid "Description" msgstr "描述" #: .././sonata/preferences.py:666 msgid "To save lyrics to the music file's directory, you must specify a valid music directory." msgstr "要儲存歌詞至音樂目錄,你必須指定一個有效的音樂目錄。" #: .././sonata/preferences.py:666 #: .././sonata/preferences.py:673 msgid "Music Dir Verification" msgstr "音樂目錄確認" #: .././sonata/preferences.py:673 msgid "To save artwork to the music file's directory, you must specify a valid music directory." msgstr "要儲存封面圖案至音樂目錄,你必須指定一個有效的音樂目錄。" #: .././sonata/preferences.py:738 msgid "New Profile" msgstr "新增設定檔" #. Prompt user for playlist name: #: .././sonata/preferences.py:792 msgid "Custom Artwork" msgstr "自訂封面圖案" #: .././sonata/preferences.py:794 msgid "Artwork filename" msgstr "封面檔名" #: .././sonata/streams.py:103 msgid "Edit Stream" msgstr "編輯串流" #: .././sonata/streams.py:105 #: .././sonata/streams.py:136 msgid "New Stream" msgstr "新增串流" #: .././sonata/streams.py:114 msgid "Stream URL" msgstr "URL" #: .././sonata/streams.py:136 msgid "A stream with this name already exists. Would you like to replace it?" msgstr "已經有同名的串流,是否要替代之?" #: .././sonata/tagedit.py:61 msgid "Taglib and/or tagpy not found, tag editing support disabled." msgstr "找不到 tablib 或 tagpy,將沒有編輯標籤的功能。" #: .././sonata/tagedit.py:61 #: .././sonata/tagedit.py:70 #: .././sonata/tagedit.py:75 #: .././sonata/tagedit.py:99 #: .././sonata/tagedit.py:103 #: .././sonata/tagedit.py:260 #: .././sonata/tagedit.py:299 msgid "Edit Tags" msgstr "編輯標籤" #: .././sonata/tagedit.py:70 msgid "Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled." msgstr "找不到 tablib 或 tagpy,將沒有編輯標籤的功能。" #: .././sonata/tagedit.py:75 msgid "The path" msgstr "路徑" #: .././sonata/tagedit.py:75 msgid "does not exist. Please specify a valid music directory in preferences." msgstr "不存在,請在偏好設定中指定一個有效的音樂根目錄。" #: .././sonata/tagedit.py:99 msgid "File " msgstr "檔案 " #: .././sonata/tagedit.py:99 msgid " not found. Please specify a valid music directory in preferences." msgstr "找不到,請在偏好設定中指定一個有效的音樂根目錄。" #: .././sonata/tagedit.py:103 msgid "No music files with editable tags found." msgstr "沒有可編輯標籤的音樂檔案。" #: .././sonata/tagedit.py:150 msgid "Comment" msgstr "註解" #. Only show save all button if more than one song being edited. #: .././sonata/tagedit.py:161 msgid "Save _All" msgstr "儲存所有 (_A)" #: .././sonata/tagedit.py:207 msgid "Increment each selected music file, starting at track 1 for this file." msgstr "由此檔作為第一軌開始計算,逐步增加。" #: .././sonata/tagedit.py:209 msgid "Apply to all selected music files." msgstr "套用至所有選擇的檔案。" #: .././sonata/tagedit.py:260 msgid "of" msgstr "" #. FIXME: was (save_success and self.conn and self.status): #: .././sonata/tagedit.py:299 msgid "Unable to save tag to music file." msgstr "無法存標籤至檔案。" #: .././sonata/tagedit.py:366 msgid "Hide file path" msgstr "檔案路徑" #: .././sonata/tagedit.py:369 msgid "Show file path" msgstr "檔案路徑" #~ msgid "The popup argument requires D-Bus. Aborting." #~ msgstr "這個跳出視窗需要 D-Bus,中止。" #~ msgid "" #~ "PyGTK+ 2.10 or gnome-python-extras not found, system tray support " #~ "disabled." #~ msgstr "找不到 PyGTK+ 2.10 或 gnome-python-extras,將不支援系統列。" #~ msgid "Reset to Default" #~ msgstr "重設" #~ msgid "_New Playlist..." #~ msgstr "創立新清單 (_N)" #~ msgid "Website: http://sonata.berlios.de/" #~ msgstr "網站: http://sonata.berlios.de/" #~ msgid "Toggle shuffle mode" #~ msgstr "啟動隨機播放" #~ msgid "Enable Audioscrobbler" #~ msgstr "啟動 Audioscrobbler" #~ msgid "Notification" #~ msgstr "提醒" #~ msgid "Enable album art" #~ msgstr "開啟封面圖案" #~ msgid "Enable lyrics" #~ msgstr "啟動歌詞支援" #~ msgid "Enable system tray icon" #~ msgstr "啟動系統列圖示" #~ msgid "_Display" #~ msgstr "顯示 (_D)" #~ msgid "_Extras" #~ msgstr "額外 (_E)" #~ msgid "" #~ "Python 2.5 or python-elementtree not found, audioscrobbler support " #~ "disabled." #~ msgstr "" #~ "找不到 Python 2.5 或 python-elementtree,將沒有 audioscrobbler 支援。" #~ msgid "Audioscrobbler Verification" #~ msgstr "Audioscrobbler 確認" #~ msgid "Update library for selected item(s)" #~ msgstr "為選定項目更新音樂庫" ���������������������������������������������������������������������������������������sonata-1.6.2.1/scripts/�����������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11255764730�0014645�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/scripts/pycheck����������������������������������������������������������������������0000775�0000000�0000000�00000000417�11255764730�0016223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash scriptdir=$(dirname "$0") [ -z "$scriptdir" ] && scriptdir=$(which "$0") files="$scriptdir/../sonata/*.py" [ "$#" != 0 ] && files=$* pychecker --limit 999999 $files | egrep -v "\(_.*\) not used|No global \(_\) found|Imported module \(gettext\) not used" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/scripts/pycheck-svndiff��������������������������������������������������������������0000775�0000000�0000000�00000001227�11255764730�0017660�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash scriptdir=$(dirname "$0") [ -z "$scriptdir" ] && scriptdir=$(which "$0") files="sonata/*.py" function do_pycheck() { pychecker --limit 999999 $1 | egrep -v "\(_.*\) not used|No global \(_\) found|Imported module \(gettext\) not used" } function setup() { src=$1 dst=$2 ( rm -Rf "$dst" mkdir -p "$dst/sonata" cd "$dst/sonata" for f in $src; do cp -a "$f" "$(basename "$f" .svn-base)" done ) } setup "../../../sonata/.svn/text-base/*.py.svn-base" "$scriptdir/pycheck-tmp" setup "../../../sonata/*.py" "$scriptdir/pycheck-tmp2" diff -u <(cd "$scriptdir/pycheck-tmp" && do_pycheck "$files") <(cd "$scriptdir/pycheck-tmp2" && do_pycheck "$files") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/scripts/release.sh�������������������������������������������������������������������0000775�0000000�0000000�00000001110�11255764730�0016615�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash -e rev=$1 version=$2 [ -n "$rev" ] [ -n "$version" ] # Tag the trunk revision as the released version svn copy -m "release trunk revision $rev as sonata $version" http://svn.berlios.de/svnroot/repos/sonata/trunk/"@$rev" http://svn.berlios.de/svnroot/repos/sonata/tags/$version # Create archive, removing: # - website directory svn export http://svn.berlios.de/svnroot/repos/sonata/tags/$version sonata-$version rm -R sonata-$version/website/ tar zcvf sonata-$version.tar.gz sonata-$version tar jcf sonata-$version.tar.bz2 sonata-$version rm -R sonata-$version/ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/scripts/update-po��������������������������������������������������������������������0000775�0000000�0000000�00000001131�11255764730�0016465�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh writelines() { for i in *.py do if [ ${i} != "__init__.py" ] then echo $2${i} >> $1 fi done } cd $(dirname "$0") echo echo Updating POTFILES.in... rm ../po/POTFILES.in touch ../po/POTFILES.in cd .. writelines po/POTFILES.in ./ cd sonata writelines ../po/POTFILES.in ./sonata/ cd ../po echo Update messages.po... echo intltool-update -p mv untitled.pot messages.po for i in *.po do if [ "$i" = "messages.po" ] then continue fi echo Updating ${i}... intltool-update "${i%*.po}" echo done echo Cleaning up... echo rm untitled.pot ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/setup.py�����������������������������������������������������������������������������0000664�0000000�0000000�00000011435�11255764730�0014674�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import os, glob, shutil from distutils.core import setup, Extension import sonata.svnversion def capture(cmd): return os.popen(cmd).read().strip() def removeall(path): if not os.path.isdir(path): return files=os.listdir(path) for x in files: fullpath=os.path.join(path, x) if os.path.isfile(fullpath): f=os.remove rmgeneric(fullpath, f) elif os.path.isdir(fullpath): removeall(fullpath) f=os.rmdir rmgeneric(fullpath, f) def rmgeneric(path, __func__): try: __func__(path) except OSError, (errno, strerror): pass # Create mo files: if not os.path.exists("mo/"): os.mkdir("mo/") for lang in ('de', 'pl', 'ru', 'fr', 'zh_CN', 'sv', 'es', 'fi', 'uk', 'it', 'cs', \ 'nl', 'pt_BR', 'da', 'be@latin', 'et', 'ca', 'ar', 'tr', 'el_GR', 'sk', \ 'zh_TW', 'ja', 'sl'): pofile = "po/" + lang + ".po" mofile = "mo/" + lang + "/sonata.mo" if not os.path.exists("mo/" + lang + "/"): os.mkdir("mo/" + lang + "/") print "generating", mofile os.system("msgfmt %s -o %s" % (pofile, mofile)) # Copy script "sonata" file to sonata dir: shutil.copyfile("sonata.py", "sonata/sonata") versionfile = file("sonata/version.py","wt") versionfile.write(""" # generated by setup.py VERSION = %r """ % sonata.svnversion.VERSION) versionfile.close() setup(name='Sonata', version="1.6.2.1", description='GTK+ client for the Music Player Daemon (MPD).', author='Scott Horowitz', author_email='stonecrest@gmail.com', url='http://sonata.berlios.de/', classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: X11 Applications', 'Intended Audience :: End Users/Desktop', 'License :: GNU General Public License (GPL)', 'Operating System :: Linux', 'Programming Language :: Python', 'Topic :: Multimedia :: Sound :: Players', ], packages=["sonata", "sonata.plugins"], package_dir={"sonata": "sonata/"}, ext_modules=[Extension( "mmkeys", ["mmkeys/mmkeyspy.c", "mmkeys/mmkeys.c", "mmkeys/mmkeysmodule.c"], extra_compile_args=capture("pkg-config --cflags gtk+-2.0 pygtk-2.0").split(), extra_link_args=capture("pkg-config --libs gtk+-2.0 pygtk-2.0").split() ),], scripts = ['sonata/sonata'], data_files=[('share/sonata', ['README', 'CHANGELOG', 'TODO', 'TRANSLATORS']), ('share/applications', ['sonata.desktop']), ('share/pixmaps', glob.glob('sonata/pixmaps/*')), ('share/man/man1', ['sonata.1']), ('share/locale/de/LC_MESSAGES', ['mo/de/sonata.mo']), ('share/locale/pl/LC_MESSAGES', ['mo/pl/sonata.mo']), ('share/locale/ru/LC_MESSAGES', ['mo/ru/sonata.mo']), ('share/locale/fr/LC_MESSAGES', ['mo/fr/sonata.mo']), ('share/locale/zh_CN/LC_MESSAGES', ['mo/zh_CN/sonata.mo']), ('share/locale/sv/LC_MESSAGES', ['mo/sv/sonata.mo']), ('share/locale/es/LC_MESSAGES', ['mo/es/sonata.mo']), ('share/locale/fi/LC_MESSAGES', ['mo/fi/sonata.mo']), ('share/locale/nl/LC_MESSAGES', ['mo/nl/sonata.mo']), ('share/locale/it/LC_MESSAGES', ['mo/it/sonata.mo']), ('share/locale/cs/LC_MESSAGES', ['mo/cs/sonata.mo']), ('share/locale/da/LC_MESSAGES', ['mo/da/sonata.mo']), ('share/locale/ca/LC_MESSAGES', ['mo/ca/sonata.mo']), ('share/locale/ar/LC_MESSAGES', ['mo/ar/sonata.mo']), ('share/locale/pt_BR/LC_MESSAGES', ['mo/pt_BR/sonata.mo']), ('share/locale/et/LC_MESSAGES', ['mo/et/sonata.mo']), ('share/locale/tr/LC_MESSAGES', ['mo/tr/sonata.mo']), ('share/locale/be@latin/LC_MESSAGES', ['mo/be@latin/sonata.mo']), ('share/locale/el_GR/LC_MESSAGES', ['mo/el_GR/sonata.mo']), ('share/locale/sk/LC_MESSAGES', ['mo/sk/sonata.mo']), ('share/locale/ja/LC_MESSAGES', ['mo/ja/sonata.mo']), ('share/locale/sl/LC_MESSAGES', ['mo/sl/sonata.mo']), ('share/locale/zh_TW/LC_MESSAGES', ['mo/zh_TW/sonata.mo']), ('share/locale/uk/LC_MESSAGES', ['mo/uk/sonata.mo'])], ) # Cleanup (remove /build, /mo, and *.pyc files: print "Cleaning up..." try: removeall("build/") os.rmdir("build/") except: pass try: removeall("mo/") os.rmdir("mo/") except: pass try: for f in os.listdir("."): if os.path.isfile(f): if os.path.splitext(os.path.basename(f))[1] == ".pyc": os.remove(f) except: pass try: os.remove("sonata/sonata") except: pass try: os.remove("sonata/version.py") except: pass �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata.1�����������������������������������������������������������������������������0000664�0000000�0000000�00000002542�11255764730�0014530�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.TH SONATA 1 "October 20, 2006" .SH NAME sonata \- GTK+ client for the Music Player Daemon .SH SYNOPSIS .B sonata [\fIOPTION\fR] .SH DESCRIPTION Sonata is an elegant GTK+ music client for the Music Player Daemon (MPD). .SH OPTIONS .TP .B \-h\fR, \fB\-\-help Show this help and exit .TP .B \-p\fR, \fB\-\-popup Popup song notification (requires D\-Bus) .TP .B \-t\fR, \fB\-\-toggle Toggles whether the app is minimized to tray or visible (requires D\-Bus) .TP .B \-v\fR, \fB\-\-version Show version information and exit .TP .B \-\-hidden Start app hidden (requires systray) .TP .B \-\-visible Start app visible (requires systray) .TP .B \-\-profile\=[NUM] Start with profile [NUM] .TP .B play Play song in playlist .TP .B pause Pause currently playing song .TP .B stop Stop currently playing song .TP .B next Play next song in playlist .TP .B prev Play previous song in playlist .TP .B pp Toggle play/pause; plays if stopped .TP .B repeat Toggle repeat mode .TP .B random Toggle random mode .TP .B info Display current song info .TP .B status Display MPD status .SH "SEE ALSO" .PP Website: http://sonata.berlios.de .PP MPD Website: http://www.musicpd.org .SH AUTHOR Sonata was written by Scott Horowitz <stonecrest@gmail.com>. .PP This manual page is currently maintained by Scott Horowitz <stonecrest@gmail.com>. It was originally written by Michal Cihar <michal@cihar.com>. ��������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata.desktop�����������������������������������������������������������������������0000664�0000000�0000000�00000000255�11255764730�0016040�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ [Desktop Entry] Name=Sonata Comment=An elegant GTK+ MPD client Exec=sonata Terminal=false Type=Application Icon=sonata Categories=GTK;AudioVideo;Player; StartupNotify=true ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata.py����������������������������������������������������������������������������0000775�0000000�0000000�00000010727�11255764730�0015027�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python """Sonata is a simple GTK+ client for the Music Player Daemon. """ __author__ = "Scott Horowitz" __email__ = "stonecrest@gmail.com" __license__ = """ Sonata, an elegant GTK+ client for the Music Player Daemon Copyright 2006-2008 Scott Horowitz <stonecrest@gmail.com> This file is part of Sonata. Sonata 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 3 of the License, or (at your option) any later version. Sonata 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, see <http://www.gnu.org/licenses/>. """ import sys, platform, locale, gettext, os # XXX insert the correct sonata package dir in sys.path try: import sonata except ImportError: sys.stderr.write("Python failed to find the sonata modules.\n") sys.stderr.write("\nSearched in the following directories:\n" + "\n".join(sys.path) + "\n") sys.stderr.write("\nPerhaps Sonata is improperly installed?\n") sys.exit(1) try: import sonata.version as version except ImportError: try: import sonata.svnversion as version except ImportError: sys.stderr.write("Python failed to find the sonata modules.\n") sys.stderr.write("\nAn old or incomplete installation was " + "found in the following directory:\n" + os.path.dirname(sonata.__file__) + "\n") sys.stderr.write("\nPerhaps you want to delete it?\n") sys.exit(1) # XXX check that version.VERSION is what this script was installed for ## Apply global fixes: # the following line is to fix python-zsi 2.0 and thus lyrics in ubuntu: # https://bugs.launchpad.net/ubuntu/+source/zsi/+bug/208855 sys.path.append('/usr/lib/python2.5/site-packages/oldxml') # hint for gnome.init to set the process name to 'sonata' if platform.system() == 'Linux': sys.argv[0] = 'sonata' # apply as well: try: import ctypes libc = ctypes.CDLL('libc.so.6') PR_SET_NAME = 15 libc.prctl(PR_SET_NAME, sys.argv[0], 0, 0, 0) except Exception: # if it fails, it fails pass ## Apply locale and translation: from sonata import misc misc.setlocale() # let gettext install _ as a built-in for all modules to see # XXX what's the correct way to find the localization? try: gettext.install('sonata', os.path.join(sonata.__file__.split('/lib')[0], 'share', 'locale'), unicode=1) except: print "Warning: trying to use an old translation" gettext.install('sonata', '/usr/share/locale', unicode=1) gettext.textdomain('sonata') ## Check initial dependencies: # Test python version: if sys.version_info < (2,5): sys.stderr.write("Sonata requires Python 2.5 or newer. Aborting...\n") sys.exit(1) try: import mpd except: sys.stderr.write("Sonata requires python-mpd. Aborting...\n") sys.exit(1) ## Initialize the plugin system: from sonata.pluginsystem import pluginsystem pluginsystem.find_plugins() pluginsystem.notify_of('enablables', lambda plugin, cb: cb(True), lambda plugin, cb: cb(False)) ## Load the command line interface: from sonata import cli args = cli.Args() args.parse(sys.argv) args.process_options() ## Deal with GTK: if not args.should_skip_gui(): # importing gtk does sys.setdefaultencoding("utf-8"), sets locale etc. import gtk if gtk.pygtk_version < (2, 12, 0): sys.stderr.write("Sonata requires PyGTK 2.12.0 or newer. Aborting...\n") sys.exit(1) # fix locale misc.setlocale() else: class FakeModule(object): pass # make sure the ui modules aren't imported for m in 'gtk', 'pango', 'sonata.ui', 'sonata.breadcrumbs': if m in sys.modules: print "Warning: module %s imported in CLI mode" % m else: sys.modules[m] = FakeModule() # like gtk, set utf-8 encoding of str objects reload(sys) # hack access to setdefaultencoding sys.setdefaultencoding("utf-8") ## Global init: from socket import setdefaulttimeout as socketsettimeout socketsettimeout(5) if not args.should_skip_gui(): gtk.gdk.threads_init() # we don't use gtk.LinkButton, but gtk.AboutDialog does; # in gtk 2.16.0 without this, the about uri opens doubly: gtk.link_button_set_uri_hook(lambda *args:None) ## CLI actions: args.execute_cmds() ## Load the main application: from sonata import main app = main.Base(args) try: app.main() except KeyboardInterrupt: pass �����������������������������������������sonata-1.6.2.1/sonata/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11255764730�0014443�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/__init__.py�������������������������������������������������������������������0000664�0000000�0000000�00000000000�11255764730�0016542�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/about.py����������������������������������������������������������������������0000664�0000000�0000000�00000020400�11255764730�0016123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# coding=utf-8 import gettext import gtk import misc, ui translators = '''\ ar - Ahmad Farghal <ahmad.farghal@gmail.com> be@latin - Ihar Hrachyshka <ihar.hrachyshka@gmail.com> ca - Franc Rodriguez <franc.rodriguez@tecob.com> cs - Jakub Adler <jakubadler@gmail.com> da - Martin Dybdal <dybber@dybber.dk> de - Paul Johnson <thrillerator@googlemail.com> el_GR - Lazaros Koromilas <koromilaz@gmail.com> es - Xoan Sampaiño <xoansampainho@gmail.com> et - Mihkel <turakas@gmail.com> fi - Ilkka Tuohela <hile@hack.fi> fr - Floreal M <florealm@gmail.com> ja - Masato Hashimoto <cabezon.hashimoto@gmail.com> it - Gianni Vialetto <forgottencrow@gmail.com> nl - Olivier Keun <litemotiv@gmail.com> pl - Tomasz Dominikowski <dominikowski@gmail.com> pt_BR - Alex Tercete Matos <alextercete@gmail.com> ru - Ivan <bkb.box@bk.ru> sk - Robert Hartl <hartl.robert@gmail.com> sl - Alan Pepelko <alan.pepelko@gmail.com> sv - Daniel Nylander <po@danielnylander.se> tr - Gökmen Görgen <gkmngrgn@gmail.com> uk - Господарисько Тарас <dogmaton@gmail.com> zh_CN - Desmond Chang <dochang@gmail.com> zh_TW - Ian-Xue Li <da.mi.spirit@gmail> ''' class About(object): def __init__(self, parent_window, config, version, licensetext, icon_file): self.parent_window = parent_window self.config = config self.version = version self.license = licensetext self.icon_file = icon_file self.about_dialog = None def about_close(self, _event, _data=None): self.about_dialog.hide() return True def about_shortcuts(self, _button): # define the shortcuts and their descriptions # these are all gettextable mainshortcuts = \ [[ "F1", _("About Sonata") ], [ "F5", _("Preferences") ], [ "F11", _("Fullscreen Artwork Mode") ], [ "Alt-[1-5]", _("Switch to [1st-5th] tab") ], [ "Alt-C", _("Connect to MPD") ], [ "Alt-D", _("Disconnect from MPD") ], [ "Alt-R", _("Randomize current playlist") ], [ "Alt-Down", _("Expand player") ], [ "Alt-Left", _("Switch to previous tab") ], [ "Alt-Right", _("Switch to next tab") ], [ "Alt-Up", _("Collapse player") ], [ "Ctrl-H", _("Search library") ], [ "Ctrl-Q", _("Quit") ], [ "Ctrl-Shift-U", _("Update entire library") ], [ "Menu", _("Display popup menu") ], [ "Escape", _("Minimize to system tray (if enabled)") ]] playbackshortcuts = \ [[ "Ctrl-Left", _("Previous track") ], [ "Ctrl-Right", _("Next track") ], [ "Ctrl-P", _("Play/Pause") ], [ "Ctrl-S", _("Stop") ], [ "Ctrl-Minus", _("Lower the volume") ], [ "Ctrl-Plus", _("Raise the volume") ]] currentshortcuts = \ [[ "Enter/Space", _("Play selected song") ], [ "Delete", _("Remove selected song(s)") ], [ "Ctrl-I", _("Center currently playing song") ], [ "Ctrl-T", _("Edit selected song's tags") ], [ "Ctrl-Shift-S", _("Save to new playlist") ], [ "Ctrl-Delete", _("Clear list") ], [ "Alt-R", _("Randomize list") ]] libraryshortcuts = \ [[ "Enter/Space", _("Add selected song(s) or enter directory") ], [ "Backspace", _("Go to parent directory") ], [ "Ctrl-D", _("Add selected item(s)") ], [ "Ctrl-R", _("Replace with selected item(s)") ], [ "Ctrl-T", _("Edit selected song's tags") ], [ "Ctrl-Shift-D", _("Add selected item(s) and play") ], [ "Ctrl-Shift-R", _("Replace with selected item(s) and play") ], [ "Ctrl-U", _("Update selected item(s)/path(s)") ]] playlistshortcuts = \ [[ "Enter/Space", _("Add selected playlist(s)") ], [ "Delete", _("Remove selected playlist(s)") ], [ "Ctrl-D", _("Add selected playlist(s)") ], [ "Ctrl-R", _("Replace with selected playlist(s)") ], [ "Ctrl-Shift-D", _("Add selected playlist(s) and play") ], [ "Ctrl-Shift-R", _("Replace with selected playlist(s) and play") ]] streamshortcuts = \ [[ "Enter/Space", _("Add selected stream(s)") ], [ "Delete", _("Remove selected stream(s)") ], [ "Ctrl-D", _("Add selected stream(s)") ], [ "Ctrl-R", _("Replace with selected stream(s)") ], [ "Ctrl-Shift-D", _("Add selected stream(s) and play") ], [ "Ctrl-Shift-R", _("Replace with selected stream(s) and play") ]] infoshortcuts = \ [[ "Ctrl-T", _("Edit playing song's tags") ]] # define the main array- this adds headings to each section of # shortcuts that will be displayed shortcuts = [[ _("Main Shortcuts"), mainshortcuts ], [ _("Playback Shortcuts"), playbackshortcuts ], [ _("Current Shortcuts"), currentshortcuts ], [ _("Library Shortcuts"), libraryshortcuts ], [ _("Playlist Shortcuts"), playlistshortcuts ], [ _("Stream Shortcuts"), streamshortcuts ], [ _("Info Shortcuts"), infoshortcuts ]] dialog = ui.dialog(title=_("Shortcuts"), parent=self.about_dialog, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE), role='shortcuts', default=gtk.RESPONSE_CLOSE, h=320) # each pair is a [ heading, shortcutlist ] vbox = gtk.VBox() for pair in shortcuts: titlelabel = ui.label(markup="<b>" + pair[0] + "</b>") vbox.pack_start(titlelabel, False, False, 2) # print the items of [ shortcut, desc ] for item in pair[1]: tmphbox = gtk.HBox() tmplabel = ui.label(markup="<b>" + item[0] + ":</b>", y=0) tmpdesc = ui.label(text=item[1], wrap=True, y=0) tmphbox.pack_start(tmplabel, False, False, 2) tmphbox.pack_start(tmpdesc, True, True, 2) vbox.pack_start(tmphbox, False, False, 2) vbox.pack_start(ui.label(text=" "), False, False, 2) scrollbox = ui.scrollwindow(policy_x=gtk.POLICY_NEVER, addvp=vbox) dialog.vbox.pack_start(scrollbox, True, True, 2) dialog.show_all() dialog.run() dialog.destroy() def statstext(self, stats): # XXX translate expressions, not words statslabel = stats['songs'] + ' ' + gettext.ngettext('song', 'songs', int(stats['songs'])) + '.\n' statslabel = statslabel + stats['albums'] + ' ' + gettext.ngettext('album', 'albums', int(stats['albums'])) + '.\n' statslabel = statslabel + stats['artists'] + ' ' + gettext.ngettext('artist', 'artists', int(stats['artists'])) + '.\n' try: hours_of_playtime = misc.convert_time(float(stats['db_playtime'])).split(':')[-3] except: hours_of_playtime = '0' if int(hours_of_playtime) >= 24: days_of_playtime = str(int(hours_of_playtime)/24) statslabel = statslabel + days_of_playtime + ' ' + gettext.ngettext('day of bliss', 'days of bliss', int(days_of_playtime)) + '.' else: statslabel = statslabel + hours_of_playtime + ' ' + gettext.ngettext('hour of bliss', 'hours of bliss', int(hours_of_playtime)) + '.' return statslabel def about_load(self, stats): self.about_dialog = gtk.AboutDialog() try: self.about_dialog.set_transient_for(self.parent_window) self.about_dialog.set_modal(True) except: pass self.about_dialog.set_name('Sonata') self.about_dialog.set_role('about') self.about_dialog.set_version(self.version) commentlabel = _('An elegant music client for MPD.') self.about_dialog.set_comments(commentlabel) if stats: self.about_dialog.set_copyright(self.statstext(stats)) self.about_dialog.set_license(self.license) self.about_dialog.set_authors(['Scott Horowitz <stonecrest@gmail.com>', 'Tuukka Hastrup <Tuukka.Hastrup@iki.fi>', 'Stephen Boyd <bebarino@gmail.com>']) self.about_dialog.set_artists(['Adrian Chromenko <adrian@rest0re.org>\nhttp://oss.rest0re.org/']) self.about_dialog.set_translator_credits(translators) gtk.about_dialog_set_url_hook(self.show_website) self.about_dialog.set_website("http://sonata.berlios.de/") large_icon = gtk.gdk.pixbuf_new_from_file(self.icon_file) self.about_dialog.set_logo(large_icon) # Add button to show keybindings: shortcut_button = ui.button(text=_("_Shortcuts")) self.about_dialog.action_area.pack_start(shortcut_button) self.about_dialog.action_area.reorder_child(self.about_dialog.action_area.get_children()[-1], -2) # Connect to callbacks self.about_dialog.connect('response', self.about_close) self.about_dialog.connect('delete_event', self.about_close) shortcut_button.connect('clicked', self.about_shortcuts) self.about_dialog.show_all() def show_website(self, _dialog, link): if not misc.browser_load(link, self.config.url_browser, self.parent_window): ui.show_msg(self.about_dialog, _('Unable to launch a suitable browser.'), _('Launch Browser'), 'browserLoadError', gtk.BUTTONS_CLOSE) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/artwork.py��������������������������������������������������������������������0000664�0000000�0000000�00000054322�11255764730�0016514�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import os import threading # artwork_update starts a thread _artwork_update import urllib, urllib2 from xml.etree import ElementTree import gtk, gobject import img, ui, misc, mpdhelper as mpdh from library import library_set_data from library import library_get_data from consts import consts AMAZON_KEY = "12DR2PGAQT303YTEWP02" AMAZON_NS = "{http://webservices.amazon.com/AWSECommerceService/2005-10-05}" AMAZON_URI = "http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=%s&Operation=ItemSearch&SearchIndex=Music&Artist=%s&ResponseGroup=Images" class Artwork(object): def __init__(self, config, find_path, is_lang_rtl, info_imagebox_get_size_request, schedule_gc_collect, target_image_filename, imagelist_append, remotefilelist_append, notebook_get_allocation, allow_art_search, status_is_play_or_pause, album_filename, get_current_song_text): self.config = config self.album_filename = album_filename # constants from main self.is_lang_rtl = is_lang_rtl # callbacks to main XXX refactor to clear this list self.info_imagebox_get_size_request = info_imagebox_get_size_request self.schedule_gc_collect = schedule_gc_collect self.target_image_filename = target_image_filename self.imagelist_append = imagelist_append self.remotefilelist_append = remotefilelist_append self.notebook_get_allocation = notebook_get_allocation self.allow_art_search = allow_art_search self.status_is_play_or_pause = status_is_play_or_pause self.get_current_song_text = get_current_song_text # local pixbufs, image file names self.sonatacd = find_path('sonatacd.png') self.sonatacd_large = find_path('sonatacd_large.png') self.casepb = gtk.gdk.pixbuf_new_from_file(find_path('sonata-case.png')) self.albumpb = None self.currentpb = None # local UI widgets provided to main by getter methods self.albumimage = ui.image() self.albumimage.set_from_file(self.sonatacd) self.trayalbumimage1 = ui.image(w=51, h=77, x=1) self.trayalbumeventbox = ui.eventbox(w=59, h=90, add=self.trayalbumimage1, state=gtk.STATE_SELECTED, visible=True) self.trayalbumimage2 = ui.image(w=26, h=77) self.fullscreenalbumimage = ui.image(w=consts.FULLSCREEN_COVER_SIZE, h=consts.FULLSCREEN_COVER_SIZE, x=1) self.fullscreenalbumlabel = ui.label(x=0.5) self.fullscreenalbumlabel2 = ui.label(x=0.5) self.fullscreen_cover_art_reset_image() self.fullscreen_cover_art_reset_text() self.info_image = ui.image(y=0) self.info_image.set_from_file(self.sonatacd_large) # local version of Main.songinfo mirrored by update_songinfo self.songinfo = None # local state self.lastalbumart = None self.single_img_in_dir = None self.misc_img_in_dir = None self.stop_art_update = False self.downloading_image = False self.lib_art_cond = None # local artwork, cache for library self.lib_model = None self.lib_art_rows_local = [] self.lib_art_rows_remote = [] self.lib_art_pb_size = 0 self.cache = {} self.artwork_load_cache() def get_albumimage(self): return self.albumimage def get_info_image(self): return self.info_image def get_trayalbum(self): return self.trayalbumeventbox, self.trayalbumimage2 def get_fullscreenalbumimage(self): return self.fullscreenalbumimage def get_fullscreenalbumlabels(self): return self.fullscreenalbumlabel, self.fullscreenalbumlabel2 def update_songinfo(self, songinfo): self.songinfo = songinfo def on_reset_image(self, _action): if self.songinfo: if 'name' in self.songinfo: # Stream, remove file: misc.remove_file(self.artwork_stream_filename(mpdh.get(self.songinfo, 'name'))) else: # Normal song: misc.remove_file(self.target_image_filename()) misc.remove_file(self.target_image_filename(consts.ART_LOCATION_HOMECOVERS)) # Use blank cover as the artwork dest_filename = self.target_image_filename(consts.ART_LOCATION_HOMECOVERS) emptyfile = open(dest_filename, 'w') emptyfile.close() self.artwork_update(True) def artwork_set_tooltip_art(self, pix): # Set artwork if not self.is_lang_rtl: pix1 = pix.subpixbuf(0, 0, 51, 77) pix2 = pix.subpixbuf(51, 0, 26, 77) else: pix1 = pix.subpixbuf(26, 0, 51, 77) pix2 = pix.subpixbuf(0, 0, 26, 77) self.trayalbumimage1.set_from_pixbuf(pix1) self.trayalbumimage2.set_from_pixbuf(pix2) del pix1 del pix2 def artwork_stop_update(self): self.stop_art_update = True def artwork_is_downloading_image(self): return self.downloading_image def library_artwork_init(self, model, pb_size): self.lib_model = model self.lib_art_pb_size = pb_size self.lib_art_cond = threading.Condition() thread = threading.Thread(target=self._library_artwork_update) thread.setDaemon(True) thread.start() def library_artwork_update(self, model, start_row, end_row, albumpb): self.albumpb = albumpb # Update self.lib_art_rows_local with new rows followed # by the rest of the rows. self.lib_art_cond.acquire() self.lib_art_rows_local = [] self.lib_art_rows_remote = [] test_rows = range(start_row, end_row+1) + range(len(model)) for row in test_rows: i = model.get_iter((row,)) icon = model.get_value(i, 0) if icon == self.albumpb: data = model.get_value(i, 1) self.lib_art_rows_local.append((i, data, icon)) self.lib_art_cond.notifyAll() self.lib_art_cond.release() def _library_artwork_update(self): while True: remote_art = False # Wait for items.. self.lib_art_cond.acquire() while(len(self.lib_art_rows_local) == 0 and len(self.lib_art_rows_remote) == 0): self.lib_art_cond.wait() self.lib_art_cond.release() # Try first element, giving precedence to local queue: if len(self.lib_art_rows_local) > 0: i, data, icon = self.lib_art_rows_local[0] remote_art = False elif len(self.lib_art_rows_remote) > 0: i, data, icon = self.lib_art_rows_remote[0] remote_art = True else: i = None if i is not None and self.lib_model.iter_is_valid(i): artist, album, path = library_get_data(data, 'artist', 'album', 'path') if artist is None or album is None: if remote_art: self.lib_art_rows_remote.pop(0) else: self.lib_art_rows_local.pop(0) cache_key = library_set_data(artist=artist, album=album, path=path) filename = None # Try to replace default icons with cover art: pb = self.get_library_artwork_cached_pb(cache_key, None) # No cached pixbuf, try local/remote search: if pb is None: if not remote_art: pb, filename = self.library_get_album_cover(path, artist, album, self.lib_art_pb_size) else: filename = self.target_image_filename(None, path, artist, album) self.artwork_download_img_to_file(artist, album, filename) pb, filename = self.library_get_album_cover(path, artist, album, self.lib_art_pb_size) # Set pixbuf icon in model; add to cache if pb is not None: if filename is not None: self.set_library_artwork_cached_filename(cache_key, filename) gobject.idle_add(self.library_set_cover, i, pb, data) # Remote processed item from queue: if not remote_art: if len(self.lib_art_rows_local) > 0 and (i, data, icon) == self.lib_art_rows_local[0]: self.lib_art_rows_local.pop(0) if pb is None and self.config.covers_pref == consts.ART_LOCAL_REMOTE: # No local art found, add to remote queue for later self.lib_art_rows_remote.append((i, data, icon)) else: if len(self.lib_art_rows_remote) > 0 and (i, data, icon) == self.lib_art_rows_remote[0]: self.lib_art_rows_remote.pop(0) if pb is None: # No remote art found, store self.albumpb filename in cache self.set_library_artwork_cached_filename(cache_key, self.album_filename) def library_set_image_for_current_song(self, cache_key): # Search through the rows in the library to see # if we match the currently playing song: play_artist, play_album = library_get_data(cache_key, 'artist', 'album') if play_artist is None and play_album is None: return for row in self.lib_model: artist, album, path = library_get_data(row[1], 'artist', 'album', 'path') if unicode(play_artist).lower() == unicode(artist).lower() \ and unicode(play_album).lower() == unicode(album).lower(): pb = self.get_library_artwork_cached_pb(cache_key, None) self.lib_model.set_value(row.iter, 0, pb) def library_set_cover(self, i, pb, data): if self.lib_model.iter_is_valid(i): if self.lib_model.get_value(i, 1) == data: self.lib_model.set_value(i, 0, pb) def library_get_album_cover(self, dirname, artist, album, pb_size): _tmp, coverfile = self.artwork_get_local_image(dirname, artist, album) if coverfile: try: coverpb = gtk.gdk.pixbuf_new_from_file_at_size(coverfile, pb_size, pb_size) except: # Delete bad image: misc.remove_file(coverfile) return (None, None) w = coverpb.get_width() h = coverpb.get_height() coverpb = self.artwork_apply_composite_case(coverpb, w, h) return (coverpb, coverfile) return (None, None) def set_library_artwork_cached_filename(self, cache_key, filename): self.cache[cache_key] = filename def get_library_artwork_cached_filename(self, cache_key): try: return self.cache[cache_key] except: return None def get_library_artwork_cached_pb(self, cache_key, origpb): filename = self.get_library_artwork_cached_filename(cache_key) if filename is not None: if os.path.exists(filename): pb = gtk.gdk.pixbuf_new_from_file_at_size(filename, self.lib_art_pb_size, self.lib_art_pb_size) return self.artwork_apply_composite_case(pb, self.lib_art_pb_size, self.lib_art_pb_size) else: self.cache.pop(cache_key) return origpb else: return origpb def artwork_save_cache(self): misc.create_dir('~/.config/sonata/') filename = os.path.expanduser("~/.config/sonata/art_cache") f = open(filename, 'w') f.write(repr(self.cache)) f.close() def artwork_load_cache(self): filename = os.path.expanduser("~/.config/sonata/art_cache") if os.path.exists(filename): try: f = open(filename, 'r') r = f.read() self.cache = eval(r) f.close() except: self.cache = {} else: self.cache = {} def artwork_update(self, force=False): if force: self.lastalbumart = None self.stop_art_update = False if not self.config.show_covers: return if not self.songinfo: self.artwork_set_default_icon() return if self.status_is_play_or_pause(): thread = threading.Thread(target=self._artwork_update) thread.setDaemon(True) thread.start() else: self.artwork_set_default_icon() self.fullscreen_cover_art_set_text() def _artwork_update(self): if 'name' in self.songinfo: # Stream streamfile = self.artwork_stream_filename(mpdh.get(self.songinfo, 'name')) if os.path.exists(streamfile): gobject.idle_add(self.artwork_set_image, streamfile, None, None, None) else: self.artwork_set_default_icon() else: # Normal song: artist = mpdh.get(self.songinfo, 'artist', "") album = mpdh.get(self.songinfo, 'album', "") path = os.path.dirname(mpdh.get(self.songinfo, 'file')) if len(artist) == 0 and len(album) == 0: self.artwork_set_default_icon(artist, album, path) return filename = self.target_image_filename() if filename == self.lastalbumart: # No need to update.. self.stop_art_update = False return self.lastalbumart = None imgfound = self.artwork_check_for_local(artist, album, path) if not imgfound: if self.config.covers_pref == consts.ART_LOCAL_REMOTE: imgfound = self.artwork_check_for_remote(artist, album, path, filename) def artwork_stream_filename(self, streamname): return os.path.expanduser('~/.covers/') + streamname.replace("/", "") + ".jpg" def artwork_check_for_local(self, artist, album, path): self.artwork_set_default_icon(artist, album, path) self.misc_img_in_dir = None self.single_img_in_dir = None location_type, filename = self.artwork_get_local_image() if location_type is not None and filename: if location_type == consts.ART_LOCATION_MISC: self.misc_img_in_dir = filename elif location_type == consts.ART_LOCATION_SINGLE: self.single_img_in_dir = filename gobject.idle_add(self.artwork_set_image, filename, artist, album, path) return True return False def artwork_get_local_image(self, songpath=None, artist=None, album=None): # Returns a tuple (location_type, filename) or (None, None). # Only pass a songpath, artist, and album if we don't want # to use info from the currently playing song. if songpath is None: songpath = os.path.dirname(mpdh.get(self.songinfo, 'file')) # Give precedence to images defined by the user's current # art_location config (in case they have multiple valid images # that can be used for cover art). testfile = self.target_image_filename(None, songpath, artist, album) if os.path.exists(testfile): return self.config.art_location, testfile # Now try all local possibilities... simplelocations = [consts.ART_LOCATION_HOMECOVERS, consts.ART_LOCATION_COVER, consts.ART_LOCATION_ALBUM, consts.ART_LOCATION_FOLDER] for location in simplelocations: testfile = self.target_image_filename(location, songpath, artist, album) if os.path.exists(testfile): return location, testfile testfile = self.target_image_filename(consts.ART_LOCATION_CUSTOM, songpath, artist, album) if self.config.art_location == consts.ART_LOCATION_CUSTOM and len(self.config.art_location_custom_filename) > 0 and os.path.exists(testfile): return consts.ART_LOCATION_CUSTOM, testfile if self.artwork_get_misc_img_in_path(songpath): return consts.ART_LOCATION_MISC, self.artwork_get_misc_img_in_path(songpath) testfile = img.single_image_in_dir(self.config.musicdir[self.config.profile_num] + songpath) if testfile is not None: return consts.ART_LOCATION_SINGLE, testfile return None, None def artwork_check_for_remote(self, artist, album, path, filename): self.artwork_set_default_icon(artist, album, path) self.artwork_download_img_to_file(artist, album, filename) if os.path.exists(filename): gobject.idle_add(self.artwork_set_image, filename, artist, album, path) return True return False def artwork_set_default_icon(self, artist=None, album=None, path=None): if self.albumimage.get_property('file') != self.sonatacd: gobject.idle_add(self.albumimage.set_from_file, self.sonatacd) gobject.idle_add(self.info_image.set_from_file, self.sonatacd_large) gobject.idle_add(self.fullscreen_cover_art_reset_image) gobject.idle_add(self.artwork_set_tooltip_art, gtk.gdk.pixbuf_new_from_file(self.sonatacd)) self.lastalbumart = None # Also, update row in library: if artist is not None: cache_key = library_set_data(artist=artist, album=album, path=path) self.set_library_artwork_cached_filename(cache_key, self.album_filename) gobject.idle_add(self.library_set_image_for_current_song, cache_key) def artwork_get_misc_img_in_path(self, songdir): path = misc.file_from_utf8(self.config.musicdir[self.config.profile_num] + songdir) if os.path.exists(path): for name in consts.ART_LOCATIONS_MISC: filename = path + "/" + name if os.path.exists(filename): return filename return False def artwork_set_image(self, filename, artist, album, path, info_img_only=False): # Note: filename arrives here is in FILESYSTEM_CHARSET, not UTF-8! if self.artwork_is_for_playing_song(filename): if os.path.exists(filename): # We use try here because the file might exist, but might # still be downloading or corrupt: try: pix = gtk.gdk.pixbuf_new_from_file(filename) except: # If we have a 0-byte file, it should mean that # sonata reset the image file. Otherwise, it's a # bad file and should be removed. if os.stat(filename).st_size != 0: misc.remove_file(filename) return self.currentpb = pix if not info_img_only: # Store in cache cache_key = library_set_data(artist=artist, album=album, path=path) self.set_library_artwork_cached_filename(cache_key, filename) # Artwork for tooltip, left-top of player: (pix1, w, h) = img.get_pixbuf_of_size(pix, 75) pix1 = self.artwork_apply_composite_case(pix1, w, h) pix1 = img.pixbuf_add_border(pix1) pix1 = img.pixbuf_pad(pix1, 77, 77) self.albumimage.set_from_pixbuf(pix1) self.artwork_set_tooltip_art(pix1) del pix1 # Artwork for library, if current song matches: self.library_set_image_for_current_song(cache_key) # Artwork for fullscreen self.fullscreen_cover_art_set_image() # Artwork for info tab: if self.info_imagebox_get_size_request()[0] == -1: fullwidth = self.notebook_get_allocation()[2] - 50 (pix2, w, h) = img.get_pixbuf_of_size(pix, fullwidth) else: (pix2, w, h) = img.get_pixbuf_of_size(pix, 150) pix2 = self.artwork_apply_composite_case(pix2, w, h) pix2 = img.pixbuf_add_border(pix2) self.info_image.set_from_pixbuf(pix2) del pix2 del pix self.lastalbumart = filename self.schedule_gc_collect() def artwork_set_image_last(self): self.artwork_set_image(self.lastalbumart, None, None, None, True) def artwork_apply_composite_case(self, pix, w, h): if self.config.covers_type == consts.COVERS_TYPE_STYLIZED and float(w)/h > 0.5: # Rather than merely compositing the case on top of the artwork, we will # scale the artwork so that it isn't covered by the case: spine_ratio = float(60)/600 # From original png spine_width = int(w * spine_ratio) case = self.casepb.scale_simple(w, h, gtk.gdk.INTERP_BILINEAR) # Scale pix and shift to the right on a transparent pixbuf: pix = pix.scale_simple(w-spine_width, h, gtk.gdk.INTERP_BILINEAR) blank = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, w, h) blank.fill(0x00000000) pix.copy_area(0, 0, pix.get_width(), pix.get_height(), blank, spine_width, 0) # Composite case and scaled pix: case.composite(blank, 0, 0, w, h, 0, 0, 1, 1, gtk.gdk.INTERP_BILINEAR, 250) del case return blank return pix def artwork_is_for_playing_song(self, filename): # Since there can be multiple threads that are getting album art, # this will ensure that only the artwork for the currently playing # song is displayed if self.status_is_play_or_pause() and self.songinfo: if 'name' in self.songinfo: streamfile = self.artwork_stream_filename(mpdh.get(self.songinfo, 'name')) if filename == streamfile: return True else: # Normal song: if (filename in [self.target_image_filename(consts.ART_LOCATION_HOMECOVERS), self.target_image_filename(consts.ART_LOCATION_COVER), self.target_image_filename(consts.ART_LOCATION_ALBUM), self.target_image_filename(consts.ART_LOCATION_FOLDER), self.target_image_filename(consts.ART_LOCATION_CUSTOM)] or (self.misc_img_in_dir and filename == self.misc_img_in_dir) or (self.single_img_in_dir and filename == self.single_img_in_dir)): return True # If we got this far, no match: return False def artwork_download_img_to_file(self, artist, album, dest_filename, all_images=False): # Returns False if no images found if not artist and not album: self.downloading_image = False return False self.downloading_image = True rhapsody_uri = "http://feeds.rhapsody.com" url = "%s/%s/%s/data.xml" % (rhapsody_uri, artist, album) url = url.replace(" ", "").replace("'", "").replace("&","") request = urllib2.Request(url) opener = urllib2.build_opener() try: body = opener.open(request).read() xml = ElementTree.fromstring(body) imgs = xml.getiterator("img") except: self.downloading_image = False return False imglist = [im.attrib['src'] for im in imgs if im.attrib['src']] # Couldn't find any images if not imglist: self.downloading_image = False return False if not all_images: urllib.urlretrieve(imglist[0], dest_filename) self.downloading_image = False return True else: try: imgfound = False for i, image in enumerate(imglist): dest_filename_curr = dest_filename.replace("<imagenum>", str(i+1)) urllib.urlretrieve(image, dest_filename_curr) # This populates Main.imagelist for the remote image window if os.path.exists(dest_filename_curr): pix = gtk.gdk.pixbuf_new_from_file(dest_filename_curr) pix = pix.scale_simple(148, 148, gtk.gdk.INTERP_HYPER) pix = self.artwork_apply_composite_case(pix, 148, 148) pix = img.pixbuf_add_border(pix) if self.stop_art_update: del pix self.downloading_image = False return imgfound self.imagelist_append([i+1, pix]) del pix imgfound = True self.remotefilelist_append(dest_filename_curr) if i == 0: self.allow_art_search() ui.change_cursor(None) except: pass self.downloading_image = False return imgfound def fullscreen_cover_art_set_image(self, force_update=False): if self.fullscreenalbumimage.get_property('visible') or force_update: if self.currentpb is None: self.fullscreen_cover_art_reset_image() else: # Artwork for fullscreen cover mode (pix3, w, h) = img.get_pixbuf_of_size(self.currentpb, consts.FULLSCREEN_COVER_SIZE) pix3 = self.artwork_apply_composite_case(pix3, w, h) pix3 = img.pixbuf_pad(pix3, consts.FULLSCREEN_COVER_SIZE, consts.FULLSCREEN_COVER_SIZE) self.fullscreenalbumimage.set_from_pixbuf(pix3) del pix3 self.fullscreen_cover_art_set_text() def fullscreen_cover_art_reset_image(self): pix = gtk.gdk.pixbuf_new_from_file(self.sonatacd_large) pix = img.pixbuf_pad(pix, consts.FULLSCREEN_COVER_SIZE, consts.FULLSCREEN_COVER_SIZE) self.fullscreenalbumimage.set_from_pixbuf(pix) self.currentpb = None def fullscreen_cover_art_set_text(self): if self.status_is_play_or_pause(): line1, line2 = self.get_current_song_text() self.fullscreenalbumlabel.set_markup("<span size='20000' color='white'>" + misc.escape_html(line1) + "</span>") self.fullscreenalbumlabel2.set_markup("<span size='12000' color='white'>" + misc.escape_html(line2) + "</span>") else: self.fullscreen_cover_art_reset_text() def fullscreen_cover_art_reset_text(self): self.fullscreenalbumlabel.set_markup("<span size='20000' color='white'> </span>") self.fullscreenalbumlabel2.set_markup("<span size='12000' color='white'> </span>") def have_last(self): if self.lastalbumart is not None: return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/audioscrobbler.py�������������������������������������������������������������0000664�0000000�0000000�00000070026�11255764730�0020021�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# $Id$ """ ~~~~~~~~~~~ PyScrobbler ~~~~~~~~~~~ Python Classes for AudioScrobbler ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A set of python classes for interacting with the Last.fm AudioScrobbler services. AudioScrobblerQuery AudioScrobblerQuery is used to consume the web services that provide similar artists, charts, tags and so on AudioScrobblerPost AudioScrobblerPost is used to update your personal play information for those of you (like me) who've been stoopid enough to write your own player. AudioScrobblerQuery: AudioScrobbler Web Service Consumption ============================================================= A set of classes for consuming the AudioScrobbler web services. Currently we consume protocol 1.0, as defined at: http://www.audioscrobbler.net/data/webservices Basic usage ----------- >>> lips = AudioScrobblerQuery(artist='The Flaming Lips') >>> for artist in lips.similar(): ... print artist.name, artist.mbid ... or >>> for i in AudioScrobblerQuery(user='offmessage').topalbums() ... print i.name, i.image.small ... A certain number of the services take a querystring (for example a user's weekly artist chart takes a start and end date). These can be passed as follows: >>> offmessage = AudioScrobblerQuery(user='offmessage') >>> for i in offmessage.weeklyartistchart(_from=1114965332, to=1115570132): ... print i.name, i.chartposition ... Note that we have had to prefix the ``from`` keyword with an underscore (``_``). This is because ``from`` is a reserved word in Python and can't be used as a parameter name. Any parameter passed with a leading underscore will have that underscore stripped (so ``_from`` is passed as ``from``, as ``_foo`` would be passed as ``foo``). If an element has an attribute (for example the artist has an ``mbid`` in /user/.../topalbums.xml) these can be accessed as a dictionary key of that element: >>> offmessage = AudioScrobblerQuery(user='offmessage') >>> for i in offmessage.topalbums(): ... print i.name, i.artist, i.artist['mbid'] ... if you're not sure if an element has an attribute they can be accessed instead using the ``get()`` method: >>> offmessage = AudioScrobblerQuery(user='offmessage') >>> for i in offmessage.topalbums(): ... print i.name, i.artist, i.artist.get('mbid', '') ... More control ------------ There are 2 additional keyword arguments that you can offer at the point of instantiation of the AudioScrobblerQuery object: host If the lovely people at Last.fm change their server name, or if you set up some kind of local proxy of their services you can set the host from which you get the XML. Usage: >>> lips = AudioScrobblerQuery(artist='The Flaming Lips', ... host='audioscrobbler.isotoma.com') Default is ``'ws.audioscrobbler.com'`` version If another version of the web services is released, and this code still holds up you can set the protocol version at instantiation. This is inserted into the request URL at the correct point (i.e. ws.audioscrobbler.com/**1.0**/artist/The+Flaming+Lips). Usage: >>> lips = AudioScrobberRequest(artist='The Flaming Lips', version='1.1') Default is ``'1.0'`` Caching ------- Each instance of the ``AudioScrobblerQuery`` maintains its own internal cache of requests, which are checked against the server's response. If the server returns a ``304`` (content not modified) we return the cached value, otherwise we return the result that the server gave us. This is all well and good, however at the time of writing the ``ws.audioscrobbler.com`` server does not support the ``304`` response for all pages, so you may find yourself making requests that you are sure should be cached, but in fact aren't. For example: http://ws.audioscrobbler.com/1.0/user/offmessage/topalbums.xml returns a ``304`` http://ws.audioscrobbler.com/1.0/artist/The+Flaming+Lips/similar.xml does not I have assumed that this is for a reason, and as such honour this behaviour. If a page does not return a ``Last-Modified`` header we do not cache it. Any page that does return such a header (but not the ``Pragma: no-cache`` header) gets cached. Any page that does return a ``Last-Modified`` header gets exactly what it sent to us sent back to it as the ``If-Modified-Since``. This is a fit of pragmatism based on the fact that calculating local dates and avoiding clock disparaties is not worth the effort. Also, note that the AudioScrobbler servers do not return the ``ETag`` header and so we do not look for it or refer to it. A last note ----------- These classes are for consuming the AudioScrobbler web services. As such each of the classes here have no ``set``, ``__setitem__`` or ``__setattr__`` methods. They are read only. If you want to actually manipulate the resulting XML you should access the underlying ElementTree_ instances directly using either the ``raw()`` or ``element()`` methods provided. You can then make use of the innate power of those classes directly: ``raw()`` returns an ElementTree: >>> tree = AudioScrobblerQuery(user='offmessage').topalbums().raw() while ``element()`` returns an Element at the point within the tree that you currently are: >>> lips = AudioScrobblerQuery(artist='The Flaming Lips') >>> elements = [ x.name.element() for x in lips.similar() ] which is equivalent to: >>> lips = AudioScrobberRequest(artist='The Flaming Lips') >>> elements = lips.similar().raw().findall('*/name') As an alternative you could also look at XMLTramp_, which is another XML manipulator designed primarily for consuming web services (and used in the FlickrClient_ script that gave me much inspiration for these classes). Last but not least a mention should go to BeautifulSoup_, just because it is the most powerful and flexible of this type of application that I've used. It specialises in badly formed XML/HTML though, and luckily is not required in this instance. That said, it's a powerful beast and you should have a look at it the minute your requirements become more complex than this code supports. .. _ElementTree: http://effbot.org/zone/element.htm .. _XMLTramp: http://www.aaronsw.com/2002/xmltramp/ .. _BeautifulSoup: http://www.crummy.com/software/BeautifulSoup/ AudioScrobblerPost: Update Your Personal Play History ===================================================== A set of classes for posting playlist information to your Last.fm account. Please note that you will need your own account to use these classes. Updated to work with version 1.2 of the Audioscrobbler protocol. Some stuff about the time management and internal cache should go here. Basic usage (outdated) ----------- >>> track = dict(artist_name="The Flaming Lips", song_title="The Yeah Yeah Yeah Song", length=291, date_played="2006-04-29 04:20:00", album="At War With The Mystics", mbid="" ) >>> post = AudioScrobblerPost(user='offmessage', password='mypasswd') >>> post(**track) >>> More control ------------ There are a number of keywords that can be passed at the time of instantiation of the ``AudioScrobblerPost`` class: verbose Boolean. If you pass ``verbose=True`` every log line is also printed. Useful for debugging and in interactive scripts. client_name By default pyscrobbler uses the ``tst`` client name. If you deploy these classes in an application with a wide user base it seems to be advisable to apply for your own client name. If lots of people start to use these classes as is I will apply for a unique name for them. If you have your own, pass it in here (as a string) client_version Currently we use ``1.0``. This is because we are using the ``tst`` client name (see above) and anything lower seems to raise an ``UPDATE`` message from the post server at handshake. protocol_version By default we use ``1.1``. These classes are not compatible with Protocol 1.0. It's unlikely they will be compatible with any later versions. The changes between 1.0 and 1.1 were pretty major; I can't see they'd be any less major for the next version. host By default we use ``post.audioscrobbler.com``. If the server name changes (or you want to run tests) you can pass a different host name here. In fact, the url that we authenticate against is built as ``"http://%s/?%s" % (host, params)`` so as long as your host string makes a valid url in that format, go for it. Note the trailing slash between host and the query string. This seems to be a requirement of urllib2. This means that your test auth script should be able to be called that way. Putting them to use in real life ================================ Some advice on using these classes. ``timeout`` ----------- I've not done anything about the socket timeout on the running system. It's not really this code's place to do anything about it, but it is something that probably needs sorting out, otherwise your scripts will hang for as long as your timeout setting if there is a problem with the Last.fm servers (which there appears to be fairly frequently with the submissions servers). Generally, if you are on a slow link or one with poor latency you can up the timeout so that your requests don't keep failing unnecessarily. However, if you're on a quick link you may want to lower it as low as 10 seconds, as the wait can be agonising if you're making a few requests and the server is not responding. Thanks ====== I took a considerable amount of inspiration from Michael Campeotto's FlickrClient_ script for AudioScrobblerQuery I've taken even greater amounts of inspiration from Mike Bleyer's iPodScrobbler_ script for AudioScrobblerPost. .. _FlickrClient: http://micampe.it/things/flickrclient .. _iPodScrobbler: http://www.hoc.net/mike/source/iPodScrobbler/ TODO ==== Mad leet reStructuredText epydoc mashup Get that sorted. Example query script Actually write some example query scripts :) Document use of the factory class AudioScrobbler """ __author__ = "Andy Theyers <andy@isotoma.com>" __version__ = "$Revision$"[11:-2] __docformat__ = "restructuredtext" import datetime, locale, hashlib, site, sys, time, urllib, urllib2, ConfigParser, os from xml.etree import ElementTree # This is lifted in the most part from iPodScrobbler (see docs above) # Get the base local encoding enc = 'ascii' try: enc = site.encoding except: pass if enc == 'ascii' and locale.getpreferredencoding(): enc = locale.getpreferredencoding() # if we are on MacOSX, we default to UTF8 # because apples python reports 'ISO8859-1' as locale, but MacOSX uses utf8 if sys.platform=='darwin': enc = 'utf8' # AudioScrobblerQuery configuration settings audioscrobbler_request_version = '1.0' audioscrobbler_request_host = 'ws.audioscrobbler.com' # AudioScrobblerPost configuration settings audioscrobbler_post_version = u'1.2' #updated audioscrobbler_post_host = 'post.audioscrobbler.com' client_name = u'sna' pyscrobbler_version = u'1.0.0.0' # This is set to 1.0 while we use # client_name = u'tst' as we keep getting # UPDATE responses with anything less. class AudioScrobblerError(Exception): """ The base AudioScrobbler error from which all our other exceptions derive """ def __init__(self, message): """ Create a new AudioScrobblerError. :Parameters: - `message`: The message that will be displayed to the user """ self.message = message def __repr__(self): msg = "%s: %s" return msg % (self.__class__.__name__, self.message,) def __str__(self): return self.__repr__() class AudioScrobblerConnectionError(AudioScrobblerError): """ The base network error, raise by invalid HTTP responses or failures to connect to the server specified (DNS, timeouts, etc.) """ def __init__(self, type, code, message): self.type = type self.code = code self.message = message def __repr__(self): msg = "AudioScrobblerConnectionError: %s: %s %s" return msg % (self.type.upper(), self.code, self.message,) class AudioScrobblerTypeError(AudioScrobblerError): """ If we would normally raise a TypeError we raise this instead """ pass class AudioScrobblerPostUpdate(AudioScrobblerError): """ If the POST server returns an ``UPDATE`` message we raise this exception. This is the only case when this exception is raised, allowing you to happily ignore it. """ def __repr__(self): msg = "An update to your AudioScrobbler client is available at %s" return msg % (self.message,) class AudioScrobblerPostFailed(AudioScrobblerError): """ If the POST server returns an ``FAILED`` message we raise this exception. """ def __repr__(self): msg = "Posting track to AudioScrobbler failed. Reason given: %s" return msg % (self.message,) class AudioScrobblerHandshakeError(AudioScrobblerError): """ If we fail the handshake this is raised. If you're running in a long running process you should pass on this error, as the system keeps a cache which ``flushcache()`` will clear for you when the server is back. """ pass class AudioScrobbler: """ Factory for Queries and Posts. Holds configuration for the session """ def __init__(self, audioscrobbler_request_version=audioscrobbler_request_version, audioscrobbler_post_version=audioscrobbler_post_version, audioscrobbler_request_host=audioscrobbler_request_host, audioscrobbler_post_host=audioscrobbler_post_host, client_name=client_name, client_version=pyscrobbler_version): self.audioscrobbler_request_version=audioscrobbler_request_version self.audioscrobbler_post_version=audioscrobbler_post_version self.audioscrobbler_request_host=audioscrobbler_request_host self.audioscrobbler_post_host=audioscrobbler_post_host self.client_name=client_name self.client_version=pyscrobbler_version def query(self, **kwargs): """ Create a new AudioScrobblerQuery """ if len(kwargs) != 1: raise TypeError("__init__() takes exactly 1 argument, %s " "given" % (len(kwargs),)) ret = AudioScrobblerQuery(version=self.audioscrobbler_request_version, host=self.audioscrobbler_request_host, **kwargs) return ret def post(self, username, md5_password, verbose=False): """ Create a new AudioScrobblerPost """ ret = AudioScrobblerPost(username=username.encode('utf8'), md5_password=md5_password.encode('utf8'), host=self.audioscrobbler_post_host, protocol_version=self.audioscrobbler_post_version, client_name=self.client_name, client_version=self.client_version, verbose=verbose) return ret class AudioScrobblerCache: def __init__(self, elemtree, last): self.elemtree = elemtree self.requestdate = last def created(self): return self.requestdate def gettree(self): return self.elemtree class AudioScrobblerQuery: def __init__(self, version=audioscrobbler_request_version, host=audioscrobbler_request_host, **kwargs): if len(kwargs) != 1: raise TypeError("__init__() takes exactly 1 audioscrobbler " "request argument, %s given" % str(len(kwargs)) ) self.type = kwargs.keys()[0] self.param = str(kwargs[self.type]) self.baseurl = 'http://%s/%s/%s/%s' % (host, version, urllib.quote(self.type), urllib.quote(self.param), ) self._cache = {} def __getattr__(self, name): def method(_self=self, name=name, **params): # Build the URL url = '%s/%s.xml' % (_self.baseurl, urllib.quote(name)) if len(params) != 0: for key in params.keys(): # This little mess is required to get round the fact that # 'from' is a reserved word and can't be passed as a # parameter name. if key.startswith('_'): params[key[1:]] = params[key] del params[key] url = '%s?%s' % (url, urllib.urlencode(params)) req = urllib2.Request(url) # Check the cache cache = _self._cache if url in cache and cache[url].created() is not None: req.add_header('If-Modified-Since', cache[url].created()) # Open the URL and test the response try: response = urllib2.urlopen(url) except urllib2.HTTPError, error: if error.code == 304: return AudioScrobblerItem(cache[url].getroot(), _self, url) if error.code == 400: raise AudioScrobblerConnectionError('ws', 400, error.fp.read()) raise AudioScrobblerConnectionError('http', error.code, error.msg) except urllib2.URLError, error: code = error.reason.args[0] message = error.reason.args[1] raise AudioScrobblerConnectionError('network', code, message) elemtree = ElementTree.ElementTree(file=response) if response.headers.get('pragma', None) != 'no-cache': last_modified = response.headers.get('last-modified', None) else: last_modified = None _self._cache[url] = AudioScrobblerCache(elemtree, last_modified) return AudioScrobblerItem(elemtree.getroot(), _self, url) return method def __repr__(self): return "AudioScrobblerQuery(%s='%s')" % (self.type, self.param) def __str__(self): return self.__repr__() class AudioScrobblerItem: def __init__(self, element, parent, url=None): self._element = element self._parent = parent self.tag = element.tag self.text = element.text self._url = url if self._url is None: self._url = self._parent._url def __repr__(self): if isinstance(self._parent, AudioScrobblerQuery): return "<AudioScrobbler response from %s>" % (self._url,) return "<AudioScrobbler %s element at %s>" % (self.tag, id(self)) def __str__(self): if self.text is None: return '' text = self.text try: retval = text.encode(enc) except AttributeError: retval = text return retval def __getattr__(self, name): result = self._element.findall(name) if len(result) == 0: raise AttributeError("AudioScrobbler %s element has no " "subelement '%s'" % (self.tag, name) ) ret = [ AudioScrobblerItem(i, self) for i in result ] if len(ret) == 1: return ret[0] return ret def __iter__(self): for i in self._element: yield AudioScrobblerItem(i, self) def __getitem__(self, i): return self._element.attrib[i] def get(self, i, default): if i in self._element.attrib: return self._element.attrib[i] else: return default def __getslice__(self, i, j): return [ AudioScrobblerItem(x, self) for x in self._element[i:j] ] def raw(self): def getparent(obj): if isinstance(obj._parent, AudioScrobblerQuery): return obj._parent return getparent(obj._parent) return getparent(self)._cache[self._url].gettree() def element(self): return self._element class AudioScrobblerPost: """ Provide the ability to post tracks played to a user's Last.fm account """ #Updated to protocol version 1.2 def __init__(self, username=u'', md5_password=u'', client_name=client_name, client_version=pyscrobbler_version, protocol_version=audioscrobbler_post_version, host=audioscrobbler_post_host, verbose=False): # Capture the information passed for future use self.params = dict(username=username, md5_password=md5_password, client_name=client_name, client_version=client_version, protocol_version=protocol_version, host=host) self.verbose = verbose self.auth_details = {} self.last_post = None self.interval = 0 self.cache = [] self.loglines = [] self.last_shake = None self.authenticated = False self.updateurl = None self.posturl = None self.npurl = None def auth(self): """ Authenticate against the server """ if self.authenticated: return True timestamp = str(int(time.time())) md5_password = self.params['md5_password'] auth_token = hashlib.md5(md5_password + timestamp).hexdigest() p = {} p['hs'] = 'true' p['p'] = self.params['protocol_version'] p['c'] = self.params['client_name'] p['v'] = self.params['client_version'] p['u'] = self.params['username'] p['t'] = timestamp p['a'] = auth_token plist = [(k, urllib.quote_plus(v.encode('utf8'))) for k, v in p.items()] authparams = urllib.urlencode(plist) url = 'http://%s/?%s' % (self.params['host'], authparams) req = urllib2.Request(url) try: url_handle = urllib2.urlopen(req) except urllib2.HTTPError, error: self.authenticated = False raise AudioScrobblerConnectionError('http', error.code, error.msg) except urllib2.URLError, error: self.authenticated = False code = error.reason#.args[0] message = error.reason#.args[1] raise AudioScrobblerConnectionError('network', code, message) response = url_handle.readlines() if len(response) == 0: raise AudioScrobblerHandshakeError('Got nothing back from the server') username = self.params['username'] md5_password = self.params['md5_password'] # First we test the best and most likely case if response[0].startswith('OK'): answer = response[1].strip() self.auth_details['s'] = answer self.npurl = response[2].strip() self.posturl = response[3].strip() self.authenticated = True # Then the various failure states.... elif response[0].startswith('BANNED'): self.authenticated = False msg = "this client version has been banned from the server." raise AudioScrobblerHandshakeError(msg) elif response[0].startswith('BADAUTH'): self.authenticated = False msg = "The authentication details provided were incorrect." raise AudioScrobblerHandshakeError(msg) elif response[0].startswith('BADTIME'): self.authenticated = False msg = "The timestamp provided was not close enough to the current time." raise AudioScrobblerHandshakeError(msg) elif response[0].startswith('FAILED'): self.authenticated = False reason = response[0][6:] try: msg = reason.decode('utf8').encode(enc) except: msg = reason raise AudioScrobblerHandshakeError(msg) else: self.authenticated = False msg = "Unknown response from server: %r" % (response,) raise AudioScrobblerHandshakeError(msg) def posttrack(self, artist_name, song_title, length, date_played, tracknumber=u'', album=u'', mbid=u'', source=u'P'): """ Add the track to the local cache, and try to post it to the server """ self.addtrack(artist_name=artist_name, song_title=song_title, length=length, date_played=date_played, tracknumber=tracknumber, album=album, mbid=mbid, source=source) self.post() __call__ = posttrack def addtrack(self, artist_name, song_title, length, date_played, tracknumber=u'', album=u'', mbid=u'', source=u'P'): """ Add a track to the local cache """ # Quick sanity check on track length if type(length) == type(0): sane_length = length elif type(length) == type('') and length.isdigit(): sane_length = int(length) else: sane_length = -1 # If the track length is less than 30 move on if sane_length < 30: msg = ("Track '%s' by '%s' only %s seconds in length, so " "not added" % (song_title, artist_name, sane_length)) self.log(msg) # Otherwise build the track dictionary and add it to the local cache else: try: track = {'a[%s]': artist_name.encode('utf8'), 't[%s]': song_title.encode('utf8'), 'l[%s]': str(sane_length), 'i[%s]': date_played, 'b[%s]': album.encode('utf8'), 'm[%s]': mbid.encode('utf8'), 'r[%s]': u'', 'n[%s]': tracknumber.encode('utf8'), 'o[%s]': source.encode('utf8'), } except: track = {'a[%s]': artist_name, 't[%s]': song_title, 'l[%s]': str(sane_length), 'i[%s]': date_played, 'b[%s]': album, 'm[%s]': mbid.encode('utf8'), 'r[%s]': u'', 'n[%s]': tracknumber.encode('utf8'), 'o[%s]': source.encode('utf8'), } self.cache.append(track) def nowplaying(self, artist_name, song_title, length=u'', tracknumber=u'', album=u'', mbid=u''): self.auth() p = {} p['s'] = self.auth_details['s'] try: p['a'] = artist_name.encode('utf8') p['t'] = song_title.encode('utf8') p['b'] = album.encode('utf8') p['l'] = length.encode('utf8') p['n'] = tracknumber.encode('utf8') p['m'] = mbid.encode('utf8') except: p['a'] = artist_name p['t'] = song_title p['b'] = album p['l'] = length.encode('utf8') p['n'] = tracknumber.encode('utf8') p['m'] = mbid.encode('utf8') npdata = urllib.urlencode(p) req = urllib2.Request(url=self.npurl, data=npdata) try: url_handle = urllib2.urlopen(req) except urllib2.HTTPError, error: self.authenticated = False print AudioScrobblerConnectionError('http', error.code, error.msg) return except: code = '000' message = sys.exc_info()[1] print AudioScrobblerConnectionError('network', code, message) return response = url_handle.readlines() if response[0].startswith('OK'): self.log("Now playing track updated ('%s' by '%s')." % (p['t'], p['a'])) elif response[0].startswith('BADSESSION'): self.authenticated = False def post(self): """ Post the tracks by popping the first ten off the cache and attempting to post them. """ if len(self.cache) == 0: return if len(self.cache) > 10: number = 10 else: number = len(self.cache) params = {} count = 0 for track in self.cache[:number]: for k in track.keys(): params[k % (count,)] = track[k] count += 1 self.auth() params.update(self.auth_details) postdata = urllib.urlencode(params) req = urllib2.Request(url=self.posturl, data=postdata) now = datetime.datetime.utcnow() try: url_handle = urllib2.urlopen(req) except urllib2.HTTPError, error: raise AudioScrobblerConnectionError('http', error.code, error.msg) except urllib2.URLError, error: args = getattr(error.reason, 'args', None) code = '000' message = str(error) if args is not None: if len(args) == 1: message = error.reason.args[0] elif len(args) == 2: code = error.reason.args[0] message = error.reason.args[1] raise AudioScrobblerConnectionError('network', code, message) except: code = '000' message = sys.exc_info()[1] raise AudioScrobblerConnectionError('network', code, message) self.last_post = now response = url_handle.readlines() # Test the various responses possibilities: if response[0].startswith('OK'): for song in self.cache[:number]: self.log("Uploaded track successfully ('%s' by '%s')." % (song['t[%s]'], song['a[%s]'])) del self.cache[:number] elif response[0].startswith('BADSESSION'): self.log("Got BADSESSION.") self.authenticated = False elif response[0].startswith('FAILED'): reason = response[0][6:].strip() raise AudioScrobblerPostFailed(reason) else: msg = "Server returned something unexpected." raise AudioScrobblerPostFailed(msg) def flushcache(self): """ Post all the tracks in the cache """ while len(self.cache) > 0: self.post() def savecache(self, filename): """ Save all tracks in the cache to a file """ conf = ConfigParser.ConfigParser() # Save each track in cache: count = 0 for track in self.cache: conf.add_section('Track ' + str(count)) for k in track.keys(): conf.set('Track ' + str(count), k, track[k]) count += 1 conf.write(file(filename, 'w')) def retrievecache(self, filename): """ Retrieve all cached tracks from a file so that cached tracks are preserved across client restarts """ if not os.path.isfile(filename): return conf = ConfigParser.ConfigParser() conf.read(filename) # Retrieve each cached track from file: count = 0 while conf.has_section('Track ' + str(count)): track = {} for key in ['a','t','l','i','b','m','r','n','o']: if conf.has_option('Track ' + str(count), key + '[%s]'): track[key + '[%s]'] = conf.get('Track ' + str(count), key + '[%s]') self.cache.append(track) count += 1 # Cached tracks retrieved, delete file: os.remove(filename) def log(self, msg): """ Add a line to the log, print it if verbose """ time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.loglines.append("%s: %s" % (time, msg)) if self.verbose: print self.loglines[-1] def getlog(self, clear=False): """ Return the entire log, clear it if requested """ if clear: retval = self.loglines self.loglines = [] return retval return self.loglines ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/breadcrumbs.py����������������������������������������������������������������0000664�0000000�0000000�00000012515�11255764730�0017312�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import gtk class CrumbButton(gtk.ToggleButton): """A ToggleButton tailored for use as a breadcrumb.""" def __init__(self, image, label): gtk.ToggleButton.__init__(self) self.set_properties(can_focus=False, relief=gtk.RELIEF_NONE) # adapt gtk.Button internal layout code: hbox = gtk.HBox(spacing=2) align = gtk.Alignment(xalign=0.5, yalign=0.5) hbox.pack_start(image, False, False) hbox.pack_start(label, True, True) align.add(hbox) self.add(align) class CrumbBox(gtk.Box): """A box layout similar to gtk.HBox, but specifically for breadcrumbs. * Crumbs in the middle are replaced with an ellipsis if necessary. * The root, parent, and current element are always kept visible. * The root and parent are put in a condensed form if necessary. * The current element is truncated if necessary. """ __gtype_name__ = 'CrumbBox' def __init__(self, *args, **kwargs): gtk.Box.__init__(self, *args, **kwargs) # FIXME i can't get an internal child ellipsis to render... # gtk.widget_push_composite_child() # self.ellipsis = gtk.Label("...") # self.ellipsis.props.visible = True # gtk.widget_pop_composite_child() # self.ellipsis.set_parent(self) def do_size_request(self, requisition): """This gets called to determine the size we request""" # ellipsis_req = self.ellipsis.size_request() reqs = [w.size_request() for w in self] # This would request "natural" size: # pad = 0 if not reqs else (len(reqs)-1)*self.props.spacing # requisition.width = sum( [r[0] for r in reqs]) + pad # requisition.height = max([0]+[r[1] for r in reqs]) # return # Request "minimum" size: height = max([0]+[r[1] for r in reqs]) if len(reqs) == 0: # empty width = 0 elif len(reqs) < 3: # current crumb width = height elif len(reqs) == 3: # parent and current width = height + height + self.props.spacing elif len(reqs) == 4: # root, parent and current width = height + height + height + 2*self.props.spacing elif len(reqs) > 4: # root, ellipsis, parent, current pad = 3*self.props.spacing width = height + reqs[1][0] + height + height + pad requisition.width = width requisition.height = height def _req_sum(self, reqs): pad = 0 if not reqs else (len(reqs)-1)*self.props.spacing return pad+sum([req[0] for req in reqs]) def _condense(self, req, w): # FIXME show and hide cause a fight in an infinite loop # try: # w.get_child().get_child().get_children()[1].hide() # except (AttributeError, IndexError): # pass wr, hr = req return (hr, hr) # XXX simplistic: set square size for now def _uncondense(self, w): # try: # w.get_child().get_child().get_children()[1].show() # except (AttributeError, IndexError): pass def _truncate(self, req, amount): wr, hr = req return (wr-amount, hr) # XXX this can be less than hr, even <0 def do_size_allocate(self, allocation): """This gets called to layout our child widgets""" x0, y0 = allocation.x, allocation.y w0, h0 = allocation.width, allocation.height crumbs = self.get_children() if len(crumbs) < 2: return # FIXME: self.ellipsis = crumbs.pop(1) hidden = [self.ellipsis] # Undo any earlier condensing if len(crumbs) > 0: self._uncondense(crumbs[0]) if len(crumbs) > 1: self._uncondense(crumbs[-2]) reqs = [w.get_child_requisition() for w in crumbs] # If necessary, condense the root crumb if self._req_sum(reqs) > w0 and len(crumbs) > 2: reqs[0] = self._condense(reqs[0], crumbs[0]) # If necessary, replace an increasing amount of the # crumbs after the root with the ellipsis while self._req_sum(reqs) > w0: if self.ellipsis in hidden and len(crumbs) > 3: hidden = [crumbs.pop(1)] reqs.pop(1) crumbs.insert(1, self.ellipsis) req = self.ellipsis.get_child_requisition() reqs.insert(1, req) elif self.ellipsis in crumbs and len(crumbs) > 4: hidden.append(crumbs.pop(2)) reqs.pop(2) else: break # don't remove the parent # If necessary, condense the parent crumb if self._req_sum(reqs) > w0 and len(crumbs) > 1: reqs[-2] = self._condense(reqs[-2], crumbs[-2]) # If necessary, truncate the current crumb if self._req_sum(reqs) > w0: reqs[-1] = self._truncate(reqs[-1], self._req_sum(reqs)-w0) # Now we are at minimum width x = 0 for w, req in zip(crumbs, reqs): wr, _hr = req w.size_allocate(gtk.gdk.Rectangle(x0+x, y0, wr, h0)) w.show() x += wr + self.props.spacing for w in hidden: w.size_allocate(gtk.gdk.Rectangle(-1, -1, 0, 0)) w.hide() # def do_forall(self, internal, callback, data): # callback(self.ellipsis, data) # for w in self.get_children(): # callback(w, data) # this file can be run as a simple test program: if __name__ == '__main__': w = gtk.Window() crumbs = CrumbBox(spacing=2) items = [ (gtk.STOCK_HARDDISK, "Filesystem"), (None, None), # XXX for ellipsis (gtk.STOCK_OPEN, "home"), (gtk.STOCK_OPEN, "user"), (gtk.STOCK_OPEN, "music"), (gtk.STOCK_OPEN, "genre"), (gtk.STOCK_OPEN, "artist"), (gtk.STOCK_OPEN, "album"), ] for stock, text in items: if stock: image = gtk.image_new_from_stock(stock, gtk.ICON_SIZE_MENU) crumbs.pack_start(CrumbButton(image, gtk.Label(text))) else: crumbs.pack_start(gtk.Label("...")) w.add(crumbs) w.connect('hide', gtk.main_quit) w.show_all() gtk.main() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/cli.py������������������������������������������������������������������������0000664�0000000�0000000�00000020517�11255764730�0015571�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import sys, getopt try: import version except ImportError: import svnversion as version # the mpd commands need a connection to server and exit without gui mpd_cmds = ["play", "pause", "stop", "next", "prev", "pp", "info", "status", "repeat", "random"] # toggle and popup need d-bus and don't always need gui # version and help don't need anything and exit without gui # hidden and visible are only applicable when gui is launched # profile and no-start don't need anything short_opts = "tpnvh" long_opts = ["toggle", "popup", "no-start", "version", "help", "hidden", "visible", "profile="] class Args(object): def __init__(self): self.skip_gui = False self.opts = [] self.args = [] self.toggle_arg = None self.popup_arg = None self.start_arg = None self.start_visibility = None self.arg_profile = None def should_skip_gui(self): return self.skip_gui def parse(self, argv): """Parse the command line arguments. Separates options and arguments from the given argument list, checks their validity.""" try: self.opts, self.args = getopt.getopt(argv[1:], short_opts, long_opts) for a in self.args: if a in mpd_cmds: self.skip_gui = True else: self.print_usage() sys.exit(1) except getopt.GetoptError: # print help information and exit: self.print_usage() sys.exit(1) def process_options(self): """If options were passed, perform action on them.""" for o, a in self.opts: if o in ("-t", "--toggle"): self.toggle_arg = True self.start_visibility = True elif o in ("-p", "--popup"): self.popup_arg = True if self.start_visibility is None: self.start_visibility = False elif o in ("-n", "--no-start"): self.start_arg = False elif o in ("-v", "--version"): self.print_version() sys.exit() elif o in ("-h", "--help"): self.print_usage() sys.exit() elif o in ("--visible"): self.start_visibility = True elif o in ("--hidden"): self.start_visibility = False elif o in ("--profile"): self.arg_profile = a if self.toggle_arg or self.popup_arg: import dbus_plugin as dbus if not dbus.using_dbus(): print _("The toggle and popup arguments require D-Bus. Aborting.") sys.exit(1) dbus.execute_remote_commands(self.toggle_arg, self.popup_arg, self.start_arg) def execute_cmds(self): """If arguments were passed, perform action on them.""" if self.args: main = CliMain(self) mpdh.suppress_mpd_errors(True) main.mpd_connect() for a in self.args: main.execute_cmd(a) sys.exit() def print_version(self): print _("Version") + ": Sonata", (version.VERSION) print _("Website") + ": http://sonata.berlios.de/" def print_usage(self): self.print_version() print "" print _("Usage: sonata [OPTION]... [COMMAND]...") print "" print _("Options") + ":" print " -h, --help " + _("Show this help and exit") print " -p, --popup " + _("Popup song notification (requires D-Bus)") print " -t, --toggle " + _("Toggles whether the app is minimized") print " " + _("to tray or visible (requires D-Bus)") print " -n, --no-start " + _("Don't start app if D-Bus commands fail") print " -v, --version " + _("Show version information and exit") print " --hidden " + _("Start app hidden (requires systray)") print " --visible " + _("Start app visible (requires systray)") print " --profile=[NUM] " + _("Start with profile [NUM]") print "" print _("Commands") + ":" print " play " + _("Play song in playlist") print " pause " + _("Pause currently playing song") print " stop " + _("Stop currently playing song") print " next " + _("Play next song in playlist") print " prev " + _("Play previous song in playlist") print " pp " + _("Toggle play/pause; plays if stopped") print " repeat " + _("Toggle repeat mode") print " random " + _("Toggle random mode") print " info " + _("Display current song info") print " status " + _("Display MPD status") def apply_profile_arg(self, config): if self.arg_profile: try: a = int(self.arg_profile) if a > 0 and a <= len(config.profile_names): config.profile_num = a-1 print _("Starting Sonata with profile %s...") % config.profile_names[config.profile_num] else: print _("%d is not an available profile number.") % a print _("Profile numbers must be between 1 and %d.") % len(config.profile_names) sys.exit(1) except ValueError: print _("Python is unable to interpret %s as a number.") % self.arg_profile print _("Profile numbers must be between 1 and %d.") % len(config.profile_names) sys.exit(1) class CliMain(object): def __init__(self, args): global os, mpd, config, library, mpdh, misc import os import mpd import config import library import mpdhelper as mpdh import misc self.config = config.Config(_('Default Profile'), _("by") + " %A " + _("from") + " %B", library.library_set_data) self.config.settings_load_real(library.library_set_data) args.apply_profile_arg(self.config) self.client = mpd.MPDClient() def mpd_connect(self): host, port, password = misc.mpd_env_vars() if not host: host = self.config.host[self.config.profile_num] if not port: port = self.config.port[self.config.profile_num] if not password: password = self.config.password[self.config.profile_num] mpdh.call(self.client, 'connect', host, port) if len(password) > 0: mpdh.call(self.client, 'password', password) def execute_cmd(self, cmd): self.status = mpdh.status(self.client) if not self.status: print _("Unable to connect to MPD.\nPlease check your Sonata preferences or MPD_HOST/MPD_PORT environment variables.") sys.exit(1) self.songinfo = mpdh.currsong(self.client) if cmd == "play": mpdh.call(self.client, 'play') elif cmd == "pause": mpdh.call(self.client, 'pause', 1) elif cmd == "stop": mpdh.call(self.client, 'stop') elif cmd == "next": mpdh.call(self.client, 'next') elif cmd == "prev": mpdh.call(self.client, 'previous') elif cmd == "random": if self.status['random'] == '0': mpdh.call(self.client, 'random', 1) else: mpdh.call(self.client, 'random', 0) elif cmd == "repeat": if self.status['repeat'] == '0': mpdh.call(self.client, 'repeat', 1) else: mpdh.call(self.client, 'repeat', 0) elif cmd == "pp": if self.status['state'] in ['play']: mpdh.call(self.client, 'pause', 1) elif self.status['state'] in ['pause', 'stop']: mpdh.call(self.client, 'play') elif cmd == "info": if self.status['state'] in ['play', 'pause']: mpdh.conout (_("Title") + ": " + mpdh.get(self.songinfo, 'title')) mpdh.conout (_("Artist") + ": " + mpdh.get(self.songinfo, 'artist')) mpdh.conout (_("Album") + ": " + mpdh.get(self.songinfo, 'album')) mpdh.conout (_("Date") + ": " + mpdh.get(self.songinfo, 'date')) mpdh.conout (_("Track") + ": " + mpdh.getnum(self.songinfo, 'track', '0', False, 2)) mpdh.conout (_("Genre") + ": " + mpdh.get(self.songinfo, 'genre')) mpdh.conout (_("File") + ": " + os.path.basename(mpdh.get(self.songinfo, 'file'))) at, _length = [int(c) for c in self.status['time'].split(':')] at_time = misc.convert_time(at) try: time = misc.convert_time(int(mpdh.get(self.songinfo, 'time'))) print _("Time") + ": " + at_time + " / " + time except: print _("Time") + ": " + at_time print _("Bitrate") + ": " + self.status.get('bitrate', '') else: print _("MPD stopped") elif cmd == "status": try: if self.status['state'] == 'play': print _("State") + ": " + _("Playing") elif self.status['state'] == 'pause': print _("State") + ": " + _("Paused") elif self.status['state'] == 'stop': print _("State") + ": " + _("Stopped") if self.status['repeat'] == '0': print _("Repeat") + ": " + _("Off") else: print _("Repeat") + ": " + _("On") if self.status['random'] == '0': print _("Random") + ": " + _("Off") else: print _("Random") + ": " + _("On") print _("Volume") + ": " + self.status['volume'] + "/100" print _('Crossfade') + ": " + self.status['xfade'] + ' ' + gettext.ngettext('second', 'seconds', int(self.status['xfade'])) except: pass ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/config.py���������������������������������������������������������������������0000664�0000000�0000000�00000044716�11255764730�0016276�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" This module contains the configuration variables and implements their initialisation, loading, and saving in a file. Example usage: import config ... # XXX We shouldn't have the default values contain localised parts: self.config = config.Config(_('Default Profile'), _("by") + " %A " + _("from") + " %B") """ import os, hashlib import ConfigParser from consts import consts import misc class Config: """This class contains the configuration variables as attributes. Each new variable should be initialised to its default value in __init__, loaded from a file in settings_load_real, and saved to a file in settings_save_real. XXX This is mostly ConfigParser plus some custom serialization work. """ def __init__(self, default_profile_name, currsongformat2, library_set_data): # the config settings: self.profile_num = 0 self.profile_names = [default_profile_name] self.musicdir = [misc.sanitize_musicdir("~/music")] self.host = ['localhost'] self.port = [6600] self.password = [''] self.x = 0 self.y = 0 self.w = 400 self.h = 300 self.expanded = True self.withdrawn = False self.sticky = False self.ontop = False self.decorated = True self.screen = 0 self.xfade = 0 self.xfade_enabled = False self.show_covers = True self.covers_type = 1 self.covers_pref = consts.ART_LOCAL_REMOTE self.show_notification = False self.show_playback = True self.show_progress = True self.show_statusbar = False self.show_trayicon = True self.show_lyrics = True self.stop_on_exit = False self.update_on_start = False self.minimize_to_systray = False self.popup_option = 2 self.initial_run = True self.show_header = True self.tabs_expanded = False self.currentformat = "%A - %T|%L" self.libraryformat = "%A - %T" self.titleformat = "[Sonata] %A - %T" self.currsongformat1 = "%T" self.currsongformat2 = currsongformat2 # this mirrors Main.columns widths self.columnwidths = [325,10] self.autoconnect = True self.stream_names = [] self.stream_uris = [] self.last_search_num = 0 self.use_infofile = False self.infofile_path = '/tmp/xmms-info' self.lib_view = consts.VIEW_FILESYSTEM self.art_location = consts.ART_LOCATION_HOMECOVERS self.art_location_custom_filename = "" self.lyrics_location = consts.LYRICS_LOCATION_HOME self.tags_use_mpdpath = False self.as_enabled = False self.as_username = "" self.as_password_md5 = "" self.url_browser = "" self.wd = library_set_data(path="/") self.info_song_expanded = True self.info_lyrics_expanded = True self.info_album_expanded = True self.info_song_more = False self.current_tab_visible = True self.library_tab_visible = True self.playlists_tab_visible = True self.streams_tab_visible = True self.info_tab_visible = True self.art_cache = [] # these mirror Main.notebook tab nums self.current_tab_pos = 0 self.library_tab_pos = 1 self.playlists_tab_pos = 2 self.streams_tab_pos = 3 self.info_tab_pos = 4 self.info_art_enlarged = False self.existing_playlist_option = 0 self.traytips_notifications_location = 0 # Local consts self.LIB_NODATA = "!NONE!" def settings_load_real(self, library_set_data): """Load configuration from file""" # Load config conf = ConfigParser.ConfigParser() misc.create_dir('~/.config/sonata/') if os.path.isfile(os.path.expanduser('~/.config/sonata/sonatarc')): conf.read(os.path.expanduser('~/.config/sonata/sonatarc')) else: return # Compatibility with previous versions of Sonata: # -------------------------------------------------------------------- if conf.has_option('connection', 'host'): self.host[0] = conf.get('connection', 'host') if conf.has_option('connection', 'port'): self.port[0] = int(conf.get('connection', 'port')) if conf.has_option('connection', 'password'): self.password[0] = conf.get('connection', 'password') if conf.has_option('connection', 'musicdir'): self.musicdir[0] = misc.sanitize_musicdir(conf.get('connection', 'musicdir')) # -------------------------------------------------------------------- if conf.has_option('connection', 'auto'): self.autoconnect = conf.getboolean('connection', 'auto') if conf.has_option('connection', 'profile_num'): self.profile_num = conf.getint('connection', 'profile_num') if conf.has_option('player', 'x'): self.x = conf.getint('player', 'x') if conf.has_option('player', 'y'): self.y = conf.getint('player', 'y') if conf.has_option('player', 'w'): self.w = conf.getint('player', 'w') if conf.has_option('player', 'h'): self.h = conf.getint('player', 'h') if conf.has_option('player', 'expanded'): self.expanded = conf.getboolean('player', 'expanded') if conf.has_option('player', 'withdrawn'): self.withdrawn = conf.getboolean('player', 'withdrawn') if conf.has_option('player', 'screen'): self.screen = conf.getint('player', 'screen') if conf.has_option('player', 'covers'): self.show_covers = conf.getboolean('player', 'covers') if conf.has_option('player', 'covers_type'): self.covers_type = conf.getint('player', 'covers_type') if conf.has_option('player', 'stop_on_exit'): self.stop_on_exit = conf.getboolean('player', 'stop_on_exit') if conf.has_option('player', 'minimize'): self.minimize_to_systray = conf.getboolean('player', 'minimize') if conf.has_option('player', 'initial_run'): self.initial_run = conf.getboolean('player', 'initial_run') if conf.has_option('player', 'statusbar'): self.show_statusbar = conf.getboolean('player', 'statusbar') if conf.has_option('player', 'lyrics'): self.show_lyrics = conf.getboolean('player', 'lyrics') if conf.has_option('player', 'sticky'): self.sticky = conf.getboolean('player', 'sticky') if conf.has_option('player', 'ontop'): self.ontop = conf.getboolean('player', 'ontop') if conf.has_option('player', 'decorated'): self.decorated = conf.getboolean('player', 'decorated') if conf.has_option('player', 'notification'): self.show_notification = conf.getboolean('player', 'notification') if conf.has_option('player', 'popup_time'): self.popup_option = conf.getint('player', 'popup_time') if conf.has_option('player', 'update_on_start'): self.update_on_start = conf.getboolean('player', 'update_on_start') if conf.has_option('player', 'notif_location'): self.traytips_notifications_location = conf.getint('player', 'notif_location') if conf.has_option('player', 'playback'): self.show_playback = conf.getboolean('player', 'playback') if conf.has_option('player', 'progressbar'): self.show_progress = conf.getboolean('player', 'progressbar') if conf.has_option('player', 'crossfade'): crossfade = conf.getint('player', 'crossfade') # Backwards compatibility: self.xfade = crossfade if conf.has_option('player', 'xfade'): self.xfade = conf.getint('player', 'xfade') if conf.has_option('player', 'xfade_enabled'): self.xfade_enabled = conf.getboolean('player', 'xfade_enabled') if conf.has_option('player', 'covers_pref'): self.covers_pref = conf.getint('player', 'covers_pref') # Specifying remote artwork first is too confusing and probably # rarely used, so we're removing this option and defaulting users # back to the default 'local, then remote' option. if self.covers_pref > consts.ART_LOCAL_REMOTE: self.covers_pref = consts.ART_LOCAL_REMOTE if conf.has_option('player', 'use_infofile'): self.use_infofile = conf.getboolean('player', 'use_infofile') if conf.has_option('player', 'infofile_path'): self.infofile_path = conf.get('player', 'infofile_path') if conf.has_option('player', 'trayicon'): self.show_trayicon = conf.getboolean('player', 'trayicon') if conf.has_option('player', 'search_num'): self.last_search_num = conf.getint('player', 'search_num') if conf.has_option('player', 'art_location'): self.art_location = conf.getint('player', 'art_location') if conf.has_option('player', 'art_location_custom_filename'): self.art_location_custom_filename = conf.get('player', 'art_location_custom_filename') if conf.has_option('player', 'lyrics_location'): self.lyrics_location = conf.getint('player', 'lyrics_location') if conf.has_option('player', 'info_song_expanded'): self.info_song_expanded = conf.getboolean('player', 'info_song_expanded') if conf.has_option('player', 'info_lyrics_expanded'): self.info_lyrics_expanded = conf.getboolean('player', 'info_lyrics_expanded') if conf.has_option('player', 'info_album_expanded'): self.info_album_expanded = conf.getboolean('player', 'info_album_expanded') if conf.has_option('player', 'info_song_more'): self.info_song_more = conf.getboolean('player', 'info_song_more') if conf.has_option('player', 'columnwidths'): self.columnwidths = [int(col) for col in conf.get('player', 'columnwidths').split(",")] if conf.has_option('player', 'show_header'): self.show_header = conf.getboolean('player', 'show_header') if conf.has_option('player', 'tabs_expanded'): self.tabs_expanded = conf.getboolean('player', 'tabs_expanded') if conf.has_option('player', 'browser'): self.url_browser = conf.get('player', 'browser') if conf.has_option('player', 'info_art_enlarged'): self.info_art_enlarged = conf.getboolean('player', 'info_art_enlarged') if conf.has_option('player', 'existing_playlist'): self.existing_playlist_option = conf.getint('player', 'existing_playlist') if conf.has_section('notebook'): if conf.has_option('notebook', 'current_tab_visible'): self.current_tab_visible = conf.getboolean('notebook', 'current_tab_visible') if conf.has_option('notebook', 'library_tab_visible'): self.library_tab_visible = conf.getboolean('notebook', 'library_tab_visible') if conf.has_option('notebook', 'playlists_tab_visible'): self.playlists_tab_visible = conf.getboolean('notebook', 'playlists_tab_visible') if conf.has_option('notebook', 'streams_tab_visible'): self.streams_tab_visible = conf.getboolean('notebook', 'streams_tab_visible') if conf.has_option('notebook', 'info_tab_visible'): self.info_tab_visible = conf.getboolean('notebook', 'info_tab_visible') if conf.has_option('notebook', 'current_tab_pos'): try: self.current_tab_pos = conf.getint('notebook', 'current_tab_pos') except: pass if conf.has_option('notebook', 'library_tab_pos'): try: self.library_tab_pos = conf.getint('notebook', 'library_tab_pos') except: pass if conf.has_option('notebook', 'playlists_tab_pos'): try: self.playlists_tab_pos = conf.getint('notebook', 'playlists_tab_pos') except: pass if conf.has_option('notebook', 'streams_tab_pos'): try: self.streams_tab_pos = conf.getint('notebook', 'streams_tab_pos') except: pass if conf.has_option('notebook', 'info_tab_pos'): try: self.info_tab_pos = conf.getint('notebook', 'info_tab_pos') except: pass if conf.has_section('library'): album = None artist = None genre = None year = None path = None if conf.has_option('library', 'lib_view'): self.lib_view = conf.getint('library', 'lib_view') if conf.has_option('library', 'lib_album'): album = conf.get('library', 'lib_album') if conf.has_option('library', 'lib_artist'): artist = conf.get('library', 'lib_artist') if conf.has_option('library', 'lib_genre'): genre = conf.get('library', 'lib_genre') if conf.has_option('library', 'lib_year'): year = conf.get('library', 'lib_year') if conf.has_option('library', 'lib_path'): path = conf.get('library', 'lib_path') if album == self.LIB_NODATA: album = None if artist == self.LIB_NODATA: artist = None if genre == self.LIB_NODATA: genre = None if year == self.LIB_NODATA: year = None if path == self.LIB_NODATA: path = None self.wd = library_set_data(album=album, artist=artist, genre=genre, year=year, path=path) if conf.has_section('currformat'): if conf.has_option('currformat', 'current'): self.currentformat = conf.get('currformat', 'current') if conf.has_option('currformat', 'library'): self.libraryformat = conf.get('currformat', 'library') if conf.has_option('currformat', 'title'): self.titleformat = conf.get('currformat', 'title') if conf.has_option('currformat', 'currsong1'): self.currsongformat1 = conf.get('currformat', 'currsong1') if conf.has_option('currformat', 'currsong2'): self.currsongformat2 = conf.get('currformat', 'currsong2') if conf.has_section('tags'): if conf.has_option('tags', 'use_mpdpaths'): self.tags_use_mpdpath = conf.getboolean('tags', 'use_mpdpaths') if conf.has_option('streams', 'num_streams'): num_streams = conf.getint('streams', 'num_streams') self.stream_names = [] self.stream_uris = [] for i in range(num_streams): self.stream_names.append(conf.get('streams', 'names[' + str(i) + ']')) self.stream_uris.append(conf.get('streams', 'uris[' + str(i) + ']')) if conf.has_option('audioscrobbler', 'use_audioscrobbler'): self.as_enabled = conf.getboolean('audioscrobbler', 'use_audioscrobbler') if conf.has_option('audioscrobbler', 'username'): self.as_username = conf.get('audioscrobbler', 'username') if conf.has_option('audioscrobbler', 'password'): # old... self.as_password_md5 = hashlib.md5(conf.get('audioscrobbler', 'password')).hexdigest() if conf.has_option('audioscrobbler', 'password_md5'): self.as_password_md5 = conf.get('audioscrobbler', 'password_md5') if conf.has_option('profiles', 'num_profiles'): num_profiles = conf.getint('profiles', 'num_profiles') if num_profiles > 0: self.profile_names = [] self.host = [] self.port = [] self.password = [] self.musicdir = [] for i in range(num_profiles): self.profile_names.append(conf.get('profiles', 'names[' + str(i) + ']')) self.host.append(conf.get('profiles', 'hosts[' + str(i) + ']')) self.port.append(conf.getint('profiles', 'ports[' + str(i) + ']')) self.password.append(conf.get('profiles', 'passwords[' + str(i) + ']')) self.musicdir.append(misc.sanitize_musicdir(conf.get('profiles', 'musicdirs[' + str(i) + ']'))) # Ensure we have a valid profile number: self.profile_num = max(0, min(self.profile_num, num_profiles-1)) def settings_save_real(self, library_get_data): """Save configuration in file""" conf = ConfigParser.ConfigParser() conf.add_section('profiles') conf.set('profiles', 'num_profiles', len(self.profile_names)) for (i, (name, host, port, password, musicdir)) in enumerate(zip(self.profile_names, self.host, self.port, self.password, self.musicdir)): conf.set('profiles', 'names[%s]' % i, name) conf.set('profiles', 'hosts[%s]' % i, host) conf.set('profiles', 'ports[%s]' % i, port) conf.set('profiles', 'passwords[%s]' %i, password) conf.set('profiles', 'musicdirs[%s]' % i, musicdir) conf.add_section('connection') conf.set('connection', 'auto', self.autoconnect) conf.set('connection', 'profile_num', self.profile_num) conf.add_section('player') attributes = ['w', 'h', 'x', 'y', 'expanded', 'withdrawn', 'screen', 'covers_type', 'stop_on_exit', 'initial_run', 'sticky', 'ontop', 'decorated', 'update_on_start', 'xfade', 'xfade_enabled', 'covers_pref', 'use_infofile', 'infofile_path', 'infofile_path', 'art_location', 'art_location_custom_filename', 'lyrics_location', 'info_song_expanded', 'info_lyrics_expanded', 'info_album_expanded', 'info_song_more', 'info_art_enlarged', 'show_header', 'tabs_expanded'] for attribute in attributes: conf.set('player', attribute, getattr(self, attribute)) conf.set('player', 'covers', self.show_covers) conf.set('player', 'minimize', self.minimize_to_systray) conf.set('player', 'statusbar', self.show_statusbar) conf.set('player', 'lyrics', self.show_lyrics) conf.set('player', 'notification', self.show_notification) conf.set('player', 'popup_time', self.popup_option) conf.set('player', 'notif_location', self.traytips_notifications_location) conf.set('player', 'playback', self.show_playback) conf.set('player', 'progressbar', self.show_progress) conf.set('player', 'trayicon', self.show_trayicon) conf.set('player', 'search_num', self.last_search_num) conf.set('player', 'existing_playlist', self.existing_playlist_option) conf.set('player', 'browser', self.url_browser) columnwidths = ",".join(str(w) for w in self.columnwidths) conf.set('player', 'columnwidths', columnwidths) # Save tab positions and visibility: conf.add_section('notebook') attributes = ['current_tab_visible', 'library_tab_visible', 'playlists_tab_visible', 'streams_tab_visible', 'info_tab_visible', 'current_tab_pos', 'library_tab_pos', 'playlists_tab_pos', 'streams_tab_pos', 'info_tab_pos'] for attribute in attributes: conf.set('notebook', attribute, getattr(self,attribute)) # Save current library browsing state: album = library_get_data(self.wd, 'album') artist = library_get_data(self.wd, 'artist') genre = library_get_data(self.wd, 'genre') year = library_get_data(self.wd, 'year') path = library_get_data(self.wd, 'path') if album is None: album = self.LIB_NODATA if artist is None: artist = self.LIB_NODATA if genre is None: genre = self.LIB_NODATA if year is None: year = self.LIB_NODATA if path is None: path = self.LIB_NODATA conf.add_section('library') conf.set('library', 'lib_album', album) conf.set('library', 'lib_artist', artist) conf.set('library', 'lib_genre', genre) conf.set('library', 'lib_year', year) conf.set('library', 'lib_path', path) conf.set('library', 'lib_view', self.lib_view) # Save formats for current playlist, library, etc: conf.add_section('currformat') conf.set('currformat', 'current', self.currentformat) conf.set('currformat', 'library', self.libraryformat) conf.set('currformat', 'title', self.titleformat) conf.set('currformat', 'currsong1', self.currsongformat1) conf.set('currformat', 'currsong2', self.currsongformat2) # Save streams: conf.add_section('streams') conf.set('streams', 'num_streams', len(self.stream_names)) for (i, (stream, stream_uri)) in enumerate(zip(self.stream_names,self.stream_uris)): conf.set('streams', 'names[%s]' % i, stream) conf.set('streams', 'uris[%s]' % i , stream_uri) conf.add_section('audioscrobbler') conf.set('audioscrobbler', 'use_audioscrobbler', self.as_enabled) conf.set('audioscrobbler', 'username', self.as_username) conf.set('audioscrobbler', 'password_md5', self.as_password_md5) # Tag editor conf.add_section('tags') conf.set('tags', 'use_mpdpaths', self.tags_use_mpdpath) conf.write(file(os.path.expanduser('~/.config/sonata/sonatarc'), 'w')) ��������������������������������������������������sonata-1.6.2.1/sonata/consts.py���������������������������������������������������������������������0000664�0000000�0000000�00000003433�11255764730�0016331�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This module contains various constant definitions that any other module can import without risk of cyclic imports. Most of the constants are enum-like, that is, they provide symbolic names for a set of values. XXX Should some of these be moved to be private in some module, or into config? Example usage: from consts import consts ... if view == consts.VIEW_ALBUM: ... """ class Constants: """This class contains the constant definitions as attributes.""" def __init__(self): self.HEAD_URL = "1.6.2.1" self.ART_LOCAL = 0 self.ART_LOCAL_REMOTE = 1 self.VIEW_FILESYSTEM = 0 self.VIEW_ARTIST = 1 self.VIEW_GENRE = 2 self.VIEW_ALBUM = 3 self.LYRIC_TIMEOUT = 10 self.NOTIFICATION_WIDTH_MAX = 500 self.NOTIFICATION_WIDTH_MIN = 350 self.FULLSCREEN_COVER_SIZE = 500 self.ART_LOCATION_HOMECOVERS = 0 # ~/.covers/[artist]-[album].jpg self.ART_LOCATION_COVER = 1 # file_dir/cover.jpg self.ART_LOCATION_ALBUM = 2 # file_dir/album.jpg self.ART_LOCATION_FOLDER = 3 # file_dir/folder.jpg self.ART_LOCATION_CUSTOM = 4 # file_dir/[custom] self.ART_LOCATION_SINGLE = 6 self.ART_LOCATION_MISC = 7 self.ART_LOCATIONS_MISC = ['front.jpg', '.folder.jpg', '.folder.png', 'AlbumArt.jpg', 'AlbumArtSmall.jpg'] self.LYRICS_LOCATION_HOME = 0 # ~/.lyrics/[artist]-[song].txt self.LYRICS_LOCATION_PATH = 1 # file_dir/[artist]-[song].txt self.LYRICS_LOCATION_HOME_ALT = 2 # ~/.lyrics/[artist] - [song].txt self.LYRICS_LOCATION_PATH_ALT = 3 # file_dir/[artist] - [song].txt self.LIB_COVER_SIZE = 32 self.COVERS_TYPE_STANDARD = 0 self.COVERS_TYPE_STYLIZED = 1 self.LIB_LEVEL_GENRE = 0 self.LIB_LEVEL_ARTIST = 1 self.LIB_LEVEL_ALBUM = 2 self.LIB_LEVEL_SONG = 3 self.NUM_ARTISTS_FOR_VA = 2 consts = Constants() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/current.py��������������������������������������������������������������������0000664�0000000�0000000�00000075155�11255764730�0016514�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This module handles the mpd current playlist and provides a user interface for it. Example usage: import current self.current = current.Current(self.config, self.client, self.TAB_CURRENT, self.on_current_button_press, self.parse_formatting_colnames, self.parse_formatting, self.connected, lambda:self.sonata_loaded, lambda:self.songinfo, self.update_statusbar, self.iterate_now, lambda:self.library.libsearchfilter_get_style()) vbox_current, playlistevbox = self.current.get_widgets() ... self.current.current_update(prevstatus_playlist, self.status['playlistlength']) ... """ import os, re, urllib import threading # searchfilter_toggle starts thread searchfilter_loop import gtk, pango, gobject import ui, misc import mpdhelper as mpdh class Current(object): def __init__(self, config, client, TAB_CURRENT, on_current_button_press, parse_formatting_colnames, parse_formatting, connected, sonata_loaded, songinfo, update_statusbar, iterate_now, libsearchfilter_get_style, new_tab): self.config = config self.client = client self.on_current_button_press = on_current_button_press self.parse_formatting_colnames = parse_formatting_colnames self.parse_formatting = parse_formatting self.connected = connected self.sonata_loaded = sonata_loaded self.songinfo = songinfo self.update_statusbar = update_statusbar self.iterate_now = iterate_now self.libsearchfilter_get_style = libsearchfilter_get_style self.currentdata = None self.filterbox_visible = False self.current_update_skip = False self.filter_row_mapping = [] # Mapping between filter rows and self.currentdata rows self.columnformat = None self.columns = None self.current_songs = None self.filterbox_cmd_buf = None self.filterbox_cond = None self.filterbox_source = None self.column_sorted = (None, gtk.SORT_DESCENDING) # TreeViewColumn, order self.total_time = 0 self.edit_style_orig = None self.resizing_columns = None self.prev_boldrow = -1 self.prevtodo = None self.plpos = None self.playlist_pos_before_filter = None self.sel_rows = None # Current tab self.current = ui.treeview(reorder=True, search=False, headers=True) self.current_selection = self.current.get_selection() self.expanderwindow = ui.scrollwindow(shadow=gtk.SHADOW_IN, add=self.current) self.filterpattern = ui.entry() self.filterbox = gtk.HBox() self.filterbox.pack_start(ui.label(text=_("Filter") + ":"), False, False, 5) self.filterbox.pack_start(self.filterpattern, True, True, 5) filterclosebutton = ui.button(img=ui.image(stock=gtk.STOCK_CLOSE), relief=gtk.RELIEF_NONE) self.filterbox.pack_start(filterclosebutton, False, False, 0) self.filterbox.set_no_show_all(True) self.vbox_current = gtk.VBox() self.vbox_current.pack_start(self.expanderwindow, True, True) self.vbox_current.pack_start(self.filterbox, False, False, 5) self.tab = new_tab(self.vbox_current, gtk.STOCK_CDROM, TAB_CURRENT, self.current) self.current.connect('drag_data_received', self.on_dnd) self.current.connect('row_activated', self.on_current_click) self.current.connect('button_press_event', self.on_current_button_press) self.current.connect('drag-begin', self.on_current_drag_begin) self.current.connect_after('drag-begin', self.dnd_after_current_drag_begin) self.current.connect('button_release_event', self.on_current_button_release) self.filter_changed_handler = self.filterpattern.connect('changed', self.searchfilter_feed_loop) self.filterpattern.connect('activate', self.searchfilter_on_enter) self.filterpattern.connect('key-press-event', self.searchfilter_key_pressed) filterclosebutton.connect('clicked', self.searchfilter_toggle) # Set up current view self.initialize_columns() self.current_selection.set_mode(gtk.SELECTION_MULTIPLE) target_reorder = ('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0) target_file_managers = ('text/uri-list', 0, 0) self.current.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, [target_reorder, target_file_managers], gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_DEFAULT) self.current.enable_model_drag_dest([target_reorder, target_file_managers], gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_DEFAULT) self.current.connect('drag-data-get', self.dnd_get_data_for_file_managers) def get_model(self): return self.currentdata def get_widgets(self): return self.vbox_current def get_treeview(self): return self.current def get_selection(self): return self.current_selection def get_filterbox_visible(self): return self.filterbox_visible def initialize_columns(self): # Initialize current playlist data and widget self.resizing_columns = False self.columnformat = self.config.currentformat.split("|") self.currentdata = gtk.ListStore(*([int] + [str] * len(self.columnformat))) self.current.set_model(self.currentdata) cellrenderer = gtk.CellRendererText() cellrenderer.set_property("ellipsize", pango.ELLIPSIZE_END) num_columns = len(self.columnformat) if num_columns != len(self.config.columnwidths): # Number of columns changed, set columns equally spaced: self.config.columnwidths = [self.current.allocation.width/num_columns] * num_columns colnames = self.parse_formatting_colnames(self.config.currentformat) self.columns = [gtk.TreeViewColumn(name, cellrenderer, markup=(i+1)) for i, name in enumerate(colnames)] for column, width in zip(self.columns,self.config.columnwidths): column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) # If just one column, we want it to expand with the tree, so don't set a # fixed_width; if multiple columns, size accordingly: if num_columns > 1: column.set_resizable(True) try: column.set_fixed_width(max(width, 10)) except: column.set_fixed_width(150) column.connect('clicked', self.on_current_column_click) self.current.append_column(column) self.current.set_fixed_height_mode(True) self.current.set_headers_visible(num_columns > 1 and self.config.show_header) self.current.set_headers_clickable(not self.filterbox_visible) def get_current_songs(self): return self.current_songs def dnd_get_data_for_file_managers(self, _treeview, context, selection, _info, _timestamp): if not os.path.isdir(self.config.musicdir[self.config.profile_num]): # Prevent the DND mouse cursor from looking like we can DND # when we clearly can't. return context.drag_status(gtk.gdk.ACTION_COPY, context.start_time) filenames = self.get_selected_filenames(True) uris = ["file://%s" % urllib.quote(filename) for filename in filenames] selection.set_uris(uris) def get_selected_filenames(self, return_abs_paths): _model, selected = self.current_selection.get_selected_rows() filenames = [] for path in selected: if not self.filterbox_visible: item = mpdh.get(self.current_songs[path[0]], 'file') else: item = mpdh.get(self.current_songs[self.filter_row_mapping[path[0]]], 'file') if return_abs_paths: filenames.append(self.config.musicdir[self.config.profile_num] + item) else: filenames.append(item) return filenames def update_format(self): for track in self.current_songs: items = [self.parse_formatting(part, track, True) for part in self.columnformat] self.currentdata.append([int(mpdh.get(track, 'id'))] + items) def current_update(self, prevstatus_playlist, new_playlist_length): if self.connected(): if self.sonata_loaded(): playlistposition = self.current.get_visible_rect()[1] self.current.freeze_child_notify() if not self.current_update_skip: if not self.filterbox_visible: self.current.set_model(None) if prevstatus_playlist: changed_songs = mpdh.call(self.client, 'plchanges', prevstatus_playlist) else: changed_songs = mpdh.call(self.client, 'plchanges', 0) self.current_songs = [] newlen = int(new_playlist_length) currlen = len(self.currentdata) for track in changed_songs: pos = int(mpdh.get(track, 'pos')) items = [self.parse_formatting(part, track, True) for part in self.columnformat] if pos < currlen: # Update attributes for item: i = self.currentdata.get_iter((pos, )) trackid = int(mpdh.get(track, 'id')) if trackid != self.currentdata.get_value(i, 0): self.currentdata.set_value(i, 0, trackid) for index in range(len(items)): if items[index] != self.currentdata.get_value(i, index + 1): self.currentdata.set_value(i, index + 1, items[index]) self.current_songs[pos] = track else: # Add new item: self.currentdata.append([int(mpdh.get(track, 'id'))] + items) self.current_songs.append(track) if newlen == 0: self.currentdata.clear() self.current_songs = [] else: # Remove excess songs: for i in range(currlen-newlen): it = self.currentdata.get_iter((currlen-1-i,)) self.currentdata.remove(it) self.current_songs = self.current_songs[:newlen] if not self.filterbox_visible: self.current.set_model(self.currentdata) self.current_update_skip = False # Update statusbar time: self.total_time = 0 for track in self.current_songs: try: self.total_time = self.total_time + int(mpdh.get(track, 'time')) except: pass if 'pos' in self.songinfo(): currsong = int(mpdh.get(self.songinfo(), 'pos')) self.boldrow(currsong) self.prev_boldrow = currsong if self.filterbox_visible: # Refresh filtered results: self.prevtodo = "RETAIN_POS_AND_SEL" # Hacky, but this ensures we retain the self.current position/selection self.plpos = playlistposition self.searchfilter_feed_loop(self.filterpattern) elif self.sonata_loaded(): self.playlist_retain_view(self.current, playlistposition) self.current.thaw_child_notify() self.header_update_column_indicators() self.update_statusbar() ui.change_cursor(None) def header_update_column_indicators(self): # If we just sorted a column, display the sorting arrow: if self.column_sorted[0]: if self.column_sorted[1] == gtk.SORT_DESCENDING: self.header_hide_all_indicators(self.current, True) self.column_sorted[0].set_sort_order(gtk.SORT_ASCENDING) self.column_sorted = (None, gtk.SORT_ASCENDING) else: self.header_hide_all_indicators(self.current, True) self.column_sorted[0].set_sort_order(gtk.SORT_DESCENDING) self.column_sorted = (None, gtk.SORT_DESCENDING) def playlist_retain_view(self, listview, playlistposition): # Attempt to retain library position: try: # This is the weirdest thing I've ever seen. But if, for # example, you edit a song twice, the position of the # playlist will revert to the top the second time because # we are telling gtk to scroll to the same point as # before. So we will simply scroll to the top and then # back to the actual position. The first position change # shouldn't be visible by the user. listview.scroll_to_point(-1, 0) listview.scroll_to_point(-1, playlistposition) except: pass def header_hide_all_indicators(self, treeview, show_sorted_column): if not show_sorted_column: self.column_sorted = (None, gtk.SORT_DESCENDING) for column in treeview.get_columns(): if show_sorted_column and column == self.column_sorted[0]: column.set_sort_indicator(True) else: column.set_sort_indicator(False) def center_song_in_list(self, _event=None): if self.filterbox_visible: return if self.config.expanded and len(self.currentdata)>0: self.current.realize() try: row = mpdh.get(self.songinfo(), 'pos', None) if row is None: return visible_rect = self.current.get_visible_rect() row_rect = self.current.get_background_area(row, self.columns[0]) top_coord = (row_rect.y + row_rect.height - int(visible_rect.height/2)) + visible_rect.y self.current.scroll_to_point(-1, top_coord) except: pass def current_get_songid(self, i, model): return int(model.get_value(i, 0)) def on_current_drag_begin(self, _widget, _context): self.sel_rows = False def dnd_after_current_drag_begin(self, _widget, context): # Override default image of selected row with sonata icon: context.set_icon_stock('sonata', 0, 0) def on_current_button_release(self, widget, event): if self.sel_rows: self.sel_rows = False # User released mouse, select single row: selection = widget.get_selection() selection.unselect_all() path, _col, _x, _y = widget.get_path_at_pos(int(event.x), int(event.y)) selection.select_path(path) def on_current_column_click(self, column): columns = self.current.get_columns() col_num = 0 for col in columns: col_num = col_num + 1 if column == col: self.sort('col' + str(col_num), column) return def on_sort_by_artist(self, _action): self.sort('artist') def on_sort_by_album(self, _action): self.sort('album') def on_sort_by_title(self, _action): self.sort('title') def on_sort_by_file(self, _action): self.sort('file') def on_sort_by_dirfile(self, _action): self.sort('dirfile') def sort(self, mode, column=None): if self.connected(): if not self.currentdata: return while gtk.events_pending(): gtk.main_iteration() songs = [] track_num = 0 if mode[0:3] == 'col': col_num = int(mode.replace('col', '')) if column.get_sort_indicator(): # If this column was already sorted, reverse list: self.column_sorted = (column, self.column_sorted[1]) self.on_sort_reverse(None) return else: self.column_sorted = (column, gtk.SORT_DESCENDING) mode = "col" # If the first tag in the format is song length, we will make sure to compare # the same number of items in the song length string (e.g. always use # ##:##:##) and pad the first item to two (e.g. #:##:## -> ##:##:##) custom_sort = False if mode == 'col': custom_sort, custom_pos = self.sort_get_first_format_tag(self.config.currentformat, col_num, 'L') for track in self.current_songs: record = {} # Those items that don't have the specified tag will be put at # the end of the list (hence the 'zzzzzzz'): zzz = 'zzzzzzzz' if mode == 'artist': record["sortby"] = (misc.lower_no_the(mpdh.get(track, 'artist', zzz)), mpdh.get(track, 'album', zzz).lower(), mpdh.getnum(track, 'disc', '0', True, 0), mpdh.getnum(track, 'track', '0', True, 0)) elif mode == 'album': record["sortby"] = (mpdh.get(track, 'album', zzz).lower(), mpdh.getnum(track, 'disc', '0', True, 0), mpdh.getnum(track, 'track', '0', True, 0)) elif mode == 'file': record["sortby"] = mpdh.get(track, 'file', zzz).lower().split('/')[-1] elif mode == 'dirfile': record["sortby"] = mpdh.get(track, 'file', zzz).lower() elif mode == 'col': # Sort by column: record["sortby"] = misc.unbold(self.currentdata.get_value(self.currentdata.get_iter((track_num, 0)), col_num).lower()) if custom_sort: record["sortby"] = self.sanitize_songlen_for_sorting(record["sortby"], custom_pos) else: record["sortby"] = mpdh.get(track, mode, zzz).lower() record["id"] = int(track["id"]) songs.append(record) track_num = track_num + 1 songs.sort(key=lambda x: x["sortby"]) pos = 0 mpdh.call(self.client, 'command_list_ok_begin') for item in songs: mpdh.call(self.client, 'moveid', item["id"], pos) pos += 1 mpdh.call(self.client, 'command_list_end') self.iterate_now() self.header_update_column_indicators() def sort_get_first_format_tag(self, format, colnum, tag_letter): # Returns a tuple with whether the first tag of the format # includes tag_letter and the position of the tag in the string: formats = format.split('|') format = formats[colnum-1] prev_letter = None for letter in format: if letter == tag_letter and prev_letter == '%': return (True, pos) else: break prev_letter = letter return (False, 0) def sanitize_songlen_for_sorting(self, songlength, pos_of_string): songlength = songlength[pos_of_string:] items = [item.zfill(2) for item in songlength.split(':')] for i in range(3-len(items)): items.insert(0, "00") return ":".join(item for item in items[:3]) def on_sort_reverse(self, _action): if self.connected(): if not self.currentdata: return while gtk.events_pending(): gtk.main_iteration() top = 0 bot = len(self.currentdata)-1 mpdh.call(self.client, 'command_list_ok_begin') while top < bot: mpdh.call(self.client, 'swap', top, bot) top = top + 1 bot = bot - 1 mpdh.call(self.client, 'command_list_end') self.iterate_now() def on_dnd(self, treeview, drag_context, x, y, selection, _info, timestamp): drop_info = treeview.get_dest_row_at_pos(x, y) if selection.data is not None: if not os.path.isdir(misc.file_from_utf8(self.config.musicdir[self.config.profile_num])): return # DND from outside sonata: uri = selection.data.strip() path = urllib.url2pathname(uri) paths = path.rsplit('\n') mpdpaths = [] # Strip off paranthesis so that we can DND entire music dir # if we wish. musicdir = self.config.musicdir[self.config.profile_num][:-1] for i, path in enumerate(paths): paths[i] = path.rstrip('\r') if paths[i].startswith('file://'): paths[i] = paths[i][7:] elif paths[i].startswith('file:'): paths[i] = paths[i][5:] if paths[i].startswith(musicdir): paths[i] = paths[i][len(self.config.musicdir[self.config.profile_num]):] if len(paths[i]) == 0: paths[i] = "/" listallinfo = mpdh.call(self.client, 'listallinfo', paths[i]) for item in listallinfo: if 'file' in item: mpdpaths.append(mpdh.get(item, 'file')) elif mpdh.mpd_major_version(self.client) >= 0.14: # Add local file, available in mpd 0.14. This currently won't # work because python-mpd does not support unix socket paths, # which is needed for authentication for local files. It's also # therefore untested. if os.path.isdir(misc.file_from_utf8(paths[i])): filenames = misc.get_files_recursively(paths[i]) else: filenames = [paths[i]] for filename in filenames: if os.path.exists(misc.file_from_utf8(filename)): mpdpaths.append("file://" + urllib.quote(filename)) if len(mpdpaths) > 0: # Items found, add to list at drop position: if drop_info: destpath, position = drop_info if position in (gtk.TREE_VIEW_DROP_BEFORE, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE): songid = destpath[0] else: songid = destpath[0] + 1 else: songid = len(self.currentdata) for mpdpath in mpdpaths: mpdh.call(self.client, 'addid', mpdpath, songid) self.iterate_now() return # Otherwise, it's a DND just within the current playlist model = treeview.get_model() _foobar, selected = self.current_selection.get_selected_rows() # calculate all this now before we start moving stuff drag_sources = [] for path in selected: index = path[0] i = model.get_iter(path) songid = self.current_get_songid(i, model) text = model.get_value(i, 1) drag_sources.append([index, i, songid, text]) # Keep track of the moved iters so we can select them afterwards moved_iters = [] # We will manipulate self.current_songs and model to prevent the entire playlist # from refreshing offset = 0 mpdh.call(self.client, 'command_list_ok_begin') for source in drag_sources: index, i, songid, text = source if drop_info: destpath, position = drop_info dest = destpath[0] + offset if dest < index: offset = offset + 1 if position in (gtk.TREE_VIEW_DROP_BEFORE, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE): self.current_songs.insert(dest, self.current_songs[index]) if dest < index+1: self.current_songs.pop(index+1) mpdh.call(self.client, 'moveid', songid, dest) else: self.current_songs.pop(index) mpdh.call(self.client, 'moveid', songid, dest-1) model.insert(dest, model[index]) moved_iters += [model.get_iter((dest,))] model.remove(i) else: self.current_songs.insert(dest+1, self.current_songs[index]) if dest < index: self.current_songs.pop(index+1) mpdh.call(self.client, 'moveid', songid, dest+1) else: self.current_songs.pop(index) mpdh.call(self.client, 'moveid', songid, dest) model.insert(dest+1, model[index]) moved_iters += [model.get_iter((dest+1,))] model.remove(i) else: #dest = int(self.status['playlistlength']) - 1 dest = len(self.currentdata) - 1 mpdh.call(self.client, 'moveid', songid, dest) self.current_songs.insert(dest+1, self.current_songs[index]) self.current_songs.pop(index) model.insert(dest+1, model[index]) moved_iters += [model.get_iter((dest+1,))] model.remove(i) # now fixup for source in drag_sources: if dest < index: # we moved it back, so all indexes inbetween increased by 1 if dest < source[0] < index: source[0] += 1 else: # we moved it ahead, so all indexes inbetween decreased by 1 if index < source[0] < dest: source[0] -= 1 mpdh.call(self.client, 'command_list_end') # we are manipulating the model manually for speed, so... self.current_update_skip = True if drag_context.action == gtk.gdk.ACTION_MOVE: drag_context.finish(True, True, timestamp) self.header_hide_all_indicators(self.current, False) self.iterate_now() gobject.idle_add(self.dnd_retain_selection, treeview.get_selection(), moved_iters) def dnd_retain_selection(self, treeselection, moved_iters): treeselection.unselect_all() for i in moved_iters: treeselection.select_iter(i) def on_current_click(self, _treeview, path, _column): model = self.current.get_model() if self.filterbox_visible: self.searchfilter_on_enter(None) return try: i = model.get_iter(path) mpdh.call(self.client, 'playid', self.current_get_songid(i, model)) except: pass self.sel_rows = False self.iterate_now() def searchfilter_toggle(self, _widget, initial_text=""): if self.filterbox_visible: ui.hide(self.filterbox) self.filterbox_visible = False self.edit_style_orig = self.libsearchfilter_get_style() self.filterpattern.set_text("") self.searchfilter_stop_loop() elif self.connected(): self.playlist_pos_before_filter = self.current.get_visible_rect()[1] self.filterbox_visible = True self.filterpattern.handler_block(self.filter_changed_handler) self.filterpattern.set_text(initial_text) self.filterpattern.handler_unblock(self.filter_changed_handler) self.prevtodo = 'foo' ui.show(self.filterbox) # extra thread for background search work, synchronized with a condition and its internal mutex self.filterbox_cond = threading.Condition() self.filterbox_cmd_buf = initial_text qsearch_thread = threading.Thread(target=self.searchfilter_loop) qsearch_thread.setDaemon(True) qsearch_thread.start() gobject.idle_add(self.filter_entry_grab_focus, self.filterpattern) self.current.set_headers_clickable(not self.filterbox_visible) def searchfilter_on_enter(self, _entry): model, selected = self.current.get_selection().get_selected_rows() song_id = None if len(selected) > 0: # If items are selected, play the first selected item: song_id = self.current_get_songid(model.get_iter(selected[0]), model) elif len(model) > 0: # If nothing is selected: play the first item: song_id = self.current_get_songid(model.get_iter_first(), model) if song_id: self.searchfilter_toggle(None) mpdh.call(self.client, 'playid', song_id) def searchfilter_feed_loop(self, editable): # Lets only trigger the searchfilter_loop if 200ms pass without a change # in gtk.Entry try: gobject.source_remove(self.filterbox_source) except: pass self.filterbox_source = gobject.timeout_add(200, self.searchfilter_start_loop, editable) def searchfilter_start_loop(self, editable): self.filterbox_cond.acquire() self.filterbox_cmd_buf = editable.get_text() self.filterbox_cond.notifyAll() self.filterbox_cond.release() def searchfilter_stop_loop(self): self.filterbox_cond.acquire() self.filterbox_cmd_buf = '$$$QUIT###' self.filterbox_cond.notifyAll() self.filterbox_cond.release() def searchfilter_loop(self): while self.filterbox_visible: # copy the last command or pattern safely self.filterbox_cond.acquire() try: while(self.filterbox_cmd_buf == '$$$DONE###'): self.filterbox_cond.wait() todo = self.filterbox_cmd_buf self.filterbox_cond.release() except: todo = self.filterbox_cmd_buf self.current.freeze_child_notify() matches = gtk.ListStore(*([int] + [str] * len(self.columnformat))) matches.clear() filterposition = self.current.get_visible_rect()[1] _model, selected = self.current_selection.get_selected_rows() filterselected = [path for path in selected] rownum = 0 # Store previous rownums in temporary list, in case we are # about to populate the songfilter with a subset of the # current filter. This will allow us to preserve the mapping. prev_rownums = [song for song in self.filter_row_mapping] self.filter_row_mapping = [] if todo == '$$$QUIT###': gobject.idle_add(self.searchfilter_revert_model) return elif len(todo) == 0: for row in self.currentdata: self.filter_row_mapping.append(rownum) rownum = rownum + 1 song_info = [row[0]] for i in range(len(self.columnformat)): song_info.append(misc.unbold(row[i+1])) matches.append(song_info) else: # this make take some seconds... and we'll escape the search text because # we'll be searching for a match in items that are also escaped. todo = misc.escape_html(todo) todo = re.escape(todo) todo = '.*' + todo.replace(' ', ' .*').lower() regexp = re.compile(todo) rownum = 0 if self.prevtodo in todo and len(self.prevtodo) > 0: # If the user's current filter is a subset of the # previous selection (e.g. "h" -> "ha"), search # for files only in the current model, not the # entire self.currentdata subset = True use_data = self.current.get_model() if len(use_data) != len(prev_rownums): # Not exactly sure why this happens sometimes # so lets just revert to prevent a possible, but # infrequent, crash. The only downside is speed. subset = False use_data = self.currentdata else: subset = False use_data = self.currentdata for row in use_data: song_info = [row[0]] for i in range(len(self.columnformat)): song_info.append(misc.unbold(row[i+1])) # Search for matches in all columns: for i in range(len(self.columnformat)): if regexp.match(unicode(song_info[i+1]).lower()): matches.append(song_info) if subset: self.filter_row_mapping.append(prev_rownums[rownum]) else: self.filter_row_mapping.append(rownum) break rownum = rownum + 1 if self.prevtodo == todo or self.prevtodo == "RETAIN_POS_AND_SEL": # mpd update, retain view of treeview: retain_position_and_selection = True if self.plpos: filterposition = self.plpos self.plpos = None else: retain_position_and_selection = False self.filterbox_cond.acquire() self.filterbox_cmd_buf = '$$$DONE###' try: self.filterbox_cond.release() except: pass gobject.idle_add(self.searchfilter_set_matches, matches, filterposition, filterselected, retain_position_and_selection) self.prevtodo = todo def searchfilter_revert_model(self): self.current.set_model(self.currentdata) self.center_song_in_list() self.current.thaw_child_notify() gobject.idle_add(self.center_song_in_list) gobject.idle_add(self.current.grab_focus) def searchfilter_set_matches(self, matches, filterposition, filterselected, retain_position_and_selection): self.filterbox_cond.acquire() flag = self.filterbox_cmd_buf self.filterbox_cond.release() # blit only when widget is still ok (segfault candidate, Gtk bug?) and no other # search is running, avoid pointless work and don't confuse the user if (self.current.get_property('visible') and flag == '$$$DONE###'): self.current.set_model(matches) if retain_position_and_selection and filterposition: self.playlist_retain_view(self.current, filterposition) for path in filterselected: self.current_selection.select_path(path) elif len(matches) > 0: self.current.set_cursor('0') if len(matches) == 0: gobject.idle_add(self.filtering_entry_make_red, self.filterpattern) else: gobject.idle_add(self.filtering_entry_revert_color, self.filterpattern) self.current.thaw_child_notify() def searchfilter_key_pressed(self, widget, event): self.filter_key_pressed(widget, event, self.current) def filter_key_pressed(self, widget, event, treeview): if event.keyval == gtk.gdk.keyval_from_name('Down') or event.keyval == gtk.gdk.keyval_from_name('Up') or event.keyval == gtk.gdk.keyval_from_name('Page_Down') or event.keyval == gtk.gdk.keyval_from_name('Page_Up'): treeview.grab_focus() treeview.emit("key-press-event", event) gobject.idle_add(self.filter_entry_grab_focus, widget) def filter_entry_grab_focus(self, widget): widget.grab_focus() widget.set_position(-1) def filtering_entry_make_red(self, editable): style = editable.get_style().copy() style.text[gtk.STATE_NORMAL] = editable.get_colormap().alloc_color("red") editable.set_style(style) def filtering_entry_revert_color(self, editable): editable.set_style(self.edit_style_orig) def boldrow(self, row): if row > -1: try: for i in range(len(self.currentdata[row]) - 1): self.currentdata[row][i + 1] = misc.bold(self.currentdata[row][i + 1]) except: pass def unbold_boldrow(self, row): if row > -1: try: for i in range(len(self.currentdata[row]) - 1): self.currentdata[row][i + 1] = misc.unbold(self.currentdata[row][i + 1]) except: pass def on_remove(self): treeviewsel = self.current_selection model, selected = treeviewsel.get_selected_rows() if len(selected) == len(self.currentdata) and not self.filterbox_visible: # Everything is selected, clear: mpdh.call(self.client, 'clear') elif len(selected) > 0: # we are manipulating the model manually for speed, so... self.current_update_skip = True selected.reverse() if not self.filterbox_visible: # If we remove an item from the filtered results, this # causes a visual refresh in the interface. self.current.set_model(None) mpdh.call(self.client, 'command_list_ok_begin') for path in selected: if not self.filterbox_visible: rownum = path[0] else: rownum = self.filter_row_mapping[path[0]] i = self.currentdata.get_iter((rownum, 0)) mpdh.call(self.client, 'deleteid', self.current_get_songid(i, self.currentdata)) # Prevents the entire playlist from refreshing: self.current_songs.pop(rownum) self.currentdata.remove(i) mpdh.call(self.client, 'command_list_end') if not self.filterbox_visible: self.current.set_model(model) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/dbus_plugin.py����������������������������������������������������������������0000664�0000000�0000000�00000011424�11255764730�0017332�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This plugin implements D-Bus features for Sonata: * Check that only one instance of Sonata is running at a time * Allow other programs to request the info popup, and to show or to toggle the main window visibility * Listen to Gnome 2.18+ multimedia key events XXX Not a real plugin yet. Example usage: import dbus_plugin as dbus self.dbus_service = dbus.SonataDBus(self.dbus_show, self.dbus_toggle, self.dbus_popup) dbus.start_dbus_interface(toggle_arg, popup_arg) dbus.init_gnome_mediakeys(self.mpd_pp, self.mpd_stop, self.mpd_prev, self.mpd_next) if not dbus.using_gnome_mediakeys(): # do something else instead... """ import sys try: import dbus, dbus.service if getattr(dbus, "version", (0, 0, 0)) >= (0, 41, 0): import dbus.glib if getattr(dbus, "version", (0, 0, 0)) >= (0, 80, 0): import _dbus_bindings as dbus_bindings NEW_DBUS = True else: import dbus.dbus_bindings as dbus_bindings NEW_DBUS = False HAVE_DBUS = True except: HAVE_DBUS = False def using_dbus(): return HAVE_DBUS HAVE_GNOME_MMKEYS = False def using_gnome_mediakeys(): return HAVE_GNOME_MMKEYS def init_gnome_mediakeys(mpd_pp, mpd_stop, mpd_prev, mpd_next): global HAVE_GNOME_MMKEYS if HAVE_DBUS: try: bus = dbus.SessionBus() dbusObj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbusInterface = dbus.Interface(dbusObj, 'org.freedesktop.DBus') if dbusInterface.NameHasOwner('org.gnome.SettingsDaemon'): try: # mmkeys for gnome 2.22+ settingsDaemonObj = bus.get_object('org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys') settingsDaemonInterface = dbus.Interface(settingsDaemonObj, 'org.gnome.SettingsDaemon.MediaKeys') settingsDaemonInterface.GrabMediaPlayerKeys('Sonata', 0) except: # mmkeys for gnome 2.18+ settingsDaemonObj = bus.get_object('org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon') settingsDaemonInterface = dbus.Interface(settingsDaemonObj, 'org.gnome.SettingsDaemon') settingsDaemonInterface.GrabMediaPlayerKeys('Sonata', 0) settingsDaemonInterface.connect_to_signal('MediaPlayerKeyPressed', lambda app, key:mediaPlayerKeysCallback(mpd_pp, mpd_stop, mpd_prev, mpd_next, app, key)) HAVE_GNOME_MMKEYS = True except: pass def mediaPlayerKeysCallback(mpd_pp, mpd_stop, mpd_prev, mpd_next, app, key): if app == 'Sonata': if key in ('Play', 'PlayPause', 'Pause'): mpd_pp(None) elif key == 'Stop': mpd_stop(None) elif key == 'Previous': mpd_prev(None) elif key == 'Next': mpd_next(None) def get_session_bus(): try: return dbus.SessionBus() except Exception: print _("Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)") raise def execute_remote_commands(toggle=False, popup=False, start=False): try: bus = get_session_bus() obj = bus.get_object('org.MPD', '/org/MPD/Sonata') if toggle: obj.toggle(dbus_interface='org.MPD.SonataInterface') if popup: obj.popup(dbus_interface='org.MPD.SonataInterface') sys.exit() except Exception: print _("Failed to execute remote commands.") if start is None or start: print _("Starting Sonata instead...") else: print _("Maybe Sonata is not running?") sys.exit(1) def start_dbus_interface(): if HAVE_DBUS: try: bus = get_session_bus() if NEW_DBUS: retval = bus.request_name("org.MPD.Sonata", dbus_bindings.NAME_FLAG_DO_NOT_QUEUE) else: retval = dbus_bindings.bus_request_name(bus.get_connection(), "org.MPD.Sonata", dbus_bindings.NAME_FLAG_DO_NOT_QUEUE) if retval in (dbus_bindings.REQUEST_NAME_REPLY_PRIMARY_OWNER, dbus_bindings.REQUEST_NAME_REPLY_ALREADY_OWNER): pass elif retval in (dbus_bindings.REQUEST_NAME_REPLY_EXISTS, dbus_bindings.REQUEST_NAME_REPLY_IN_QUEUE): print _("An instance of Sonata is already running. Showing it...") try: obj = bus.get_object('org.MPD', '/org/MPD/Sonata') obj.show(dbus_interface='org.MPD.SonataInterface') sys.exit() except Exception: print _("Failed to execute remote command.") sys.exit(1) except Exception: pass except SystemExit: raise if HAVE_DBUS: class SonataDBus(dbus.service.Object): def __init__(self, dbus_show, dbus_toggle, dbus_popup): self.dbus_show = dbus_show self.dbus_toggle = dbus_toggle self.dbus_popup = dbus_popup session_bus = get_session_bus() bus_name = dbus.service.BusName('org.MPD', bus=session_bus) object_path = '/org/MPD/Sonata' dbus.service.Object.__init__(self, bus_name, object_path) @dbus.service.method('org.MPD.SonataInterface') def show(self): self.dbus_show() @dbus.service.method('org.MPD.SonataInterface') def toggle(self): self.dbus_toggle() @dbus.service.method('org.MPD.SonataInterface') def popup(self): self.dbus_popup() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/img.py������������������������������������������������������������������������0000664�0000000�0000000�00000004245�11255764730�0015576�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import os import gtk, gobject def valid_image(filename): return bool(gtk.gdk.pixbuf_get_file_info(filename)) def get_pixbuf_of_size(pixbuf, size): # Creates a pixbuf that fits in the specified square of sizexsize # while preserving the aspect ratio # Returns tuple: (scaled_pixbuf, actual_width, actual_height) image_width = pixbuf.get_width() image_height = pixbuf.get_height() if image_width > image_height: if image_width > size: image_height = int(size/float(image_width)*image_height) image_width = size else: if image_height > size: image_width = int(size/float(image_height)*image_width) image_height = size crop_pixbuf = pixbuf.scale_simple(image_width, image_height, gtk.gdk.INTERP_HYPER) return (crop_pixbuf, image_width, image_height) def pixbuf_add_border(pix): # Add a gray outline to pix. This will increase the pixbuf size by # 2 pixels lengthwise and heightwise, 1 on each side. Returns pixbuf. width = pix.get_width() height = pix.get_height() newpix = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, width+2, height+2) newpix.fill(0x858585ff) pix.copy_area(0, 0, width, height, newpix, 1, 1) return newpix def pixbuf_pad(pix, w, h): # Adds transparent canvas so that the pixbuf is of size (w,h). Also # centers the pixbuf in the canvas. width = pix.get_width() height = pix.get_height() transpbox = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, w, h) transpbox.fill(0) x_pos = int((w - width)/2) y_pos = int((h - height)/2) pix.copy_area(0, 0, width, height, transpbox, x_pos, y_pos) return transpbox def extension_is_valid(extension): for imgformat in gtk.gdk.pixbuf_get_formats(): if extension.lower() in imgformat['extensions']: return True return False def is_imgfile(filename): ext = os.path.splitext(filename)[1][1:] return extension_is_valid(ext) def single_image_in_dir(dirname): # Returns None or a filename if there is exactly one image # in the dir. try: dirname = gobject.filename_from_utf8(dirname) except: pass try: files = os.listdir(dirname) except OSError: return None imgfiles = [f for f in files if is_imgfile(f)] if len(imgfiles) != 1: return None return os.path.join(dirname, imgfiles[0]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/info.py�����������������������������������������������������������������������0000664�0000000�0000000�00000046243�11255764730�0015761�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import sys, os, locale, urllib import threading # get_lyrics_start starts a thread get_lyrics_thread import gtk, gobject import ui, misc import mpdhelper as mpdh from consts import consts import re class Info(object): def __init__(self, config, info_image, linkcolor, on_link_click_cb, library_return_search_items, get_playing_song, TAB_INFO, on_image_activate, on_image_motion_cb, on_image_drop_cb, album_return_artist_and_tracks, new_tab): self.config = config self.info_image = info_image self.linkcolor = linkcolor self.on_link_click_cb = on_link_click_cb self.library_return_search_items = library_return_search_items self.get_playing_song = get_playing_song self.on_image_activate = on_image_activate self.on_image_motion_cb = on_image_motion_cb self.on_image_drop_cb = on_image_drop_cb self.album_return_artist_and_tracks = album_return_artist_and_tracks try: self.enc = locale.getpreferredencoding() except: print "Locale cannot be found; please set your system's locale. Aborting..." sys.exit(1) self.last_info_bitrate = None self.info_boxes_in_more = None self.info_editlabel = None self.info_editlyricslabel = None self.info_labels = None self.info_left_label = None self.info_lyrics = None self.info_morelabel = None self.info_searchlabel = None self.info_tagbox = None self.info_type = None self.lyricsText = None self.albumText = None # Info tab self.info_area = ui.scrollwindow(shadow=gtk.SHADOW_NONE) if self.config.info_art_enlarged: self.info_imagebox = ui.eventbox() else: self.info_imagebox = ui.eventbox(w=152) self.info_imagebox.add(self.info_image) self.tab = new_tab(self.info_area, gtk.STOCK_JUSTIFY_FILL, TAB_INFO, self.info_area) self.info_imagebox.drag_dest_set(gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP, [("text/uri-list", 0, 80), ("text/plain", 0, 80)], gtk.gdk.ACTION_DEFAULT) self.info_imagebox.connect('button_press_event', self.on_image_activate) self.info_imagebox.connect('drag_motion', self.on_image_motion_cb) self.info_imagebox.connect('drag_data_received', self.on_image_drop_cb) self.widgets_initialize(self.info_area) def widgets_initialize(self, info_scrollwindow): vert_spacing = 1 horiz_spacing = 2 margin = 5 outter_hbox = gtk.HBox() outter_vbox = gtk.VBox() # Song info info_song = ui.expander(markup="<b>" + _("Song Info") + "</b>", expand=self.config.info_song_expanded, can_focus=False) info_song.connect("activate", self.info_expanded, "song") inner_hbox = gtk.HBox() inner_hbox.pack_start(self.info_imagebox, False, False, horiz_spacing) self.info_tagbox = gtk.VBox() labels_left = [] self.info_type = {} self.info_labels = [] self.info_boxes_in_more = [] labels = [(_("Title"), 'title', False, "", False), (_("Artist"), 'artist', True, _("Launch artist in Wikipedia"), False), (_("Album"), 'album', True, _("Launch album in Wikipedia"), False), (_("Date"), 'date', False, "", False), (_("Track"), 'track', False, "", False), (_("Genre"), 'genre', False, "", False), (_("File"), 'file', False, "", True), (_("Bitrate"), 'bitrate', False, "", True)] for i,(text, name, link, tooltip, in_more) in enumerate(labels): self.info_type[name] = i tmphbox = gtk.HBox() if in_more: self.info_boxes_in_more += [tmphbox] tmplabel = ui.label(markup="<b>%s:</b>" % text, y=0) if i == 0: self.info_left_label = tmplabel # Using set_selectable overrides the hover cursor that # sonata tries to set for the links, and I can't figure # out how to stop that. So we'll disable set_selectable # for those labels until it's figured out. tmplabel2 = ui.label(wrap=True, y=0, select=not link) if link: tmpevbox = ui.eventbox(add=tmplabel2) self.info_apply_link_signals(tmpevbox, name, tooltip) tmphbox.pack_start(tmplabel, False, False, horiz_spacing) to_pack = tmpevbox if link else tmplabel2 tmphbox.pack_start(to_pack, False, False, horiz_spacing) self.info_labels += [tmplabel2] labels_left += [tmplabel] self.info_tagbox.pack_start(tmphbox, False, False, vert_spacing) ui.set_widths_equal(labels_left) mischbox = gtk.HBox() self.info_morelabel = ui.label(y=0) moreevbox = ui.eventbox(add=self.info_morelabel) self.info_apply_link_signals(moreevbox, 'more', _("Toggle extra tags")) self.info_editlabel = ui.label(y=0) editevbox = ui.eventbox(add=self.info_editlabel) self.info_apply_link_signals(editevbox, 'edit', _("Edit song tags")) mischbox.pack_start(moreevbox, False, False, horiz_spacing) mischbox.pack_start(editevbox, False, False, horiz_spacing) self.info_tagbox.pack_start(mischbox, False, False, vert_spacing) inner_hbox.pack_start(self.info_tagbox, False, False, horiz_spacing) info_song.add(inner_hbox) outter_vbox.pack_start(info_song, False, False, margin) # Lyrics self.info_lyrics = ui.expander(markup="<b>" + _("Lyrics") + "</b>", expand=self.config.info_lyrics_expanded, can_focus=False) self.info_lyrics.connect("activate", self.info_expanded, "lyrics") lyricsbox = gtk.VBox() lyricsbox_top = gtk.HBox() self.lyricsText = ui.label(markup=" ", y=0, select=True, wrap=True) lyricsbox_top.pack_start(self.lyricsText, True, True, horiz_spacing) lyricsbox.pack_start(lyricsbox_top, True, True, vert_spacing) lyricsbox_bottom = gtk.HBox() self.info_searchlabel = ui.label(y=0) self.info_editlyricslabel = ui.label(y=0) searchevbox = ui.eventbox(add=self.info_searchlabel) editlyricsevbox = ui.eventbox(add=self.info_editlyricslabel) self.info_apply_link_signals(searchevbox, 'search', _("Search Lyricwiki.org for lyrics")) self.info_apply_link_signals(editlyricsevbox, 'editlyrics', _("Edit lyrics at Lyricwiki.org")) lyricsbox_bottom.pack_start(searchevbox, False, False, horiz_spacing) lyricsbox_bottom.pack_start(editlyricsevbox, False, False, horiz_spacing) lyricsbox.pack_start(lyricsbox_bottom, False, False, vert_spacing) self.info_lyrics.add(lyricsbox) outter_vbox.pack_start(self.info_lyrics, False, False, margin) # Album info info_album = ui.expander(markup="<b>" + _("Album Info") + "</b>", expand=self.config.info_album_expanded, can_focus=False) info_album.connect("activate", self.info_expanded, "album") albumbox = gtk.VBox() albumbox_top = gtk.HBox() self.albumText = ui.label(markup=" ", y=0, select=True, wrap=True) albumbox_top.pack_start(self.albumText, False, False, horiz_spacing) albumbox.pack_start(albumbox_top, False, False, vert_spacing) info_album.add(albumbox) outter_vbox.pack_start(info_album, False, False, margin) # Finish.. if not self.config.show_lyrics: ui.hide(self.info_lyrics) if not self.config.show_covers: ui.hide(self.info_imagebox) # self.config.info_song_more will be overridden on on_link_click, so # store it in a temporary var.. temp = self.config.info_song_more self.on_link_click(moreevbox, None, 'more') self.config.info_song_more = temp if self.config.info_song_more: self.on_link_click(moreevbox, None, 'more') outter_hbox.pack_start(outter_vbox, False, False, margin) info_scrollwindow.add_with_viewport(outter_hbox) def get_widgets(self): return self.info_area def get_info_imagebox(self): return self.info_imagebox def show_lyrics_updated(self): if self.config.show_lyrics: ui.show(self.info_lyrics) else: ui.hide(self.info_lyrics) def info_apply_link_signals(self, widget, linktype, tooltip): widget.connect("enter-notify-event", self.on_link_enter) widget.connect("leave-notify-event", self.on_link_leave) widget.connect("button-press-event", self.on_link_click, linktype) widget.set_tooltip_text(tooltip) def on_link_enter(self, widget, _event): if widget.get_children()[0].get_use_markup(): ui.change_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) def on_link_leave(self, _widget, _event): ui.change_cursor(None) def on_link_click(self, _widget, _event, linktype): if linktype == 'more': previous_is_more = (self.info_morelabel.get_text() == "(" + _("more") + ")") if previous_is_more: self.info_morelabel.set_markup(misc.link_markup(_("hide"), True, True, self.linkcolor)) self.config.info_song_more = True else: self.info_morelabel.set_markup(misc.link_markup(_("more"), True, True, self.linkcolor)) self.config.info_song_more = False if self.config.info_song_more: for hbox in self.info_boxes_in_more: ui.show(hbox) else: for hbox in self.info_boxes_in_more: ui.hide(hbox) else: self.on_link_click_cb(linktype) def info_expanded(self, expander, infotype): expanded = not expander.get_expanded() if infotype == "song": self.config.info_song_expanded = expanded elif infotype == "lyrics": self.config.info_lyrics_expanded = expanded elif infotype == "album": self.config.info_album_expanded = expanded def info_update(self, playing_or_paused, newbitrate, songinfo, update_all, blank_window=False, skip_lyrics=False): # update_all = True means that every tag should update. This is # only the case on song and status changes. Otherwise we only # want to update the minimum number of widgets so the user can # do things like select label text. if playing_or_paused: bitratelabel = self.info_labels[self.info_type['bitrate']] titlelabel = self.info_labels[self.info_type['title']] artistlabel = self.info_labels[self.info_type['artist']] albumlabel = self.info_labels[self.info_type['album']] datelabel = self.info_labels[self.info_type['date']] genrelabel = self.info_labels[self.info_type['genre']] tracklabel = self.info_labels[self.info_type['track']] filelabel = self.info_labels[self.info_type['file']] if not self.last_info_bitrate or self.last_info_bitrate != newbitrate: bitratelabel.set_text(newbitrate) self.last_info_bitrate = newbitrate if update_all: # Use artist/album Wikipedia links? artist_use_link = False if 'artist' in songinfo: artist_use_link = True album_use_link = False if 'album' in songinfo: album_use_link = True titlelabel.set_text(mpdh.get(songinfo, 'title')) if artist_use_link: artistlabel.set_markup(misc.link_markup(misc.escape_html(mpdh.get(songinfo, 'artist')), False, False, self.linkcolor)) else: artistlabel.set_text(mpdh.get(songinfo, 'artist')) if album_use_link: albumlabel.set_markup(misc.link_markup(misc.escape_html(mpdh.get(songinfo, 'album')), False, False, self.linkcolor)) else: albumlabel.set_text(mpdh.get(songinfo, 'album')) datelabel.set_text(mpdh.get(songinfo, 'date')) genrelabel.set_text(mpdh.get(songinfo, 'genre')) if 'track' in songinfo: tracklabel.set_text(mpdh.getnum(songinfo, 'track', '0', False, 0)) else: tracklabel.set_text("") path = misc.file_from_utf8(self.config.musicdir[self.config.profile_num] + os.path.dirname(mpdh.get(songinfo, 'file'))) if os.path.exists(path): filelabel.set_text(self.config.musicdir[self.config.profile_num] + mpdh.get(songinfo, 'file')) self.info_editlabel.set_markup(misc.link_markup(_("edit tags"), True, True, self.linkcolor)) else: filelabel.set_text(mpdh.get(songinfo, 'file')) self.info_editlabel.set_text("") if 'album' in songinfo: # Update album info: artist, tracks = self.album_return_artist_and_tracks() trackinfo = "" album = mpdh.get(songinfo, 'album') year = mpdh.get(songinfo, 'date', None) if album is not None: albuminfo = album + "\n" playtime = 0 if len(tracks) > 0: tracks.sort(key=lambda x: int(mpdh.getnum(x, 'track', '0', True, 0))) for track in tracks: playtime += int(mpdh.get(track, 'time', 0)) if 'title' in track: trackinfo = trackinfo + mpdh.getnum(track, 'track', '0', False, 2) + '. ' + mpdh.get(track, 'title') + '\n' else: trackinfo = trackinfo + mpdh.getnum(track, 'track', '0', False, 2) + '. ' + mpdh.get(track, 'file').split('/')[-1] + '\n' if artist is not None: albuminfo += artist + "\n" if year is not None: albuminfo += year + "\n" albuminfo += misc.convert_time(playtime) + "\n" albuminfo += "\n" + trackinfo else: albuminfo = _("Album info not found.") self.albumText.set_markup(misc.escape_html(albuminfo)) else: self.albumText.set_text(_("Album name not set.")) # Update lyrics: if self.config.show_lyrics and not skip_lyrics: if 'artist' in songinfo and 'title' in songinfo: self.get_lyrics_start(mpdh.get(songinfo, 'artist'), mpdh.get(songinfo, 'title'), mpdh.get(songinfo, 'artist'), mpdh.get(songinfo, 'title'), os.path.dirname(mpdh.get(songinfo, 'file'))) else: self.info_searchlabel.set_text("") self.info_show_lyrics(_("Artist or song title not set."), "", "", True) else: blank_window = True if blank_window: for label in self.info_labels: label.set_text("") self.info_editlabel.set_text("") if self.config.show_lyrics: self.info_searchlabel.set_text("") self.info_editlyricslabel.set_text("") self.info_show_lyrics("", "", "", True) self.albumText.set_text("") self.last_info_bitrate = "" def info_check_for_local_lyrics(self, artist, title, song_dir): locations = [consts.LYRICS_LOCATION_HOME, consts.LYRICS_LOCATION_PATH, consts.LYRICS_LOCATION_HOME_ALT, consts.LYRICS_LOCATION_PATH_ALT] for location in locations: filename = self.target_lyrics_filename(artist, title, song_dir, location) if os.path.exists(filename): return filename def get_lyrics_start(self, *args): lyricThread = threading.Thread(target=self.get_lyrics_thread, args=args) lyricThread.setDaemon(True) lyricThread.start() def lyricwiki_format(self, text): return urllib.quote(str(unicode(text).title())) def lyricwiki_editlink(self, songinfo): artist, title = [self.lyricwiki_format(mpdh.get(songinfo, key)) for key in ('artist', 'title')] return "http://lyricwiki.org/index.php?title=%s:%s&action=edit" % (artist, title) def get_lyrics_thread(self, search_artist, search_title, filename_artist, filename_title, song_dir): filename_artist = misc.strip_all_slashes(filename_artist) filename_title = misc.strip_all_slashes(filename_title) filename = self.info_check_for_local_lyrics(filename_artist, filename_title, song_dir) search_str = misc.link_markup(_("search"), True, True, self.linkcolor) edit_str = misc.link_markup(_("edit"), True, True, self.linkcolor) if filename: # If the lyrics only contain "not found", delete the file and try to # fetch new lyrics. If there is a bug in Sonata/SZI/LyricWiki that # prevents lyrics from being found, storing the "not found" will # prevent a future release from correctly fetching the lyrics. f = open(filename, 'r') lyrics = f.read() f.close() if lyrics == _("Lyrics not found"): misc.remove_file(filename) filename = self.info_check_for_local_lyrics(filename_artist, filename_title, song_dir) if filename: # Re-use lyrics from file: f = open(filename, 'r') lyrics = f.read() f.close() # Strip artist - title line from file if it exists, since we # now have that information visible elsewhere. header = filename_artist + " - " + filename_title + "\n\n" if lyrics[:len(header)] == header: lyrics = lyrics[len(header):] gobject.idle_add(self.info_show_lyrics, lyrics, filename_artist, filename_title) gobject.idle_add(self.info_searchlabel.set_markup, search_str) gobject.idle_add(self.info_editlyricslabel.set_markup, edit_str) else: # Use default filename: filename = self.target_lyrics_filename(filename_artist, filename_title, song_dir) # Fetch lyrics from lyricwiki.org gobject.idle_add(self.info_show_lyrics, _("Fetching lyrics..."), filename_artist, filename_title) try: lyricpage = urllib.urlopen("http://lyricwiki.org/index.php?title=%s:%s&action=edit" % (self.lyricwiki_format(search_artist), self.lyricwiki_format(search_title))).read() content = re.split("<textarea[^>]*>", lyricpage)[1].split("</textarea>")[0] if content.startswith("#REDIRECT [["): addr = "http://lyricwiki.org/index.php?title=%s&action=edit" % urllib.quote(content.split("[[")[1].split("]]")[0]) content = urllib.urlopen(addr).read() lyrics = content.split("<lyrics>")[1].split("</lyrics>")[0] if lyrics.strip() != "<!-- PUT LYRICS HERE (and delete this entire line) -->": lyrics = misc.unescape_html(lyrics) lyrics = misc.wiki_to_html(lyrics) lyrics = lyrics.decode("utf-8") # Save lyrics to file: misc.create_dir('~/.lyrics/') f = open(filename, 'w') f.write(lyrics) f.close() else: lyrics = _("Lyrics not found") gobject.idle_add(self.info_show_lyrics, lyrics, filename_artist, filename_title) except: lyrics = _("Fetching lyrics failed") gobject.idle_add(self.info_show_lyrics, lyrics, filename_artist, filename_title) gobject.idle_add(self.info_searchlabel.set_markup, search_str) gobject.idle_add(self.info_editlyricslabel.set_markup, edit_str) def info_show_lyrics(self, lyrics, artist, title, force=False): if force: # For error messages where there is no appropriate artist or # title, we pass force=True: self.lyricsText.set_text(lyrics) elif self.get_playing_song(): # Verify that we are displaying the correct lyrics: songinfo = self.get_playing_song() try: if misc.strip_all_slashes(mpdh.get(songinfo, 'artist')) == artist and misc.strip_all_slashes(mpdh.get(songinfo, 'title')) == title: try: self.lyricsText.set_markup(misc.escape_html(lyrics)) except: self.lyricsText.set_text(lyrics) except: pass def resize_elements(self, notebook_allocation): # Resize labels in info tab to prevent horiz scrollbar: if self.config.show_covers: labelwidth = notebook_allocation.width - self.info_left_label.allocation.width - self.info_imagebox.allocation.width - 60 # 60 accounts for vert scrollbar, box paddings, etc.. else: labelwidth = notebook_allocation.width - self.info_left_label.allocation.width - 60 # 60 accounts for vert scrollbar, box paddings, etc.. if labelwidth > 100: for label in self.info_labels: label.set_size_request(labelwidth, -1) # Resize lyrics/album gtk labels: labelwidth = notebook_allocation.width - 45 # 45 accounts for vert scrollbar, box paddings, etc.. self.lyricsText.set_size_request(labelwidth, -1) self.albumText.set_size_request(labelwidth, -1) def target_lyrics_filename(self, artist, title, song_dir, force_location=None): # FIXME Why did we have this condition here: if self.conn: lyrics_loc = force_location if force_location else self.config.lyrics_location # Note: *_ALT searching is for compatibility with other mpd clients (like ncmpcpp): if lyrics_loc == consts.LYRICS_LOCATION_HOME: targetfile = os.path.expanduser("~/.lyrics/" + artist + "-" + title + ".txt") elif lyrics_loc == consts.LYRICS_LOCATION_PATH: targetfile = self.config.musicdir[self.config.profile_num] + song_dir + "/" + artist + "-" + title + ".txt" elif lyrics_loc == consts.LYRICS_LOCATION_HOME_ALT: targetfile = os.path.expanduser("~/.lyrics/" + artist + " - " + title + ".txt") elif lyrics_loc == consts.LYRICS_LOCATION_PATH_ALT: targetfile = self.config.musicdir[self.config.profile_num] + song_dir + "/" + artist + " - " + title + ".txt" targetfile = misc.file_exists_insensitive(targetfile) return misc.file_from_utf8(targetfile) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/library.py��������������������������������������������������������������������0000664�0000000�0000000�00000137244�11255764730�0016474�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import os import re, gettext, locale import threading # libsearchfilter_toggle starts thread libsearchfilter_loop import operator import gtk, gobject, pango import ui, misc import mpdhelper as mpdh from consts import consts import breadcrumbs def library_set_data(album=None, artist=None, genre=None, year=None, path=None): return (album, artist, genre, year, path) def library_get_data(data, *args): name_to_index = {'album':0, 'artist':1, 'genre':2, 'year':3, 'path':4} # Data retrieved from the gtktreeview model is not in # unicode anymore, so convert it. retlist = [unicode(data[name_to_index[arg]]) if data[name_to_index[arg]] else None for arg in args] if len(retlist) == 1: return retlist[0] else: return retlist class Library(object): def __init__(self, config, client, artwork, TAB_LIBRARY, album_filename, settings_save, filtering_entry_make_red, filtering_entry_revert_color, filter_key_pressed, on_add_item, parse_formatting, connected, on_library_button_press, on_library_search_text_click, new_tab): self.artwork = artwork self.config = config self.client = client self.librarymenu = None # cyclic dependency, set later self.album_filename = album_filename self.settings_save = settings_save self.filtering_entry_make_red = filtering_entry_make_red self.filtering_entry_revert_color = filtering_entry_revert_color self.filter_key_pressed = filter_key_pressed self.on_add_item = on_add_item self.parse_formatting = parse_formatting self.connected = connected self.on_library_button_press = on_library_button_press self.on_library_search_text_click = on_library_search_text_click self.NOTAG = _("Untagged") self.VAstr = _("Various Artists") self.search_terms = [_('Artist'), _('Title'), _('Album'), _('Genre'), _('Filename'), _('Everything')] self.search_terms_mpd = ['artist', 'title', 'album', 'genre', 'file', 'any'] self.libfilterbox_cmd_buf = None self.libfilterbox_cond = None self.libfilterbox_source = None self.prevlibtodo_base = None self.prevlibtodo_base_results = None self.prevlibtodo = None self.save_timeout = None self.libsearch_last_tooltip = None self.lib_view_filesystem_cache = None self.lib_view_artist_cache = None self.lib_view_genre_cache = None self.lib_view_album_cache = None self.lib_list_genres = None self.lib_list_artists = None self.lib_list_albums = None self.lib_list_years = None self.view_caches_reset() self.libraryvbox = gtk.VBox() self.library = ui.treeview() self.library_selection = self.library.get_selection() self.breadcrumbs = breadcrumbs.CrumbBox() self.breadcrumbs.props.spacing = 2 expanderwindow2 = ui.scrollwindow(add=self.library) self.searchbox = gtk.HBox() self.searchcombo = ui.combo(items=self.search_terms) self.searchcombo.set_tooltip_text(_("Search terms")) self.searchtext = ui.entry() self.searchtext.set_tooltip_text(_("Search library")) self.searchbutton = ui.button(img=ui.image(stock=gtk.STOCK_CANCEL), h=self.searchcombo.size_request()[1]) self.searchbutton.set_no_show_all(True) self.searchbutton.hide() self.searchbutton.set_tooltip_text(_("End Search")) self.libraryview = ui.button(relief=gtk.RELIEF_NONE) self.libraryview.set_tooltip_text(_("Library browsing view")) # disabled as breadcrumbs replace this: self.searchbox.pack_start(self.libraryview, False, False, 1) self.searchbox.pack_start(gtk.VSeparator(), False, False, 2) self.searchbox.pack_start(ui.label(_("Search") + ":"), False, False, 3) self.searchbox.pack_start(self.searchtext, True, True, 2) self.searchbox.pack_start(self.searchcombo, False, False, 2) self.searchbox.pack_start(self.searchbutton, False, False, 2) #self.libraryvbox.pack_start(self.breadcrumbs, False, False, 2) self.libraryvbox.pack_start(expanderwindow2, True, True) self.libraryvbox.pack_start(self.searchbox, False, False, 2) self.tab = new_tab(self.libraryvbox, gtk.STOCK_HARDDISK, TAB_LIBRARY, self.library) # Assign some pixbufs for use in self.library self.openpb2 = self.library.render_icon(gtk.STOCK_OPEN, gtk.ICON_SIZE_LARGE_TOOLBAR) self.harddiskpb2 = self.library.render_icon(gtk.STOCK_HARDDISK, gtk.ICON_SIZE_LARGE_TOOLBAR) self.openpb = self.library.render_icon(gtk.STOCK_OPEN, gtk.ICON_SIZE_MENU) self.harddiskpb = self.library.render_icon(gtk.STOCK_HARDDISK, gtk.ICON_SIZE_MENU) self.albumpb = gtk.gdk.pixbuf_new_from_file_at_size(album_filename, consts.LIB_COVER_SIZE, consts.LIB_COVER_SIZE) self.genrepb = self.library.render_icon('gtk-orientation-portrait', gtk.ICON_SIZE_LARGE_TOOLBAR) self.artistpb = self.library.render_icon('artist', gtk.ICON_SIZE_LARGE_TOOLBAR) self.sonatapb = self.library.render_icon('sonata', gtk.ICON_SIZE_MENU) # list of the library views: (id, name, icon name, label) self.VIEWS = [ (consts.VIEW_FILESYSTEM, 'filesystem', gtk.STOCK_HARDDISK, _("Filesystem")), (consts.VIEW_ALBUM, 'album', 'album', _("Albums")), (consts.VIEW_ARTIST, 'artist', 'artist', _("Artists")), (consts.VIEW_GENRE, 'genre', gtk.STOCK_ORIENTATION_PORTRAIT, _("Genres")), ] self.library_view_assign_image() self.library.connect('row_activated', self.on_library_row_activated) self.library.connect('button_press_event', self.on_library_button_press) self.library.connect('key-press-event', self.on_library_key_press) self.library.connect('query-tooltip', self.on_library_query_tooltip) expanderwindow2.connect('scroll-event', self.on_library_scrolled) self.libraryview.connect('clicked', self.library_view_popup) self.searchtext.connect('button_press_event', self.on_library_search_text_click) self.searchtext.connect('key-press-event', self.libsearchfilter_key_pressed) self.searchtext.connect('activate', self.libsearchfilter_on_enter) self.searchbutton.connect('clicked', self.on_search_end) self.libfilter_changed_handler = self.searchtext.connect('changed', self.libsearchfilter_feed_loop) searchcombo_changed_handler = self.searchcombo.connect('changed', self.on_library_search_combo_change) # Initialize library data and widget self.libraryposition = {} self.libraryselectedpath = {} self.searchcombo.handler_block(searchcombo_changed_handler) self.searchcombo.set_active(self.config.last_search_num) self.searchcombo.handler_unblock(searchcombo_changed_handler) self.librarydata = gtk.ListStore(gtk.gdk.Pixbuf, gobject.TYPE_PYOBJECT, str) self.library.set_model(self.librarydata) self.library.set_search_column(2) self.librarycell = gtk.CellRendererText() self.librarycell.set_property("ellipsize", pango.ELLIPSIZE_END) self.libraryimg = gtk.CellRendererPixbuf() self.librarycolumn = gtk.TreeViewColumn() self.librarycolumn.pack_start(self.libraryimg, False) self.librarycolumn.pack_start(self.librarycell, True) self.librarycolumn.set_attributes(self.libraryimg, pixbuf=0) self.librarycolumn.set_attributes(self.librarycell, markup=2) self.librarycolumn.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) self.library.append_column(self.librarycolumn) self.library_selection.set_mode(gtk.SELECTION_MULTIPLE) def get_libraryactions(self): return [(name+'view', icon, label, None, None, self.on_libraryview_chosen) for _view, name, icon, label in self.VIEWS] def get_model(self): return self.librarydata def get_widgets(self): return self.libraryvbox def get_treeview(self): return self.library def get_selection(self): return self.library_selection def set_librarymenu(self, librarymenu): self.librarymenu = librarymenu self.librarymenu.attach_to_widget(self.libraryview, None) def library_view_popup(self, button): self.librarymenu.popup(None, None, self.library_view_position_menu, 1, 0, button) def library_view_position_menu(self, _menu, button): x, y, _width, height = button.get_allocation() return (self.config.x + x, self.config.y + y + height, True) def on_libraryview_chosen(self, action): if self.search_visible(): self.on_search_end(None) if action.get_name() == 'filesystemview': self.config.lib_view = consts.VIEW_FILESYSTEM elif action.get_name() == 'artistview': self.config.lib_view = consts.VIEW_ARTIST elif action.get_name() == 'genreview': self.config.lib_view = consts.VIEW_GENRE elif action.get_name() == 'albumview': self.config.lib_view = consts.VIEW_ALBUM self.library.grab_focus() self.library_view_assign_image() self.libraryposition = {} self.libraryselectedpath = {} self.library_browse(self.library_set_data(path="/")) try: if len(self.librarydata) > 0: self.library_selection.unselect_range((0,), (len(self.librarydata)-1,)) except: pass gobject.idle_add(self.library.scroll_to_point, 0, 0) def library_view_assign_image(self): _view, _name, icon, label = [v for v in self.VIEWS if v[0] == self.config.lib_view][0] self.libraryview.set_image(ui.image(stock=icon)) self.libraryview.set_label(" " + label) def view_caches_reset(self): # We should call this on first load and whenever mpd is # updated. self.lib_view_filesystem_cache = None self.lib_view_artist_cache = None self.lib_view_genre_cache = None self.lib_view_album_cache = None self.lib_list_genres = None self.lib_list_artists = None self.lib_list_albums = None self.lib_list_years = None def on_library_scrolled(self, _widget, _event): try: # Use gobject.idle_add so that we can get the visible state of the treeview gobject.idle_add(self._on_library_scrolled) except: pass def _on_library_scrolled(self): if not self.config.show_covers: return # This avoids a warning about a NULL node in get_visible_range if not self.library.props.visible: return vis_range = self.library.get_visible_range() if vis_range is None: return try: start_row = int(vis_range[0][0]) end_row = int(vis_range[1][0]) except IndexError: # get_visible_range failed return self.artwork.library_artwork_update(self.librarydata, start_row, end_row, self.albumpb) def library_browse(self, _widget=None, root=None): # Populates the library list with entries if not self.connected(): return if root is None or (self.config.lib_view == consts.VIEW_FILESYSTEM and self.library_get_data(root, 'path') is None): root = self.library_set_data(path="/") if self.config.wd is None or (self.config.lib_view == consts.VIEW_FILESYSTEM and self.library_get_data(self.config.wd, 'path') is None): self.config.wd = self.library_set_data(path="/") prev_selection = [] prev_selection_root = False prev_selection_parent = False if root == self.config.wd: # This will happen when the database is updated. So, lets save # the current selection in order to try to re-select it after # the update is over. model, selected = self.library_selection.get_selected_rows() for path in selected: if model.get_value(model.get_iter(path), 2) == "/": prev_selection_root = True elif model.get_value(model.get_iter(path), 2) == "..": prev_selection_parent = True else: prev_selection.append(model.get_value(model.get_iter(path), 1)) self.libraryposition[self.config.wd] = self.library.get_visible_rect()[1] path_updated = True else: path_updated = False new_level = self.library_get_data_level(root) curr_level = self.library_get_data_level(self.config.wd) # The logic below is more consistent with, e.g., thunar. if new_level > curr_level: # Save position and row for where we just were if we've # navigated into a sub-directory: self.libraryposition[self.config.wd] = self.library.get_visible_rect()[1] model, rows = self.library_selection.get_selected_rows() if len(rows) > 0: data = self.librarydata.get_value(self.librarydata.get_iter(rows[0]), 2) if not data in ("..", "/"): self.libraryselectedpath[self.config.wd] = rows[0] elif (self.config.lib_view == consts.VIEW_FILESYSTEM and root != self.config.wd) \ or (self.config.lib_view != consts.VIEW_FILESYSTEM and new_level != curr_level): # If we've navigated to a parent directory, don't save # anything so that the user will enter that subdirectory # again at the top position with nothing selected self.libraryposition[self.config.wd] = 0 self.libraryselectedpath[self.config.wd] = None # In case sonata is killed or crashes, we'll save the library state # in 5 seconds (first removing any current settings_save timeouts) if self.config.wd != root: try: gobject.source_remove(self.save_timeout) except: pass self.save_timeout = gobject.timeout_add(5000, self.settings_save) self.config.wd = root self.library.freeze_child_notify() self.librarydata.clear() # Populate treeview with data: bd = [] while len(bd) == 0: if self.config.lib_view == consts.VIEW_FILESYSTEM: bd = self.library_populate_filesystem_data(self.library_get_data(self.config.wd, 'path')) elif self.config.lib_view == consts.VIEW_ALBUM: album, artist, year = self.library_get_data(self.config.wd, 'album', 'artist', 'year') if album is not None: bd = self.library_populate_data(artist=artist, album=album, year=year) else: bd = self.library_populate_toplevel_data(albumview=True) elif self.config.lib_view == consts.VIEW_ARTIST: artist, album, year = self.library_get_data(self.config.wd, 'artist', 'album', 'year') if artist is not None and album is not None: bd = self.library_populate_data(artist=artist, album=album, year=year) elif artist is not None: bd = self.library_populate_data(artist=artist) else: bd = self.library_populate_toplevel_data(artistview=True) elif self.config.lib_view == consts.VIEW_GENRE: genre, artist, album, year = self.library_get_data(self.config.wd, 'genre', 'artist', 'album', 'year') if genre is not None and artist is not None and album is not None: bd = self.library_populate_data(genre=genre, artist=artist, album=album, year=year) elif genre is not None and artist is not None: bd = self.library_populate_data(genre=genre, artist=artist) elif genre is not None: bd = self.library_populate_data(genre=genre) else: bd = self.library_populate_toplevel_data(genreview=True) if len(bd) == 0: # Nothing found; go up a level until we reach the top level # or results are found last_wd = self.config.wd self.config.wd = self.library_get_parent() if self.config.wd == last_wd: break for _sort, path in bd: self.librarydata.append(path) self.library.thaw_child_notify() # Scroll back to set view for current dir: self.library.realize() gobject.idle_add(self.library_set_view, not path_updated) if len(prev_selection) > 0 or prev_selection_root or prev_selection_parent: # Retain pre-update selection: self.library_retain_selection(prev_selection, prev_selection_root, prev_selection_parent) # Update library artwork as necessary self.on_library_scrolled(None, None) #self.update_breadcrumbs() def update_breadcrumbs(self): # remove previous buttons for b in self.breadcrumbs: self.breadcrumbs.remove(b) # add the views button first b = ui.button(text=_(" v "), can_focus=False, relief=gtk.RELIEF_NONE) b.connect('clicked', self.library_view_popup) self.breadcrumbs.pack_start(b, False, False) b.show() # add the ellipsis explicitly XXX make this unnecessary b = ui.label("...") self.breadcrumbs.pack_start(b, False, False) b.show() # find info for current view view, _name, icon, label = [v for v in self.VIEWS if v[0] == self.config.lib_view][0] # the first crumb is the root of the current view crumbs = [(label, icon, None, self.library_set_data(path='/'))] # rest of the crumbs are specific to the view if view == consts.VIEW_FILESYSTEM: path = self.library_get_data(self.config.wd, 'path') if path and path != '/': parts = path.split('/') else: parts = [] # no crumbs for / # append a crumb for each part for i, part in enumerate(parts): partpath = '/'.join(parts[:i+1]) target = self.library_set_data(path=partpath) crumbs.append((part, gtk.STOCK_OPEN, None, target)) else: if view == consts.VIEW_ALBUM: # We don't want to show an artist button in album view keys = 'genre', 'album' nkeys = 2 else: keys = 'genre', 'artist', 'album' nkeys = 3 parts = self.library_get_data(self.config.wd, *keys) # append a crumb for each part for i, key, part in zip(range(nkeys), keys, parts): if part is None: continue partdata = dict(zip(keys, parts)[:i+1]) target = self.library_set_data(**partdata) pb, icon = None, None if key == 'album': # Album artwork, with self.alumbpb as a backup: artist, album, path = self.library_get_data(self.config.wd, 'artist', 'album', 'path') cache_data = self.library_set_data(artist=artist, album=album, path=path) pb = self.artwork.get_library_artwork_cached_pb(cache_data, None) if pb is None: icon = 'album' elif key == 'artist': icon = 'artist' else: icon = gtk.STOCK_ORIENTATION_PORTRAIT crumbs.append((part, icon, pb, target)) # add a button for each crumb for crumb in crumbs: text, icon, pb, target = crumb text = misc.escape_html(text) if crumb is crumbs[-1]: text = "<b>%s</b>" % text label = ui.label(markup=text) if icon: image = ui.image(stock=icon) elif pb: pb = pb.scale_simple(16, 16, gtk.gdk.INTERP_HYPER) image = ui.image(pb=pb) b = breadcrumbs.CrumbButton(image, label) if crumb is crumbs[-1]: # FIXME makes the button request minimal space: # label.props.ellipsize = pango.ELLIPSIZE_END b.props.active = True # FIXME why doesn't the tooltip show? b.set_tooltip_text(label.get_label()) b.connect('toggled', self.library_browse, target) self.breadcrumbs.pack_start(b, False, False) b.show_all() def library_populate_add_parent_rows(self): #return [] # disabled as breadcrumbs replace these if self.config.lib_view == consts.VIEW_FILESYSTEM: bd = [('0', [self.harddiskpb, self.library_set_data(path='/'), '/'])] bd += [('1', [self.openpb, self.library_set_data(path='..'), '..'])] else: bd = [('0', [self.harddiskpb2, self.library_set_data(path='/'), '/'])] bd += [('1', [self.openpb2, self.library_set_data(path='..'), '..'])] return bd def library_populate_filesystem_data(self, path): # List all dirs/files at path bd = [] if path == '/' and self.lib_view_filesystem_cache is not None: # Use cache if possible... bd = self.lib_view_filesystem_cache else: for item in mpdh.call(self.client, 'lsinfo', path): if 'directory' in item: name = mpdh.get(item, 'directory').split('/')[-1] data = self.library_set_data(path=mpdh.get(item, 'directory')) bd += [('d' + unicode(name).lower(), [self.openpb, data, misc.escape_html(name)])] elif 'file' in item: data = self.library_set_data(path=mpdh.get(item, 'file')) bd += [('f' + unicode(mpdh.get(item, 'file')).lower(), [self.sonatapb, data, self.parse_formatting(self.config.libraryformat, item, True)])] bd.sort(key=operator.itemgetter(0)) if path != '/' and len(bd) > 0: bd = self.library_populate_add_parent_rows() + bd if path == '/': self.lib_view_filesystem_cache = bd return bd def library_get_toplevel_cache(self, genreview=False, artistview=False, albumview=False): if genreview and self.lib_view_genre_cache is not None: bd = self.lib_view_genre_cache elif artistview and self.lib_view_artist_cache is not None: bd = self.lib_view_artist_cache elif albumview and self.lib_view_album_cache is not None: bd = self.lib_view_album_cache else: return None # Check if we can update any artwork: for _sort, info in bd: pb = info[0] if pb == self.albumpb: artist, album, path = self.library_get_data(info[1], 'artist', 'album', 'path') key = self.library_set_data(path=path, artist=artist, album=album) pb2 = self.artwork.get_library_artwork_cached_pb(key, None) if pb2 is not None: info[0] = pb2 return bd def library_populate_toplevel_data(self, genreview=False, artistview=False, albumview=False): bd = self.library_get_toplevel_cache(genreview, artistview, albumview) if bd is not None: # We have our cached data, woot. return bd bd = [] if genreview or artistview: # Only for artist/genre views, album view is handled differently # since multiple artists can have the same album name if genreview: items = self.library_return_list_items('genre') pb = self.genrepb else: items = self.library_return_list_items('artist') pb = self.artistpb if not (self.NOTAG in items): items.append(self.NOTAG) for item in items: if genreview: playtime, num_songs = self.library_return_count(genre=item) data = self.library_set_data(genre=item) else: playtime, num_songs = self.library_return_count(artist=item) data = self.library_set_data(artist=item) if num_songs > 0: display = misc.escape_html(item) display += self.add_display_info(num_songs, int(playtime)/60) bd += [(misc.lower_no_the(item), [pb, data, display])] elif albumview: albums = [] untagged_found = False for item in mpdh.call(self.client, 'listallinfo', '/'): if 'file' in item and 'album' in item: album = mpdh.get(item, 'album') artist = mpdh.get(item, 'artist', self.NOTAG) year = mpdh.get(item, 'date', self.NOTAG) filepath = os.path.dirname(mpdh.get(item, 'file')) data = self.library_set_data(album=album, artist=artist, year=year, path=filepath) albums.append(data) if album == self.NOTAG: untagged_found = True if not untagged_found: albums.append(self.library_set_data(album=self.NOTAG)) albums = misc.remove_list_duplicates(albums, case=False) albums = self.list_identify_VA_albums(albums) for item in albums: album, artist, year, path = self.library_get_data(item, 'album', 'artist', 'year', 'path') playtime, num_songs = self.library_return_count(artist=artist, album=album, year=year) if num_songs > 0: data = self.library_set_data(artist=artist, album=album, year=year, path=path) display = misc.escape_html(album) if artist and year and len(artist) > 0 and len(year) > 0 and artist != self.NOTAG and year != self.NOTAG: display += " <span weight='light'>(" + misc.escape_html(artist) + ", " + misc.escape_html(year) + ")</span>" elif artist and len(artist) > 0 and artist != self.NOTAG: display += " <span weight='light'>(" + misc.escape_html(artist) + ")</span>" elif year and len(year) > 0 and year != self.NOTAG: display += " <span weight='light'>(" + misc.escape_html(year) + ")</span>" display += self.add_display_info(num_songs, int(playtime)/60) bd += [(misc.lower_no_the(album), [self.albumpb, data, display])] bd.sort(locale.strcoll, key=operator.itemgetter(0)) if genreview: self.lib_view_genre_cache = bd elif artistview: self.lib_view_artist_cache = bd elif albumview: self.lib_view_album_cache = bd return bd def list_identify_VA_albums(self, albums): for i in range(len(albums)): if i + consts.NUM_ARTISTS_FOR_VA - 1 > len(albums)-1: break VA = False for j in range(1, consts.NUM_ARTISTS_FOR_VA): if unicode(self.library_get_data(albums[i], 'album')).lower() != unicode(self.library_get_data(albums[i+j], 'album')).lower() \ or self.library_get_data(albums[i], 'year') != self.library_get_data(albums[i+j], 'year'): break if unicode(self.library_get_data(albums[i], 'artist')) == unicode(self.library_get_data(albums[i+j], 'artist')): albums.pop(i+j) break if j == consts.NUM_ARTISTS_FOR_VA - 1: VA = True if VA: album, year, path = self.library_get_data(albums[i], 'album', 'year', 'path') artist = self.VAstr albums[i] = self.library_set_data(album=album, artist=artist, year=year, path=path) j = 1 while i+j <= len(albums)-1: if unicode(self.library_get_data(albums[i], 'album')).lower() == unicode(self.library_get_data(albums[i+j], 'album')).lower() \ and self.library_get_data(albums[i], 'year') == self.library_get_data(albums[i+j], 'year'): albums.pop(i+j) else: break return albums def library_populate_data(self, genre=None, artist=None, album=None, year=None): # Create treeview model info bd = [] if genre is not None and artist is None and album is None: # Artists within a genre artists = self.library_return_list_items('artist', genre=genre) if len(artists) > 0: if not self.NOTAG in artists: artists.append(self.NOTAG) for artist in artists: playtime, num_songs = self.library_return_count(genre=genre, artist=artist) if num_songs > 0: display = misc.escape_html(artist) display += self.add_display_info(num_songs, int(playtime)/60) data = self.library_set_data(genre=genre, artist=artist) bd += [(misc.lower_no_the(artist), [self.artistpb, data, display])] elif artist is not None and album is None: # Albums/songs within an artist and possibly genre # Albums first: if genre is not None: albums = self.library_return_list_items('album', genre=genre, artist=artist) else: albums = self.library_return_list_items('album', artist=artist) for album in albums: if genre is not None: years = self.library_return_list_items('date', genre=genre, artist=artist, album=album) else: years = self.library_return_list_items('date', artist=artist, album=album) if not self.NOTAG in years: years.append(self.NOTAG) for year in years: if genre is not None: playtime, num_songs = self.library_return_count(genre=genre, artist=artist, album=album, year=year) if num_songs > 0: files = self.library_return_list_items('file', genre=genre, artist=artist, album=album, year=year) path = os.path.dirname(files[0]) data = self.library_set_data(genre=genre, artist=artist, album=album, year=year, path=path) else: playtime, num_songs = self.library_return_count(artist=artist, album=album, year=year) if num_songs > 0: files = self.library_return_list_items('file', artist=artist, album=album, year=year) path = os.path.dirname(files[0]) data = self.library_set_data(artist=artist, album=album, year=year, path=path) if num_songs > 0: cache_data = self.library_set_data(artist=artist, album=album, path=path) display = misc.escape_html(album) if year and len(year) > 0 and year != self.NOTAG: display += " <span weight='light'>(" + misc.escape_html(year) + ")</span>" display += self.add_display_info(num_songs, int(playtime)/60) ordered_year = year if ordered_year == self.NOTAG: ordered_year = '9999' pb = self.artwork.get_library_artwork_cached_pb(cache_data, self.albumpb) bd += [(ordered_year + misc.lower_no_the(album), [pb, data, display])] # Now, songs not in albums: bd += self.library_populate_data_songs(genre, artist, self.NOTAG, None) else: # Songs within an album, artist, year, and possibly genre bd += self.library_populate_data_songs(genre, artist, album, year) if len(bd) > 0: bd = self.library_populate_add_parent_rows() + bd bd.sort(locale.strcoll, key=operator.itemgetter(0)) return bd def library_populate_data_songs(self, genre, artist, album, year): bd = [] if genre is not None: songs, _playtime, _num_songs = self.library_return_search_items(genre=genre, artist=artist, album=album, year=year) else: songs, _playtime, _num_songs = self.library_return_search_items(artist=artist, album=album, year=year) for song in songs: data = self.library_set_data(path=mpdh.get(song, 'file')) track = mpdh.getnum(song, 'track', '99', False, 2) disc = mpdh.getnum(song, 'disc', '99', False, 2) try: bd += [('f' + disc + track + misc.lower_no_the(mpdh.get(song, 'title')), [self.sonatapb, data, self.parse_formatting(self.config.libraryformat, song, True)])] except: bd += [('f' + disc + track + unicode(mpdh.get(song, 'file')).lower(), [self.sonatapb, data, self.parse_formatting(self.config.libraryformat, song, True)])] return bd def library_return_list_items(self, itemtype, genre=None, artist=None, album=None, year=None, ignore_case=True): # Returns all items of tag 'itemtype', in alphabetical order, # using mpd's 'list'. If searchtype is passed, use # a case insensitive search, via additional 'list' # queries, since using a single 'list' call will be # case sensitive. results = [] searches = self.library_compose_list_count_searchlist(genre, artist, album, year) if len(searches) > 0: for s in searches: # If we have untagged tags (''), use search instead # of list because list will not return anything. if '' in s: items = [] songs, playtime, num_songs = self.library_return_search_items(genre, artist, album, year) for song in songs: items.append(mpdh.get(song, itemtype)) else: items = mpdh.call(self.client, 'list', itemtype, *s) for item in items: if len(item) > 0: results.append(item) else: if genre is None and artist is None and album is None and year is None: for item in mpdh.call(self.client, 'list', itemtype): if len(item) > 0: results.append(item) if ignore_case: results = misc.remove_list_duplicates(results, case=False) results.sort(locale.strcoll) return results def library_return_count(self, genre=None, artist=None, album=None, year=None): # Because mpd's 'count' is case sensitive, we have to # determine all equivalent items (case insensitive) and # call 'count' for each of them. Using 'list' + 'count' # involves much less data to be transferred back and # forth than to use 'search' and count manually. searches = self.library_compose_list_count_searchlist(genre, artist, album, year) playtime = 0 num_songs = 0 for s in searches: if '' in s and mpdh.mpd_major_version(self.client) <= 0.13: # Can't return count for empty tags, use search instead: _results, playtime, num_songs = self.library_return_search_items(genre=genre, artist=artist, album=album, year=year) else: count = mpdh.call(self.client, 'count', *s) playtime += int(mpdh.get(count, 'playtime')) num_songs += int(mpdh.get(count, 'songs')) return (playtime, num_songs) def library_compose_list_count_searchlist_single(self, search, typename, cached_list, searchlist): s = [] skip_type = (typename == 'artist' and search == self.VAstr) if search is not None and not skip_type: if search == self.NOTAG: itemlist = [search, ''] else: itemlist = [] if cached_list is None: cached_list = self.library_return_list_items(typename, ignore_case=False) cached_list.append('') # This allows us to match untagged items for item in cached_list: if unicode(item).lower() == unicode(search).lower(): itemlist.append(item) if len(itemlist) == 0: # There should be no results! return None, cached_list for item in itemlist: if len(searchlist) > 0: for item2 in searchlist: s.append(item2 + (typename, item)) else: s.append((typename, item)) else: s = searchlist return s, cached_list def library_compose_list_count_searchlist(self, genre=None, artist=None, album=None, year=None): s = [] s, self.lib_list_genres = self.library_compose_list_count_searchlist_single(genre, 'genre', self.lib_list_genres, s) if s is None: return [] s, self.lib_list_artists = self.library_compose_list_count_searchlist_single(artist, 'artist', self.lib_list_artists, s) if s is None: return [] s, self.lib_list_albums = self.library_compose_list_count_searchlist_single(album, 'album', self.lib_list_albums, s) if s is None: return [] s, self.lib_list_years = self.library_compose_list_count_searchlist_single(year, 'date', self.lib_list_years, s) if s is None: return [] return s def library_compose_search_searchlist_single(self, search, typename, searchlist): s = [] skip_type = (typename == 'artist' and search == self.VAstr) if search is not None and not skip_type: if search == self.NOTAG: itemlist = [search, ''] else: itemlist = [search] for item in itemlist: if len(searchlist) > 0: for item2 in searchlist: s.append(item2 + (typename, item)) else: s.append((typename, item)) else: s = searchlist return s def library_compose_search_searchlist(self, genre=None, artist=None, album=None, year=None): s = [] s = self.library_compose_search_searchlist_single(genre, 'genre', s) s = self.library_compose_search_searchlist_single(album, 'album', s) s = self.library_compose_search_searchlist_single(artist, 'artist', s) s = self.library_compose_search_searchlist_single(year, 'date', s) return s def library_return_search_items(self, genre=None, artist=None, album=None, year=None): # Returns all mpd items, using mpd's 'search', along with # playtime and num_songs. searches = self.library_compose_search_searchlist(genre, artist, album, year) for s in searches: args_tuple = tuple(map(str, s)) playtime = 0 num_songs = 0 results = [] if '' in s and mpdh.mpd_major_version(self.client) <= 0.13: # Can't search for empty tags, search broader and filter instead: # Strip empty tag args from tuple: pos = list(args_tuple).index('') strip_type = list(args_tuple)[pos-1] new_lst = [] for i, item in enumerate(list(args_tuple)): if i != pos and i != pos-1: new_lst.append(item) args_tuple = tuple(new_lst) else: strip_type = None if len(args_tuple) == 0: return None, 0, 0 items = mpdh.call(self.client, 'search', *args_tuple) if items is not None: for item in items: if strip_type is None or (strip_type is not None and not strip_type in item.keys()): match = True pos = 0 # Ensure that if, e.g., "foo" is searched, "foobar" isn't returned too for arg in args_tuple[::2]: if arg in item and unicode(mpdh.get(item, arg)).upper() != unicode(args_tuple[pos+1]).upper(): match = False break pos += 2 if match: results.append(item) num_songs += 1 playtime += int(mpdh.get(item, 'time', '0')) return (results, int(playtime), num_songs) def add_display_info(self, num_songs, playtime): return "\n<small><span weight='light'>" + str(num_songs) + " " + gettext.ngettext('song', 'songs', num_songs) + ", " + str(playtime) + " " + gettext.ngettext('minute', 'minutes', playtime) + "</span></small>" def library_retain_selection(self, prev_selection, prev_selection_root, prev_selection_parent): # Unselect everything: if len(self.librarydata) > 0: self.library_selection.unselect_range((0,), (len(self.librarydata)-1,)) # Now attempt to retain the selection from before the update: for value in prev_selection: for row in self.librarydata: if value == row[1]: self.library_selection.select_path(row.path) break if prev_selection_root: self.library_selection.select_path((0,)) if prev_selection_parent: self.library_selection.select_path((1,)) def library_set_view(self, select_items=True): # select_items should be false if the same directory has merely # been refreshed (updated) try: if self.config.wd in self.libraryposition: self.library.scroll_to_point(-1, self.libraryposition[self.config.wd]) else: self.library.scroll_to_point(0, 0) except: self.library.scroll_to_point(0, 0) # Select and focus previously selected item if select_items: if self.config.wd in self.libraryselectedpath: try: if self.libraryselectedpath[self.config.wd]: self.library_selection.select_path(self.libraryselectedpath[self.config.wd]) self.library.grab_focus() except: pass def library_set_data(self, *args, **kwargs): return library_set_data(*args, **kwargs) def library_get_data(self, data, *args): return library_get_data(data, *args) def library_get_data_level(self, data): if self.config.lib_view == consts.VIEW_FILESYSTEM: # Returns the number of directories down: if library_get_data(data, 'path') == '/': # Every other path doesn't start with "/", so # start the level numbering at -1 return -1 else: return library_get_data(data, 'path').count("/") else: # Returns the number of items stored in data, excluding # the path: level = 0 album, artist, genre, year = library_get_data(data, 'album', 'artist', 'genre', 'year') for item in [album, artist, genre, year]: if item is not None: level += 1 return level def on_library_key_press(self, widget, event): if event.keyval == gtk.gdk.keyval_from_name('Return'): self.on_library_row_activated(widget, widget.get_cursor()[0]) return True def on_library_query_tooltip(self, widget, x, y, keyboard_mode, tooltip): if keyboard_mode or not self.search_visible(): widget.set_tooltip_text(None) return False bin_x, bin_y = widget.convert_widget_to_bin_window_coords(x, y) pathinfo = widget.get_path_at_pos(bin_x, bin_y) if not pathinfo: widget.set_tooltip_text(None) # If the user hovers over an empty row and then back to # a row with a search result, this will ensure the tooltip # shows up again: gobject.idle_add(self.library_search_tooltips_enable, widget, x, y, keyboard_mode, None) return False treepath, _col, _x2, _y2 = pathinfo i = self.librarydata.get_iter(treepath[0]) path = misc.escape_html(self.library_get_data(self.librarydata.get_value(i, 1), 'path')) song = self.librarydata.get_value(i, 2) new_tooltip = "<b>" + _("Song") + ": </b>" + song + "\n<b>" + _("Path") + ": </b>" + path if new_tooltip != self.libsearch_last_tooltip: self.libsearch_last_tooltip = new_tooltip self.library.set_property('has-tooltip', False) gobject.idle_add(self.library_search_tooltips_enable, widget, x, y, keyboard_mode, tooltip) gobject.idle_add(widget.set_tooltip_markup, new_tooltip) return self.libsearch_last_tooltip = new_tooltip return False #api says we should return True, but this doesn't work? def library_search_tooltips_enable(self, widget, x, y, keyboard_mode, tooltip): self.library.set_property('has-tooltip', True) if tooltip is not None: self.on_library_query_tooltip(widget, x, y, keyboard_mode, tooltip) def on_library_row_activated(self, _widget, path, _column=0): if path is None: # Default to last item in selection: _model, selected = self.library_selection.get_selected_rows() if len(selected) >= 1: path = selected[0] else: return value = self.librarydata.get_value(self.librarydata.get_iter(path), 1) icon = self.librarydata.get_value(self.librarydata.get_iter(path), 0) if icon == self.sonatapb: # Song found, add item self.on_add_item(self.library) elif value == self.library_set_data(path=".."): self.library_browse_parent(None) else: self.library_browse(None, value) def library_get_parent(self): if self.config.lib_view == consts.VIEW_ALBUM: value = self.library_set_data(path="/") elif self.config.lib_view == consts.VIEW_ARTIST: album, artist = self.library_get_data(self.config.wd, 'album', 'artist') if album is not None: value = self.library_set_data(artist=artist) else: value = self.library_set_data(path="/") elif self.config.lib_view == consts.VIEW_GENRE: album, artist, genre = self.library_get_data(self.config.wd, 'album', 'artist', 'genre') if album is not None: value = self.library_set_data(genre=genre, artist=artist) elif artist is not None: value = self.library_set_data(genre=genre) else: value = self.library_set_data(path="/") else: newvalue = '/'.join(self.library_get_data(self.config.wd, 'path').split('/')[:-1]) or '/' value = self.library_set_data(path=newvalue) return value def library_browse_parent(self, _action): if not self.search_visible(): if self.library.is_focus(): value = self.library_get_parent() self.library_browse(None, value) return True def not_parent_is_selected(self): # Returns True if something is selected and it's not # ".." or "/": model, rows = self.library_selection.get_selected_rows() for path in rows: i = model.get_iter(path) value = model.get_value(i, 2) if value != ".." and value != "/": return True return False def get_path_child_filenames(self, return_root, selected_only=True): # If return_root=True, return main directories whenever possible # instead of individual songs in order to reduce the number of # mpd calls we need to make. We won't want this behavior in some # instances, like when we want all end files for editing tags items = [] if selected_only: model, rows = self.library_selection.get_selected_rows() else: model = self.librarydata rows = [(i,) for i in range(len(model))] for path in rows: i = model.get_iter(path) pb = model.get_value(i, 0) data = model.get_value(i, 1) value = model.get_value(i, 2) if value != ".." and value != "/": album, artist, year, genre, path = self.library_get_data(data, 'album', 'artist', 'year', 'genre', 'path') if path is not None and album is None and artist is None and year is None and genre is None: if pb == self.sonatapb: # File items.append(path) else: # Directory if not return_root: items = items + self.library_get_path_files_recursive(path) else: items.append(path) else: results, _playtime, _num_songs = self.library_return_search_items(genre=genre, artist=artist, album=album, year=year) for item in results: items.append(mpdh.get(item, 'file')) # Make sure we don't have any EXACT duplicates: items = misc.remove_list_duplicates(items, case=True) return items def library_get_path_files_recursive(self, path): results = [] for item in mpdh.call(self.client, 'lsinfo', path): if 'directory' in item: results = results + self.library_get_path_files_recursive(mpdh.get(item, 'directory')) elif 'file' in item: results.append(mpdh.get(item, 'file')) return results def on_library_search_combo_change(self, _combo=None): self.config.last_search_num = self.searchcombo.get_active() if not self.search_visible(): return self.prevlibtodo = "" self.prevlibtodo_base = "__" self.libsearchfilter_feed_loop(self.searchtext) def on_search_end(self, _button, move_focus=True): if self.search_visible(): self.libsearchfilter_toggle(move_focus) def search_visible(self): return self.searchbutton.get_property('visible') def libsearchfilter_toggle(self, move_focus): if not self.search_visible() and self.connected(): self.library.set_property('has-tooltip', True) ui.show(self.searchbutton) self.prevlibtodo = 'foo' self.prevlibtodo_base = "__" self.prevlibtodo_base_results = [] # extra thread for background search work, synchronized with a condition and its internal mutex self.libfilterbox_cond = threading.Condition() self.libfilterbox_cmd_buf = self.searchtext.get_text() qsearch_thread = threading.Thread(target=self.libsearchfilter_loop) qsearch_thread.setDaemon(True) qsearch_thread.start() elif self.search_visible(): ui.hide(self.searchbutton) self.searchtext.handler_block(self.libfilter_changed_handler) self.searchtext.set_text("") self.searchtext.handler_unblock(self.libfilter_changed_handler) self.libsearchfilter_stop_loop() self.library_browse(root=self.config.wd) if move_focus: self.library.grab_focus() def libsearchfilter_feed_loop(self, editable): if not self.search_visible(): self.libsearchfilter_toggle(None) # Lets only trigger the searchfilter_loop if 200ms pass without a change # in gtk.Entry try: gobject.source_remove(self.libfilterbox_source) except: pass self.libfilterbox_source = gobject.timeout_add(300, self.libsearchfilter_start_loop, editable) def libsearchfilter_start_loop(self, editable): self.libfilterbox_cond.acquire() self.libfilterbox_cmd_buf = editable.get_text() self.libfilterbox_cond.notifyAll() self.libfilterbox_cond.release() def libsearchfilter_stop_loop(self): self.libfilterbox_cond.acquire() self.libfilterbox_cmd_buf = '$$$QUIT###' self.libfilterbox_cond.notifyAll() self.libfilterbox_cond.release() def libsearchfilter_loop(self): while True: # copy the last command or pattern safely self.libfilterbox_cond.acquire() try: while(self.libfilterbox_cmd_buf == '$$$DONE###'): self.libfilterbox_cond.wait() todo = self.libfilterbox_cmd_buf self.libfilterbox_cond.release() except: todo = self.libfilterbox_cmd_buf searchby = self.search_terms_mpd[self.config.last_search_num] if self.prevlibtodo != todo: if todo == '$$$QUIT###': gobject.idle_add(self.filtering_entry_revert_color, self.searchtext) return elif len(todo) > 1: gobject.idle_add(self.libsearchfilter_do_search, searchby, todo) elif len(todo) == 0: gobject.idle_add(self.filtering_entry_revert_color, self.searchtext) self.libsearchfilter_toggle(False) else: gobject.idle_add(self.filtering_entry_revert_color, self.searchtext) self.libfilterbox_cond.acquire() self.libfilterbox_cmd_buf = '$$$DONE###' try: self.libfilterbox_cond.release() except: pass self.prevlibtodo = todo def libsearchfilter_do_search(self, searchby, todo): if not self.prevlibtodo_base in todo: # Do library search based on first two letters: self.prevlibtodo_base = todo[:2] self.prevlibtodo_base_results = mpdh.call(self.client, 'search', searchby, self.prevlibtodo_base) subsearch = False else: subsearch = True # Now, use filtering similar to playlist filtering: # this make take some seconds... and we'll escape the search text because # we'll be searching for a match in items that are also escaped. # # Note that the searching is not order specific. That is, "foo bar" # will match on "fools bar" and "barstool foo". todos = todo.split(" ") regexps = [] for i in range(len(todos)): todos[i] = misc.escape_html(todos[i]) todos[i] = re.escape(todos[i]) todos[i] = '.*' + todos[i].lower() regexps.append(re.compile(todos[i])) matches = [] if searchby != 'any': for row in self.prevlibtodo_base_results: is_match = True for regexp in regexps: if not regexp.match(unicode(mpdh.get(row, searchby)).lower()): is_match = False break if is_match: matches.append(row) else: for row in self.prevlibtodo_base_results: allstr = " ".join(mpdh.get(row, meta) for meta in row) is_match = True for regexp in regexps: if not regexp.match(unicode(allstr).lower()): is_match = False break if is_match: matches.append(row) if subsearch and len(matches) == len(self.librarydata): # nothing changed.. return self.library.freeze_child_notify() currlen = len(self.librarydata) bd = [[self.sonatapb, self.library_set_data(path=mpdh.get(item, 'file')), self.parse_formatting(self.config.libraryformat, item, True)] for item in matches if 'file' in item] bd.sort(locale.strcoll, key=operator.itemgetter(2)) for i, item in enumerate(bd): if i < currlen: j = self.librarydata.get_iter((i, )) for index in range(len(item)): if item[index] != self.librarydata.get_value(j, index): self.librarydata.set_value(j, index, item[index]) else: self.librarydata.append(item) # Remove excess items... newlen = len(bd) if newlen == 0: self.librarydata.clear() else: for i in range(currlen-newlen): j = self.librarydata.get_iter((currlen-1-i,)) self.librarydata.remove(j) self.library.thaw_child_notify() if len(matches) == 0: gobject.idle_add(self.filtering_entry_make_red, self.searchtext) else: gobject.idle_add(self.library.set_cursor,'0') gobject.idle_add(self.filtering_entry_revert_color, self.searchtext) def libsearchfilter_key_pressed(self, widget, event): self.filter_key_pressed(widget, event, self.library) def libsearchfilter_on_enter(self, _entry): self.on_library_row_activated(None, None) def libsearchfilter_set_focus(self): gobject.idle_add(self.searchtext.grab_focus) def libsearchfilter_get_style(self): return self.searchtext.get_style() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/main.py�����������������������������������������������������������������������0000664�0000000�0000000�00000406143�11255764730�0015751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ __license__ = """ Sonata, an elegant GTK+ client for the Music Player Daemon Copyright 2006-2008 Scott Horowitz <stonecrest@gmail.com> This file is part of Sonata. Sonata 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 3 of the License, or (at your option) any later version. Sonata 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, see <http://www.gnu.org/licenses/>. """ import sys, locale, gettext, os, warnings import urllib, urllib2, re, gc, shutil import threading import mpd import gobject, gtk, pango # Prevent deprecation warning for egg: warnings.simplefilter('ignore', DeprecationWarning) try: import egg.trayicon HAVE_EGG = True HAVE_STATUS_ICON = False except ImportError: HAVE_EGG = False HAVE_STATUS_ICON = True # Reset so that we can see any other deprecation warnings warnings.simplefilter('default', DeprecationWarning) # Default to no sugar, then test... HAVE_SUGAR = False VOLUME_ICON_SIZE = 4 if 'SUGAR_BUNDLE_PATH' in os.environ: try: from sugar.activity import activity HAVE_STATUS_ICON = False HAVE_SUGAR = True VOLUME_ICON_SIZE = 3 except: pass import mpdhelper as mpdh import misc, ui, img, tray from consts import consts from pluginsystem import pluginsystem from preferences import * from config import Config import tagedit, artwork, about, scrobbler, info, library, streams, playlists, current import dbus_plugin as dbus try: import version except ImportError: import svnversion as version class Base(object): def __init__(self, args, window=None, sugar=False): # The following attributes were used but not defined here before: self.album_current_artist = None self.allow_art_search = None self.choose_dialog = None self.chooseimage_visible = None self.imagelist = None self.iterate_handler = None self.local_dest_filename = None self.notification_width = None self.remote_albumentry = None self.remote_artistentry = None self.remote_dest_filename = None self.remotefilelist = None self.seekidle = None self.statusicon = None self.trayeventbox = None self.trayicon = None self.trayimage = None self.artwork = None self.client = mpd.MPDClient() self.conn = False # Constants self.TAB_CURRENT = _("Current") self.TAB_LIBRARY = _("Library") self.TAB_PLAYLISTS = _("Playlists") self.TAB_STREAMS = _("Streams") self.TAB_INFO = _("Info") # If the connection to MPD times out, this will cause the interface to freeze while # the socket.connect() calls are repeatedly executed. Therefore, if we were not # able to make a connection, slow down the iteration check to once every 15 seconds. self.iterate_time_when_connected = 500 self.iterate_time_when_disconnected_or_stopped = 1000 # Slow down polling when disconnected stopped self.trying_connection = False self.traytips = tray.TrayIconTips() # better keep a reference around try: self.dbus_service = dbus.SonataDBus(self.dbus_show, self.dbus_toggle, self.dbus_popup) except Exception: pass dbus.start_dbus_interface() self.gnome_session_management() misc.create_dir('~/.covers/') # Initialize vars for GUI self.current_tab = self.TAB_CURRENT self.prevconn = [] self.prevstatus = None self.prevsonginfo = None self.popuptimes = ['2', '3', '5', '10', '15', '30', _('Entire song')] self.exit_now = False self.ignore_toggle_signal = False self.user_connect = False self.sonata_loaded = False self.call_gc_collect = False self.album_reset_artist() show_prefs = False self.merge_id = None self.actionGroupProfiles = None self.skip_on_profiles_click = False self.last_repeat = None self.last_random = None self.last_title = None self.last_progress_frac = None self.last_progress_text = None self.last_status_text = "" self.eggtrayfile = None self.eggtrayheight = None self.img_clicked = False self.mpd_update_queued = False # XXX get rid of all of these: self.all_tab_names = [self.TAB_CURRENT, self.TAB_LIBRARY, self.TAB_PLAYLISTS, self.TAB_STREAMS, self.TAB_INFO] all_tab_ids = "current library playlists streams info".split() self.tabname2id = dict(zip(self.all_tab_names, all_tab_ids)) self.tabid2name = dict(zip(all_tab_ids, self.all_tab_names)) self.tabname2tab = dict() self.tabname2focus = dict() self.config = Config(_('Default Profile'), _("by") + " %A " + _("from") + " %B", library.library_set_data) self.preferences = Preferences(self.config, self.on_connectkey_pressed, self.on_currsong_notify, self.update_infofile, self.settings_save, self.populate_profiles_for_menu) self.settings_load() if args.start_visibility is not None: self.config.withdrawn = not args.start_visibility if self.config.autoconnect: self.user_connect = True args.apply_profile_arg(self.config) self.notebook_show_first_tab = not self.config.tabs_expanded or self.config.withdrawn # Add some icons, assign pixbufs: self.iconfactory = gtk.IconFactory() ui.icon(self.iconfactory, 'sonata', self.find_path('sonata.png')) ui.icon(self.iconfactory, 'artist', self.find_path('sonata-artist.png')) ui.icon(self.iconfactory, 'album', self.find_path('sonata-album.png')) icon_theme = gtk.icon_theme_get_default() if HAVE_SUGAR: activity_root = activity.get_bundle_path() icon_theme.append_search_path(os.path.join(activity_root, 'share')) img_width, _img_height = gtk.icon_size_lookup(VOLUME_ICON_SIZE) for iconname in ('stock_volume-mute', 'stock_volume-min', 'stock_volume-med', 'stock_volume-max'): try: ui.icon(self.iconfactory, iconname, icon_theme.lookup_icon(iconname, img_width, gtk.ICON_LOOKUP_USE_BUILTIN).get_filename()) except: # Fallback to Sonata-included icons: ui.icon(self.iconfactory, iconname, self.find_path('sonata-'+iconname+'.png')) # Main window if window is None: self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window_owner = True else: self.window = window self.window_owner = False if self.window_owner: self.window.set_title('Sonata') self.window.set_role('mainWindow') self.window.set_resizable(True) if self.config.ontop: self.window.set_keep_above(True) if self.config.sticky: self.window.stick() if not self.config.decorated: self.window.set_decorated(False) self.preferences.window = self.window self.notebook = gtk.Notebook() # Artwork self.artwork = artwork.Artwork(self.config, self.find_path, misc.is_lang_rtl(self.window), lambda:self.info_imagebox.get_size_request(), self.schedule_gc_collect, self.target_image_filename, self.imagelist_append, self.remotefilelist_append, self.notebook.get_allocation, self.set_allow_art_search, self.status_is_play_or_pause, self.find_path('sonata-album.png'), self.get_current_song_text) # Popup menus: actions = ( ('sortmenu', None, _('_Sort List')), ('plmenu', None, _('Sa_ve List to')), ('profilesmenu', None, _('_Connection')), ('playaftermenu', None, _('P_lay after')), ('updatemenu', None, _('_Update')), ('chooseimage_menu', gtk.STOCK_CONVERT, _('Use _Remote Image...'), None, None, self.image_remote), ('localimage_menu', gtk.STOCK_OPEN, _('Use _Local Image...'), None, None, self.image_local), ('fullscreencoverart_menu', gtk.STOCK_FULLSCREEN, _('_Fullscreen Mode'), 'F11', None, self.fullscreen_cover_art), ('resetimage_menu', gtk.STOCK_CLEAR, _('Reset Image'), None, None, self.artwork.on_reset_image), ('playmenu', gtk.STOCK_MEDIA_PLAY, _('_Play'), None, None, self.mpd_pp), ('pausemenu', gtk.STOCK_MEDIA_PAUSE, _('Pa_use'), None, None, self.mpd_pp), ('stopmenu', gtk.STOCK_MEDIA_STOP, _('_Stop'), None, None, self.mpd_stop), ('prevmenu', gtk.STOCK_MEDIA_PREVIOUS, _('Pre_vious'), None, None, self.mpd_prev), ('nextmenu', gtk.STOCK_MEDIA_NEXT, _('_Next'), None, None, self.mpd_next), ('quitmenu', gtk.STOCK_QUIT, _('_Quit'), None, None, self.on_delete_event_yes), ('removemenu', gtk.STOCK_REMOVE, _('_Remove'), None, None, self.on_remove), ('clearmenu', gtk.STOCK_CLEAR, _('_Clear'), '<Ctrl>Delete', None, self.mpd_clear), ('updatefullmenu', None, _('_Entire Library'), '<Ctrl><Shift>u', None, self.on_updatedb), ('updateselectedmenu', None, _('_Selected Items'), '<Ctrl>u', None, self.on_updatedb_shortcut), ('preferencemenu', gtk.STOCK_PREFERENCES, _('_Preferences...'), 'F5', None, self.on_prefs), ('aboutmenu', None, _('_About...'), 'F1', None, self.on_about), ('tagmenu', None, _('_Edit Tags...'), '<Ctrl>t', None, self.on_tags_edit), ('addmenu', gtk.STOCK_ADD, _('_Add'), '<Ctrl>d', None, self.on_add_item), ('replacemenu', gtk.STOCK_REDO, _('_Replace'), '<Ctrl>r', None, self.on_replace_item), ('add2menu', None, _('Add'), '<Shift><Ctrl>d', None, self.on_add_item_play), ('replace2menu', None, _('Replace'), '<Shift><Ctrl>r', None, self.on_replace_item_play), ('rmmenu', None, _('_Delete...'), None, None, self.on_remove), ('sortshuffle', None, _('Shuffle'), '<Alt>r', None, self.mpd_shuffle), ('tab1key', None, 'Tab1 Key', '<Alt>1', None, self.on_switch_to_tab1), ('tab2key', None, 'Tab2 Key', '<Alt>2', None, self.on_switch_to_tab2), ('tab3key', None, 'Tab3 Key', '<Alt>3', None, self.on_switch_to_tab3), ('tab4key', None, 'Tab4 Key', '<Alt>4', None, self.on_switch_to_tab4), ('tab5key', None, 'Tab5 Key', '<Alt>5', None, self.on_switch_to_tab5), ('nexttab', None, 'Next Tab Key', '<Alt>Right', None, self.switch_to_next_tab), ('prevtab', None, 'Prev Tab Key', '<Alt>Left', None, self.switch_to_prev_tab), ('expandkey', None, 'Expand Key', '<Alt>Down', None, self.on_expand), ('collapsekey', None, 'Collapse Key', '<Alt>Up', None, self.on_collapse), ('ppkey', None, 'Play/Pause Key', '<Ctrl>p', None, self.mpd_pp), ('stopkey', None, 'Stop Key', '<Ctrl>s', None, self.mpd_stop), ('prevkey', None, 'Previous Key', '<Ctrl>Left', None, self.mpd_prev), ('nextkey', None, 'Next Key', '<Ctrl>Right', None, self.mpd_next), ('lowerkey', None, 'Lower Volume Key', '<Ctrl>minus', None, self.on_volume_lower), ('raisekey', None, 'Raise Volume Key', '<Ctrl>plus', None, self.on_volume_raise), ('raisekey2', None, 'Raise Volume Key 2', '<Ctrl>equal', None, self.on_volume_raise), ('quitkey', None, 'Quit Key', '<Ctrl>q', None, self.on_delete_event_yes), ('quitkey2', None, 'Quit Key 2', '<Ctrl>w', None, self.on_delete_event_yes), ('connectkey', None, 'Connect Key', '<Alt>c', None, self.on_connectkey_pressed), ('disconnectkey', None, 'Disconnect Key', '<Alt>d', None, self.on_disconnectkey_pressed), ('searchkey', None, 'Search Key', '<Ctrl>h', None, self.on_library_search_shortcut), ) toggle_actions = ( ('showmenu', None, _('S_how Sonata'), None, None, self.on_withdraw_app_toggle, not self.config.withdrawn), ('repeatmenu', None, _('_Repeat'), None, None, self.on_repeat_clicked, False), ('randommenu', None, _('Rando_m'), None, None, self.on_random_clicked, False), (self.TAB_CURRENT, None, self.TAB_CURRENT, None, None, self.on_tab_toggle, self.config.current_tab_visible), (self.TAB_LIBRARY, None, self.TAB_LIBRARY, None, None, self.on_tab_toggle, self.config.library_tab_visible), (self.TAB_PLAYLISTS, None, self.TAB_PLAYLISTS, None, None, self.on_tab_toggle, self.config.playlists_tab_visible), (self.TAB_STREAMS, None, self.TAB_STREAMS, None, None, self.on_tab_toggle, self.config.streams_tab_visible), (self.TAB_INFO, None, self.TAB_INFO, None, None, self.on_tab_toggle, self.config.info_tab_visible), ) uiDescription = """ <ui> <popup name="imagemenu"> <menuitem action="chooseimage_menu"/> <menuitem action="localimage_menu"/> <menuitem action="fullscreencoverart_menu"/> <separator name="FM1"/> <menuitem action="resetimage_menu"/> </popup> <popup name="traymenu"> <menuitem action="showmenu"/> <separator name="FM1"/> <menuitem action="playmenu"/> <menuitem action="pausemenu"/> <menuitem action="stopmenu"/> <menuitem action="prevmenu"/> <menuitem action="nextmenu"/> <separator name="FM2"/> <menuitem action="quitmenu"/> </popup> <popup name="mainmenu"> <menuitem action="addmenu"/> <menuitem action="replacemenu"/> <menu action="playaftermenu"> <menuitem action="add2menu"/> <menuitem action="replace2menu"/> </menu> <menuitem action="newmenu"/> <menuitem action="editmenu"/> <menuitem action="removemenu"/> <menuitem action="clearmenu"/> <menuitem action="tagmenu"/> <menuitem action="renamemenu"/> <menuitem action="rmmenu"/> <menu action="sortmenu"> <menuitem action="sortbytitle"/> <menuitem action="sortbyartist"/> <menuitem action="sortbyalbum"/> <menuitem action="sortbyfile"/> <menuitem action="sortbydirfile"/> <separator name="FM3"/> <menuitem action="sortshuffle"/> <menuitem action="sortreverse"/> </menu> <menu action="plmenu"> <menuitem action="savemenu"/> <separator name="FM4"/> </menu> <separator name="FM1"/> <menuitem action="repeatmenu"/> <menuitem action="randommenu"/> <menu action="updatemenu"> <menuitem action="updateselectedmenu"/> <menuitem action="updatefullmenu"/> </menu> <separator name="FM2"/> <menu action="profilesmenu"> </menu> <menuitem action="preferencemenu"/> <menuitem action="aboutmenu"/> <menuitem action="quitmenu"/> </popup> <popup name="librarymenu"> <menuitem action="filesystemview"/> <menuitem action="artistview"/> <menuitem action="genreview"/> <menuitem action="albumview"/> </popup> <popup name="hidden"> <menuitem action="quitkey"/> <menuitem action="quitkey2"/> <menuitem action="tab1key"/> <menuitem action="tab2key"/> <menuitem action="tab3key"/> <menuitem action="tab4key"/> <menuitem action="tab5key"/> <menuitem action="nexttab"/> <menuitem action="prevtab"/> <menuitem action="nexttab"/> <menuitem action="prevtab"/> <menuitem action="expandkey"/> <menuitem action="collapsekey"/> <menuitem action="ppkey"/> <menuitem action="stopkey"/> <menuitem action="nextkey"/> <menuitem action="prevkey"/> <menuitem action="lowerkey"/> <menuitem action="raisekey"/> <menuitem action="raisekey2"/> <menuitem action="connectkey"/> <menuitem action="disconnectkey"/> <menuitem action="centerplaylistkey"/> <menuitem action="searchkey"/> </popup> <popup name="notebookmenu"> """ for tab in self.all_tab_names: uiDescription = uiDescription + "<menuitem action=\"" + tab + "\"/>" uiDescription = uiDescription + "</popup></ui>" # Try to connect to MPD: self.mpd_connect(blocking=True) if self.conn: self.status = mpdh.status(self.client) self.iterate_time = self.iterate_time_when_connected self.songinfo = mpdh.currsong(self.client) self.artwork.update_songinfo(self.songinfo) elif self.config.initial_run: show_prefs = True # Realizing self.window will allow us to retrieve the theme's # link-color; we can then apply to it various widgets: try: self.window.realize() linkcolor = self.window.style_get_property("link-color").to_string() except: linkcolor = None # Audioscrobbler self.scrobbler = scrobbler.Scrobbler(self.config) self.scrobbler.import_module() self.scrobbler.init() self.preferences.scrobbler = self.scrobbler # Current tab self.current = current.Current(self.config, self.client, self.TAB_CURRENT, self.on_current_button_press, self.parse_formatting_colnames, self.parse_formatting, self.connected, lambda:self.sonata_loaded, lambda:self.songinfo, self.update_statusbar, self.iterate_now, lambda:self.library.libsearchfilter_get_style(), self.new_tab) self.current_treeview = self.current.get_treeview() self.current_selection = self.current.get_selection() currentactions = [ ('centerplaylistkey', None, 'Center Playlist Key', '<Ctrl>i', None, self.current.center_song_in_list), ('sortbyartist', None, _('By Artist'), None, None, self.current.on_sort_by_artist), ('sortbyalbum', None, _('By Album'), None, None, self.current.on_sort_by_album), ('sortbytitle', None, _('By Song Title'), None, None, self.current.on_sort_by_title), ('sortbyfile', None, _('By File Name'), None, None, self.current.on_sort_by_file), ('sortbydirfile', None, _('By Dir & File Name'), None, None, self.current.on_sort_by_dirfile), ('sortreverse', None, _('Reverse List'), None, None, self.current.on_sort_reverse), ] # Library tab self.library = library.Library(self.config, self.client, self.artwork, self.TAB_LIBRARY, self.find_path('sonata-album.png'), self.settings_save, self.current.filtering_entry_make_red, self.current.filtering_entry_revert_color, self.current.filter_key_pressed, self.on_add_item, self.parse_formatting, self.connected, self.on_library_button_press, self.on_library_search_text_click, self.new_tab) self.library_treeview = self.library.get_treeview() self.library_selection = self.library.get_selection() libraryactions = self.library.get_libraryactions() # Info tab self.info = info.Info(self.config, self.artwork.get_info_image(), linkcolor, self.on_link_click, self.library.library_return_search_items, self.get_playing_song, self.TAB_INFO, self.on_image_activate, self.on_image_motion_cb, self.on_image_drop_cb, self.album_return_artist_and_tracks, self.new_tab) self.info_imagebox = self.info.get_info_imagebox() # Streams tab self.streams = streams.Streams(self.config, self.window, self.on_streams_button_press, self.on_add_item, self.settings_save, self.TAB_STREAMS, self.new_tab) self.streams_treeview = self.streams.get_treeview() self.streams_selection = self.streams.get_selection() streamsactions = [ ('newmenu', None, _('_New...'), '<Ctrl>n', None, self.streams.on_streams_new), ('editmenu', None, _('_Edit...'), None, None, self.streams.on_streams_edit), ] # Playlists tab self.playlists = playlists.Playlists(self.config, self.window, self.client, lambda:self.UIManager, self.update_menu_visibility, self.iterate_now, self.on_add_item, self.on_playlists_button_press, self.current.get_current_songs, self.connected, self.TAB_PLAYLISTS, self.new_tab) self.playlists_treeview = self.playlists.get_treeview() self.playlists_selection = self.playlists.get_selection() playlistsactions = [ ('savemenu', None, _('_New Playlist...'), '<Ctrl><Shift>s', None, self.playlists.on_playlist_save), ('renamemenu', None, _('_Rename...'), None, None, self.playlists.on_playlist_rename), ] # Main app: self.UIManager = gtk.UIManager() actionGroup = gtk.ActionGroup('Actions') actionGroup.add_actions(actions) actionGroup.add_actions(currentactions) actionGroup.add_actions(libraryactions) actionGroup.add_actions(streamsactions) actionGroup.add_actions(playlistsactions) actionGroup.add_toggle_actions(toggle_actions) self.UIManager.insert_action_group(actionGroup, 0) self.UIManager.add_ui_from_string(uiDescription) self.populate_profiles_for_menu() self.window.add_accel_group(self.UIManager.get_accel_group()) self.mainmenu = self.UIManager.get_widget('/mainmenu') self.randommenu = self.UIManager.get_widget('/mainmenu/randommenu') self.repeatmenu = self.UIManager.get_widget('/mainmenu/repeatmenu') self.imagemenu = self.UIManager.get_widget('/imagemenu') self.traymenu = self.UIManager.get_widget('/traymenu') self.librarymenu = self.UIManager.get_widget('/librarymenu') self.library.set_librarymenu(self.librarymenu) self.notebookmenu = self.UIManager.get_widget('/notebookmenu') mainhbox = gtk.HBox() mainvbox = gtk.VBox() tophbox = gtk.HBox() self.albumimage = self.artwork.get_albumimage() self.imageeventbox = ui.eventbox(add=self.albumimage) self.imageeventbox.drag_dest_set(gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP, [("text/uri-list", 0, 80), ("text/plain", 0, 80)], gtk.gdk.ACTION_DEFAULT) if not self.config.show_covers: ui.hide(self.imageeventbox) tophbox.pack_start(self.imageeventbox, False, False, 5) topvbox = gtk.VBox() toptophbox = gtk.HBox() self.prevbutton = ui.button(stock=gtk.STOCK_MEDIA_PREVIOUS, relief=gtk.RELIEF_NONE, can_focus=False, hidetxt=True) self.ppbutton = ui.button(stock=gtk.STOCK_MEDIA_PLAY, relief=gtk.RELIEF_NONE, can_focus=False, hidetxt=True) self.stopbutton = ui.button(stock=gtk.STOCK_MEDIA_STOP, relief=gtk.RELIEF_NONE, can_focus=False, hidetxt=True) self.nextbutton = ui.button(stock=gtk.STOCK_MEDIA_NEXT, relief=gtk.RELIEF_NONE, can_focus=False, hidetxt=True) for mediabutton in (self.prevbutton, self.ppbutton, self.stopbutton, self.nextbutton): toptophbox.pack_start(mediabutton, False, False, 0) if not self.config.show_playback: ui.hide(mediabutton) self.progressbox = gtk.VBox() self.progresslabel = ui.label(w=-1, h=6) self.progressbox.pack_start(self.progresslabel) self.progressbar = ui.progressbar(orient=gtk.PROGRESS_LEFT_TO_RIGHT, frac=0, step=0.05, ellipsize=pango.ELLIPSIZE_END) self.progresseventbox = ui.eventbox(add=self.progressbar, visible=True) self.progressbox.pack_start(self.progresseventbox, False, False, 0) self.progresslabel2 = ui.label(w=-1, h=6) self.progressbox.pack_start(self.progresslabel2) toptophbox.pack_start(self.progressbox, True, True, 0) if not self.config.show_progress: ui.hide(self.progressbox) self.volumebutton = ui.togglebutton(relief=gtk.RELIEF_NONE, can_focus=False) self.volume_set_image("stock_volume-med") if not self.config.show_playback: ui.hide(self.volumebutton) toptophbox.pack_start(self.volumebutton, False, False, 0) topvbox.pack_start(toptophbox, False, False, 2) self.expander = ui.expander(text=_("Playlist"), expand=self.config.expanded, can_focus=False) expanderbox = gtk.VBox() self.cursonglabel1 = ui.label(y=0) self.cursonglabel2 = ui.label(y=0) expanderbox.pack_start(self.cursonglabel1, True, True, 0) expanderbox.pack_start(self.cursonglabel2, True, True, 0) self.expander.set_label_widget(expanderbox) topvbox.pack_start(self.expander, False, False, 2) tophbox.pack_start(topvbox, True, True, 3) mainvbox.pack_start(tophbox, False, False, 5) self.notebook.set_tab_pos(gtk.POS_TOP) self.notebook.set_scrollable(True) mainvbox.pack_start(self.notebook, True, True, 5) self.statusbar = gtk.Statusbar() self.statusbar.set_has_resize_grip(True) if not self.config.show_statusbar or not self.config.expanded: ui.hide(self.statusbar) mainvbox.pack_start(self.statusbar, False, False, 0) mainhbox.pack_start(mainvbox, True, True, 3) if self.window_owner: self.window.add(mainhbox) self.window.move(self.config.x, self.config.y) self.window.set_size_request(270, -1) elif HAVE_SUGAR: self.window.set_canvas(mainhbox) if not self.config.expanded: ui.hide(self.notebook) self.cursonglabel1.set_markup('<big><b>' + _('Stopped') + '</b></big>') self.cursonglabel2.set_markup('<small>' + _('Click to expand') + '</small>') if self.window_owner: self.window.set_default_size(self.config.w, 1) else: self.cursonglabel1.set_markup('<big><b>' + _('Stopped') + '</b></big>') self.cursonglabel2.set_markup('<small>' + _('Click to collapse') + '</small>') if self.window_owner: self.window.set_default_size(self.config.w, self.config.h) self.expander.set_tooltip_text(self.cursonglabel1.get_text()) if not self.conn: self.progressbar.set_text(_('Not Connected')) elif not self.status: self.progressbar.set_text(_('No Read Permission')) # Update tab positions: XXX move to self.new_tab self.notebook.reorder_child(self.current.get_widgets(), self.config.current_tab_pos) self.notebook.reorder_child(self.library.get_widgets(), self.config.library_tab_pos) self.notebook.reorder_child(self.playlists.get_widgets(), self.config.playlists_tab_pos) self.notebook.reorder_child(self.streams.get_widgets(), self.config.streams_tab_pos) self.notebook.reorder_child(self.info.get_widgets(), self.config.info_tab_pos) self.last_tab = self.notebook_get_tab_text(self.notebook, 0) # Song notification window: outtertipbox = gtk.VBox() tipbox = gtk.HBox() self.trayalbumeventbox, self.trayalbumimage2 = self.artwork.get_trayalbum() hiddenlbl = ui.label(w=2, h=-1) tipbox.pack_start(hiddenlbl, False, False, 0) tipbox.pack_start(self.trayalbumeventbox, False, False, 0) tipbox.pack_start(self.trayalbumimage2, False, False, 0) if not self.config.show_covers: ui.hide(self.trayalbumeventbox) ui.hide(self.trayalbumimage2) innerbox = gtk.VBox() self.traycursonglabel1 = ui.label(markup=_("Playlist"), y=1) self.traycursonglabel2 = ui.label(markup=_("Playlist"), y=0) label1 = ui.label(markup='<span size="10"> </span>') innerbox.pack_start(label1) innerbox.pack_start(self.traycursonglabel1, True, True, 0) innerbox.pack_start(self.traycursonglabel2, True, True, 0) self.trayprogressbar = ui.progressbar(orient=gtk.PROGRESS_LEFT_TO_RIGHT, frac=0, step=0.05, ellipsize=pango.ELLIPSIZE_NONE) label2 = ui.label(markup='<span size="10"> </span>') innerbox.pack_start(label2) innerbox.pack_start(self.trayprogressbar, False, False, 0) if not self.config.show_progress: ui.hide(self.trayprogressbar) label3 = ui.label(markup='<span size="10"> </span>') innerbox.pack_start(label3) tipbox.pack_start(innerbox, True, True, 6) outtertipbox.pack_start(tipbox, False, False, 2) outtertipbox.show_all() self.traytips.add_widget(outtertipbox) self.tooltip_set_window_width() # Volumescale window self.volumewindow = gtk.Window(gtk.WINDOW_POPUP) self.volumewindow.set_skip_taskbar_hint(True) self.volumewindow.set_skip_pager_hint(True) self.volumewindow.set_decorated(False) frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_ETCHED_IN) self.volumewindow.add(frame) volbox = gtk.VBox() volbox.pack_start(ui.label(text="+"), False, False, 0) self.volumescale = gtk.VScale() self.volumescale.set_draw_value(True) self.volumescale.set_value_pos(gtk.POS_TOP) self.volumescale.set_digits(0) self.volumescale.set_update_policy(gtk.UPDATE_CONTINUOUS) self.volumescale.set_inverted(True) self.volumescale.set_adjustment(gtk.Adjustment(0, 0, 100, 0, 0, 0)) if HAVE_SUGAR: self.volumescale.set_size_request(-1, 203) else: self.volumescale.set_size_request(-1, 103) volbox.pack_start(self.volumescale, True, True, 0) volbox.pack_start(ui.label(text="-"), False, False, 0) frame.add(volbox) ui.show(frame) # Fullscreen cover art window self.fullscreencoverart = gtk.Window() self.fullscreencoverart.set_title(_("Cover Art")) self.fullscreencoverart.set_decorated(True) self.fullscreencoverart.fullscreen() style = self.fullscreencoverart.get_style().copy() style.bg[gtk.STATE_NORMAL] = self.fullscreencoverart.get_colormap().alloc_color("black") style.bg_pixmap[gtk.STATE_NORMAL] = None self.fullscreencoverart.set_style(style) self.fullscreencoverart.add_accel_group(self.UIManager.get_accel_group()) fscavbox = gtk.VBox() fscahbox = gtk.HBox() self.fullscreenalbumimage = self.artwork.get_fullscreenalbumimage() fscalbl, fscalbl2 = self.artwork.get_fullscreenalbumlabels() fscahbox.pack_start(self.fullscreenalbumimage, True, False, 0) fscavbox.pack_start(ui.label(), True, False, 0) fscavbox.pack_start(fscahbox, False, False, 0) fscavbox.pack_start(fscalbl, False, False, 5) fscavbox.pack_start(fscalbl2, False, False, 5) fscavbox.pack_start(ui.label(), True, False, 0) if not self.config.show_covers: ui.hide(self.fullscreenalbumimage) self.fullscreencoverart.add(fscavbox) # Connect to signals self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK) self.traytips.add_events(gtk.gdk.BUTTON_PRESS_MASK) self.traytips.connect('button_press_event', self.on_traytips_press) self.window.connect('delete_event', self.on_delete_event) self.window.connect('window_state_event', self.on_window_state_change) self.window.connect('configure_event', self.on_window_configure) self.window.connect('key-press-event', self.on_topwindow_keypress) self.window.connect('focus-out-event', self.on_window_lost_focus) self.imageeventbox.connect('button_press_event', self.on_image_activate) self.imageeventbox.connect('drag_motion', self.on_image_motion_cb) self.imageeventbox.connect('drag_data_received', self.on_image_drop_cb) self.ppbutton.connect('clicked', self.mpd_pp) self.stopbutton.connect('clicked', self.mpd_stop) self.prevbutton.connect('clicked', self.mpd_prev) self.nextbutton.connect('clicked', self.mpd_next) self.progresseventbox.connect('button_press_event', self.on_progressbar_press) self.progresseventbox.connect('scroll_event', self.on_progressbar_scroll) self.volumebutton.connect('clicked', self.on_volumebutton_clicked) self.volumebutton.connect('scroll-event', self.on_volumebutton_scroll) self.expander.connect('activate', self.on_expander_activate) self.randommenu.connect('toggled', self.on_random_clicked) self.repeatmenu.connect('toggled', self.on_repeat_clicked) self.volumescale.connect('change_value', self.on_volumescale_change) self.volumescale.connect('scroll-event', self.on_volumescale_scroll) self.cursonglabel1.connect('notify::label', self.on_currsong_notify) self.progressbar.connect('notify::fraction', self.on_progressbar_notify_fraction) self.progressbar.connect('notify::text', self.on_progressbar_notify_text) self.mainwinhandler = self.window.connect('button_press_event', self.on_window_click) self.notebook.connect('button_press_event', self.on_notebook_click) self.notebook.connect('size-allocate', self.on_notebook_resize) self.notebook.connect('switch-page', self.on_notebook_page_change) self.fullscreencoverart.add_events(gtk.gdk.BUTTON_PRESS_MASK) self.fullscreencoverart.connect("button-press-event", self.fullscreen_cover_art_close, False) self.fullscreencoverart.connect("key-press-event", self.fullscreen_cover_art_close, True) for treeview in [self.current_treeview, self.library_treeview, self.playlists_treeview, self.streams_treeview]: treeview.connect('popup_menu', self.on_menu_popup) for treeviewsel in [self.current_selection, self.library_selection, self.playlists_selection, self.streams_selection]: treeviewsel.connect('changed', self.on_treeview_selection_changed) for widget in [self.ppbutton, self.prevbutton, self.stopbutton, self.nextbutton, self.progresseventbox, self.expander, self.volumebutton]: widget.connect('button_press_event', self.menu_popup) self.systemtray_initialize() # This will ensure that "Not connected" is shown in the systray tooltip if not self.conn: self.update_cursong() # Ensure that the systemtray icon is added here. This is really only # important if we're starting in hidden (minimized-to-tray) mode: if self.window_owner and self.config.withdrawn: while gtk.events_pending(): gtk.main_iteration() dbus.init_gnome_mediakeys(self.mpd_pp, self.mpd_stop, self.mpd_prev, self.mpd_next) # Try to connect to mmkeys signals, if no dbus and gnome 2.18+ if not dbus.using_gnome_mediakeys(): try: import mmkeys # this must be an attribute to keep it around: self.keys = mmkeys.MmKeys() self.keys.connect("mm_prev", self.mpd_prev) self.keys.connect("mm_next", self.mpd_next) self.keys.connect("mm_playpause", self.mpd_pp) self.keys.connect("mm_stop", self.mpd_stop) except ImportError: pass # Set up current view self.currentdata = self.current.get_model() # Initialize playlist data and widget self.playlistsdata = self.playlists.get_model() # Initialize streams data and widget self.streamsdata = self.streams.get_model() # Initialize library data and widget self.librarydata = self.library.get_model() self.artwork.library_artwork_init(self.librarydata, consts.LIB_COVER_SIZE) if self.window_owner: icon = self.window.render_icon('sonata', gtk.ICON_SIZE_DIALOG) self.window.set_icon(icon) self.streams.populate() self.iterate_now() if self.window_owner: if self.config.withdrawn: if (HAVE_EGG and self.trayicon.get_property('visible')) or (HAVE_STATUS_ICON and self.statusicon.is_embedded() and self.statusicon.get_visible()): ui.hide(self.window) self.window.show_all() # Ensure that button images are displayed despite GTK+ theme self.window.get_settings().set_property("gtk-button-images", True) if self.config.update_on_start: self.on_updatedb(None) self.notebook.set_no_show_all(False) self.window.set_no_show_all(False) if show_prefs: self.on_prefs(None) self.config.initial_run = False # Ensure that sonata is loaded before we display the notif window self.sonata_loaded = True self.on_currsong_notify() self.current.center_song_in_list() if HAVE_STATUS_ICON: gobject.timeout_add(250, self.iterate_status_icon) gc.disable() gobject.idle_add(self.header_save_column_widths) pluginsystem.notify_of('tabs', self.on_enable_tab, self.on_disable_tab) def on_enable_tab(self, plugin, tab): self.new_tab(*tab()) def on_disable_tab(self, plugin, tab): self.notebook.remove(self.tabname2tab[tab()[2]]) def new_tab(self, page, stock, text, focus): # create the "ear" of the tab: hbox = gtk.HBox() hbox.pack_start(ui.image(stock=stock), False, False, 2) hbox.pack_start(ui.label(text=text), False, False, 2) evbox = ui.eventbox(add=hbox) evbox.show_all() evbox.connect("button_press_event", self.on_tab_click) # create the actual tab: self.notebook.append_page(page, evbox) if (text in self.tabname2id and not getattr(self.config, self.tabname2id[text]+'_tab_visible')): ui.hide(page) self.notebook.set_tab_reorderable(page, True) if self.config.tabs_expanded: self.notebook.set_tab_label_packing(page, True, True, gtk.PACK_START) self.tabname2tab[text] = page self.tabname2focus[text] = focus return page def get_playing_song(self): if self.status and self.status['state'] in ['play', 'pause'] and self.songinfo: return self.songinfo return None def playing_song_change(self): self.artwork.artwork_update() for _plugin, cb in pluginsystem.get('playing_song_observers'): cb(self.get_playing_song()) def gnome_session_management(self): try: import gnome, gnome.ui # Code thanks to quodlibet: # XXX gnome.init sets process name, locale... gnome.init("sonata", version.VERSION) misc.setlocale() client = gnome.ui.master_client() client.set_restart_style(gnome.ui.RESTART_IF_RUNNING) command = os.path.normpath(os.path.join(os.getcwd(), sys.argv[0])) try: client.set_restart_command([command] + sys.argv[1:]) except TypeError: # Fedora systems have a broken gnome-python wrapper for this function. # http://www.sacredchao.net/quodlibet/ticket/591 # http://trac.gajim.org/ticket/929 client.set_restart_command(len(sys.argv), [command] + sys.argv[1:]) client.connect('die', gtk.main_quit) except: pass def populate_profiles_for_menu(self): host, port, _password = misc.mpd_env_vars() if self.merge_id: self.UIManager.remove_ui(self.merge_id) if self.actionGroupProfiles: self.UIManager.remove_action_group(self.actionGroupProfiles) self.actionGroupProfiles = gtk.ActionGroup('MPDProfiles') self.UIManager.ensure_update() profile_names = [_("MPD_HOST/PORT")] if host or port else self.config.profile_names actions = [(str(i), None, "[%s] %s" % (i+1, name.replace("_", "__")), None, None, i) for i, name in enumerate(profile_names)] actions.append(('disconnect', None, _('Disconnect'), None, None, len(self.config.profile_names))) active_radio = 0 if host or port else self.config.profile_num if not self.conn: active_radio = len(self.config.profile_names) self.actionGroupProfiles.add_radio_actions(actions, active_radio, self.on_profiles_click) uiDescription = """ <ui> <popup name="mainmenu"> <menu action="profilesmenu"> """ uiDescription += "".join( '<menuitem action=\"%s\" position="top"/>' % action[0] for action in reversed(actions)) uiDescription += """</menu></popup></ui>""" self.merge_id = self.UIManager.add_ui_from_string(uiDescription) self.UIManager.insert_action_group(self.actionGroupProfiles, 0) self.UIManager.get_widget('/hidden').set_property('visible', False) def on_profiles_click(self, _radioaction, profile): if self.skip_on_profiles_click: return if profile.get_name() == 'disconnect': self.on_disconnectkey_pressed(None) else: # Clear sonata before we try to connect: self.mpd_disconnect() self.iterate_now() # Now connect to new profile: self.config.profile_num = profile.get_current_value() self.on_connectkey_pressed(None) def mpd_connect(self, blocking=False, force=False): if blocking: self._mpd_connect(blocking, force) else: thread = threading.Thread(target=self._mpd_connect, args=(blocking, force)) thread.setDaemon(True) thread.start() def _mpd_connect(self, _blocking, force): if self.trying_connection: return self.trying_connection = True if self.user_connect or force: mpdh.call(self.client, 'disconnect') host, port, password = misc.mpd_env_vars() if not host: host = self.config.host[self.config.profile_num] if not port: port = self.config.port[self.config.profile_num] if not password: password = self.config.password[self.config.profile_num] mpdh.call(self.client, 'connect', host, port) if len(password) > 0: mpdh.call(self.client, 'password', password) test = mpdh.status(self.client) if test: self.conn = True else: self.conn = False else: self.conn = False if not self.conn: self.status = None self.songinfo = None if self.artwork is not None: self.artwork.update_songinfo(self.songinfo) self.iterate_time = self.iterate_time_when_disconnected_or_stopped self.trying_connection = False def mpd_disconnect(self): if self.conn: mpdh.call(self.client, 'close') mpdh.call(self.client, 'disconnect') self.conn = False def on_connectkey_pressed(self, _event=None): self.user_connect = True # Update selected radio button in menu: self.skip_on_profiles_click = True host, port, _password = misc.mpd_env_vars() index = str(0 if host or port else self.config.profile_num) self.actionGroupProfiles.get_action(index).activate() self.skip_on_profiles_click = False # Connect: self.mpd_connect(force=True) self.iterate_now() def on_disconnectkey_pressed(self, _event): self.user_connect = False # Update selected radio button in menu: self.skip_on_profiles_click = True self.actionGroupProfiles.get_action('disconnect').activate() self.skip_on_profiles_click = False # Disconnect: self.mpd_disconnect() def update_status(self): try: if not self.conn: self.mpd_connect() if self.conn: self.iterate_time = self.iterate_time_when_connected self.status = mpdh.status(self.client) if self.status: if self.status['state'] == 'stop': self.iterate_time = self.iterate_time_when_disconnected_or_stopped self.songinfo = mpdh.currsong(self.client) self.artwork.update_songinfo(self.songinfo) if not self.last_repeat or self.last_repeat != self.status['repeat']: self.repeatmenu.set_active(self.status['repeat'] == '1') if not self.last_random or self.last_random != self.status['random']: self.randommenu.set_active(self.status['random'] == '1') if self.status['xfade'] == '0': self.config.xfade_enabled = False else: self.config.xfade_enabled = True self.config.xfade = int(self.status['xfade']) if self.config.xfade > 30: self.config.xfade = 30 self.last_repeat = self.status['repeat'] self.last_random = self.status['random'] return except: pass self.prevconn = self.client self.prevstatus = self.status self.prevsonginfo = self.songinfo self.conn = False self.status = None self.songinfo = None self.artwork.update_songinfo(self.songinfo) def iterate(self): self.update_status() self.info_update(False) if self.conn != self.prevconn: self.handle_change_conn() if self.status != self.prevstatus: self.handle_change_status() if self.config.as_enabled: # We update this here because self.handle_change_status() won't be # called while the client is paused. self.scrobbler.iterate() if self.songinfo != self.prevsonginfo: self.handle_change_song() self.prevconn = self.conn self.prevstatus = self.status self.prevsonginfo = self.songinfo self.iterate_handler = gobject.timeout_add(self.iterate_time, self.iterate) # Repeat ad infitum.. if self.config.show_trayicon: if HAVE_STATUS_ICON: if self.statusicon.is_embedded() and not self.statusicon.get_visible(): # Systemtray appears, add icon: self.systemtray_initialize() elif not self.statusicon.is_embedded() and self.config.withdrawn: # Systemtray gone, unwithdraw app: self.withdraw_app_undo() elif HAVE_EGG: if not self.trayicon.get_property('visible'): # Systemtray appears, add icon: self.systemtray_initialize() if self.call_gc_collect: gc.collect() self.call_gc_collect = False def schedule_gc_collect(self): self.call_gc_collect = True def iterate_stop(self): try: gobject.source_remove(self.iterate_handler) except: pass def iterate_now(self): # Since self.iterate_time_when_connected has been # slowed down to 500ms, we'll call self.iterate_now() # whenever the user performs an action that requires # updating the client self.iterate_stop() self.iterate() def iterate_status_icon(self): # Polls for the users' cursor position to display the custom tooltip window when over the # gtk.StatusIcon. We use this instead of self.iterate() in order to poll more often and # increase responsiveness. if self.config.show_trayicon: if self.statusicon.is_embedded() and self.statusicon.get_visible(): self.tooltip_show_manually() gobject.timeout_add(250, self.iterate_status_icon) def on_topwindow_keypress(self, _widget, event): shortcut = gtk.accelerator_name(event.keyval, event.state) shortcut = shortcut.replace("<Mod2>", "") # These shortcuts were moved here so that they don't interfere with searching the library if shortcut == 'BackSpace' and self.current_tab == self.TAB_LIBRARY: return self.library.library_browse_parent(None) elif shortcut == 'Escape': if self.volumewindow.get_property('visible'): self.volume_hide() elif self.current_tab == self.TAB_LIBRARY and self.library.search_visible(): self.library.on_search_end(None) elif self.current_tab == self.TAB_CURRENT and self.current.filterbox_visible: self.current.searchfilter_toggle(None) elif self.config.minimize_to_systray: if HAVE_STATUS_ICON and self.statusicon.is_embedded() and self.statusicon.get_visible(): self.withdraw_app() elif HAVE_EGG and self.trayicon.get_property('visible'): self.withdraw_app() return elif shortcut == 'Delete': self.on_remove(None) elif self.volumewindow.get_property('visible') and (shortcut == 'Up' or shortcut == 'Down'): if shortcut == 'Up': self.on_volume_raise(None) else: self.on_volume_lower(None) return True if self.current_tab == self.TAB_CURRENT: if event.state & (gtk.gdk.CONTROL_MASK | gtk.gdk.MOD1_MASK): return # XXX this isn't the right thing with GTK input methods: text = unichr(gtk.gdk.keyval_to_unicode(event.keyval)) # We only want to toggle open the filterbar if the key press is actual text! This # will ensure that we skip, e.g., F5, Alt, Ctrl, ... if text != u"\x00" and text.strip(): if not self.current.filterbox_visible: if text != u"/": self.current.searchfilter_toggle(None, text) else: self.current.searchfilter_toggle(None) def settings_load(self): self.config.settings_load_real(library.library_set_data) def settings_save(self): self.header_save_column_widths() self.config.current_tab_pos = self.notebook_get_tab_num(self.notebook, self.TAB_CURRENT) self.config.library_tab_pos = self.notebook_get_tab_num(self.notebook, self.TAB_LIBRARY) self.config.playlists_tab_pos = self.notebook_get_tab_num(self.notebook, self.TAB_PLAYLISTS) self.config.streams_tab_pos = self.notebook_get_tab_num(self.notebook, self.TAB_STREAMS) self.config.info_tab_pos = self.notebook_get_tab_num(self.notebook, self.TAB_INFO) self.config.settings_save_real(library.library_get_data) def handle_change_conn(self): if not self.conn: for mediabutton in (self.ppbutton, self.stopbutton, self.prevbutton, self.nextbutton, self.volumebutton): mediabutton.set_property('sensitive', False) self.currentdata.clear() if self.current_treeview.get_model(): self.current_treeview.get_model().clear() if HAVE_STATUS_ICON: self.statusicon.set_from_file(self.find_path('sonata_disconnect.png')) elif HAVE_EGG and self.eggtrayheight: self.eggtrayfile = self.find_path('sonata_disconnect.png') self.trayimage.set_from_pixbuf(img.get_pixbuf_of_size(gtk.gdk.pixbuf_new_from_file(self.eggtrayfile), self.eggtrayheight)[0]) self.info_update(True) if self.current.filterbox_visible: gobject.idle_add(self.current.searchfilter_toggle, None) if self.library.search_visible(): self.library.on_search_end(None) self.handle_change_song() self.handle_change_status() else: for mediabutton in (self.ppbutton, self.stopbutton, self.prevbutton, self.nextbutton, self.volumebutton): mediabutton.set_property('sensitive', True) if self.sonata_loaded: self.library.library_browse(library.library_set_data(path="/")) self.playlists.populate() self.streams.populate() self.on_notebook_page_change(self.notebook, 0, self.notebook.get_current_page()) def _parse_formatting_return_substrings(self, format): """Split format along the { and } characters. For example: %A{-%T} {%L} -> ['%A', '{-%T} ', '{%L}']""" substrings = [] end = format while len(end) > 0: begin, sep1, end = end.partition('{') substrings.append(begin) if len(end) == 0: substrings.append(sep1) break begin, sep2, end = end.partition('}') substrings.append(sep1 + begin + sep2) return substrings def parse_formatting_colnames(self, format): text = format.split("|") for i in range(len(text)): text[i] = text[i].replace("%A", _("Artist")) text[i] = text[i].replace("%B", _("Album")) text[i] = text[i].replace("%T", _("Track")) text[i] = text[i].replace("%N", _("#")) text[i] = text[i].replace("%Y", _("Year")) text[i] = text[i].replace("%G", _("Genre")) text[i] = text[i].replace("%P", _("Path")) text[i] = text[i].replace("%F", _("File")) text[i] = text[i].replace("%S", _("Stream")) text[i] = text[i].replace("%L", _("Len")) text[i] = text[i].replace("%D", _("#")) if text[i].count("{") == text[i].count("}"): text[i] = text[i].replace("{","").replace("}","") # If the user wants the format of, e.g., "#%N", we'll # ensure the # doesn't show up twice in a row. text[i] = text[i].replace("##", "#") return text def _parse_formatting_substrings(self, subformat, item, wintitle): text = subformat if subformat.startswith("{") and subformat.endswith("}"): has_brackets = True else: has_brackets = False flag = "89syufd8sdhf9hsdf" if "%A" in text: artist = mpdh.get(item, 'artist', flag) if artist != flag: text = text.replace("%A", artist) else: if not has_brackets: text = text.replace("%A", _('Unknown')) else: return "" if "%B" in text: album = mpdh.get(item, 'album', flag) if album != flag: text = text.replace("%B", album) else: if not has_brackets: text = text.replace("%B", _('Unknown')) else: return "" if "%T" in text: title = mpdh.get(item, 'title', flag) if title != flag: text = text.replace("%T", title) else: if not has_brackets: if len(item['file'].split('/')[-1]) == 0 or item['file'][:7] == 'http://' or item['file'][:6] == 'ftp://': # Use path and file name: text = misc.escape_html(item['file']) else: # Use file name only: text = misc.escape_html(item['file'].split('/')[-1]) if wintitle: return "[Sonata] " + text else: return text else: return "" if "%N" in text: track = mpdh.get(item, 'track', flag) if track != flag: track = mpdh.getnum(item, 'track', flag, False, 2) text = text.replace("%N", track) else: if not has_brackets: text = text.replace("%N", "00") else: return "" if "%D" in text: disc = mpdh.get(item, 'disc', flag) if disc != flag: disc = mpdh.getnum(item, 'disc', flag, False, 0) text = text.replace("%D", disc) else: if not has_brackets: text = text.replace("%D", "0") else: return "" if "%S" in text: name = mpdh.get(item, 'name', flag) if name != flag: text = text.replace("%S", name) else: if not has_brackets: text = text.replace("%S", _('Unknown')) else: return "" if "%G" in text: genre = mpdh.get(item, 'genre', flag) if genre != flag: text = text.replace("%G", genre) else: if not has_brackets: text = text.replace("%G", _('Unknown')) else: return "" if "%Y" in text: date = mpdh.get(item, 'date', flag) if date != flag: text = text.replace("%Y", date) else: if not has_brackets: text = text.replace("%Y", "?") else: return "" pathname = mpdh.get(item, 'file') try: dirname, filename = pathname.rsplit('/', 1) except ValueError: # Occurs for a file in the music_dir root dirname, filename = "", pathname if "%P" in text: text = text.replace("%P", dirname) if "%F" in text: text = text.replace("%F", filename) if "%L" in text: time = mpdh.get(item, 'time', flag) if time != flag: time = misc.convert_time(int(time)) text = text.replace("%L", time) else: if not has_brackets: text = text.replace("%L", "?") else: return "" if wintitle: if "%E" in text: try: at, length = [int(c) for c in self.status['time'].split(':')] at_time = misc.convert_time(at) text = text.replace("%E", at_time) except: if not has_brackets: text = text.replace("%E", "?") else: return "" if text.startswith("{") and text.endswith("}"): return text[1:-1] else: return text def parse_formatting(self, format, item, use_escape_html, wintitle=False): substrings = self._parse_formatting_return_substrings(format) text = "".join(self._parse_formatting_substrings(sub, item, wintitle) for sub in substrings) return misc.escape_html(text) if use_escape_html else text def info_update(self, update_all, blank_window=False, skip_lyrics=False): playing_or_paused = self.conn and self.status and self.status['state'] in ['play', 'pause'] try: newbitrate = self.status['bitrate'] + " kbps" except: newbitrate = '' self.info.info_update(playing_or_paused, newbitrate, self.songinfo, update_all, blank_window, skip_lyrics) def on_treeview_selection_changed(self, treeselection): self.update_menu_visibility() if treeselection == self.current.get_selection(): # User previously clicked inside group of selected rows, re-select # rows so it doesn't look like anything changed: if self.current.sel_rows: for row in self.current.sel_rows: treeselection.select_path(row) # Update lib artwork self.library.on_library_scrolled(None, None) def on_library_button_press(self, widget, event): if self.on_button_press(widget, event, False): return True def on_current_button_press(self, widget, event): if self.on_button_press(widget, event, True): return True def on_playlists_button_press(self, widget, event): if self.on_button_press(widget, event, False): return True def on_streams_button_press(self, widget, event): if self.on_button_press(widget, event, False): return True def on_button_press(self, widget, event, widget_is_current): ctrl_press = (event.state & gtk.gdk.CONTROL_MASK) self.volume_hide() self.current.sel_rows = None if event.button == 1 and widget_is_current and not ctrl_press: # If the user clicked inside a group of rows that were already selected, # we need to retain the selected rows in case the user wants to DND the # group of rows. If they release the mouse without first moving it, # then we revert to the single selected row. This is similar to the # behavior found in thunar. try: path, col, x, y = widget.get_path_at_pos(int(event.x), int(event.y)) if widget.get_selection().path_is_selected(path): self.current.sel_rows = widget.get_selection().get_selected_rows()[1] except: pass elif event.button == 3: self.update_menu_visibility() # Calling the popup in idle_add is important. It allows the menu items # to have been shown/hidden before the menu is popped up. Otherwise, if # the menu pops up too quickly, it can result in automatically clicking # menu items for the user! gobject.idle_add(self.mainmenu.popup, None, None, None, event.button, event.time) # Don't change the selection for a right-click. This # will allow the user to select multiple rows and then # right-click (instead of right-clicking and having # the current selection change to the current row) if widget.get_selection().count_selected_rows() > 1: return True def on_add_item_play(self, widget): self.on_add_item(widget, True) def on_add_item(self, _widget, play_after=False): if self.conn: if play_after and self.status: playid = self.status['playlistlength'] if self.current_tab == self.TAB_LIBRARY: items = self.library.get_path_child_filenames(True) mpdh.call(self.client, 'command_list_ok_begin') for item in items: mpdh.call(self.client, 'add', item) mpdh.call(self.client, 'command_list_end') elif self.current_tab == self.TAB_PLAYLISTS: model, selected = self.playlists_selection.get_selected_rows() for path in selected: mpdh.call(self.client, 'load', misc.unescape_html(model.get_value(model.get_iter(path), 1))) elif self.current_tab == self.TAB_STREAMS: model, selected = self.streams_selection.get_selected_rows() for path in selected: item = model.get_value(model.get_iter(path), 2) self.stream_parse_and_add(item) self.iterate_now() if play_after: if self.status['random'] == '1': # If we are in random mode, we want to play a random song # instead: mpdh.call(self.client, 'play') else: mpdh.call(self.client, 'play', int(playid)) def stream_parse_and_add(self, item): # We need to do different things depending on if this is # a normal stream, pls, m3u, etc.. # Note that we will only download the first 4000 bytes while gtk.events_pending(): gtk.main_iteration() f = None try: request = urllib2.Request(item) opener = urllib2.build_opener() f = opener.open(request).read(4000) except: try: request = urllib2.Request("http://" + item) opener = urllib2.build_opener() f = opener.open(request).read(4000) except: try: request = urllib2.Request("file://" + item) opener = urllib2.build_opener() f = opener.open(request).read(4000) except: pass while gtk.events_pending(): gtk.main_iteration() if f: if misc.is_binary(f): # Binary file, just add it: mpdh.call(self.client, 'add', item) else: if "[playlist]" in f: # pls: self.stream_parse_pls(f) elif "#EXTM3U" in f: # extended m3u: self.stream_parse_m3u(f) elif "http://" in f: # m3u or generic list: self.stream_parse_m3u(f) else: # Something else.. mpdh.call(self.client, 'add', item) else: # Hopefully just a regular stream, try to add it: mpdh.call(self.client, 'add', item) def stream_parse_pls(self, f): lines = f.split("\n") for line in lines: line = line.replace('\r','') delim = line.find("=")+1 if delim > 0: line = line[delim:] if len(line) > 7 and line[0:7] == 'http://': mpdh.call(self.client, 'add', line) elif len(line) > 6 and line[0:6] == 'ftp://': mpdh.call(self.client, 'add', line) def stream_parse_m3u(self, f): lines = f.split("\n") for line in lines: line = line.replace('\r','') if len(line) > 7 and line[0:7] == 'http://': mpdh.call(self.client, 'add', line) elif len(line) > 6 and line[0:6] == 'ftp://': mpdh.call(self.client, 'add', line) def on_replace_item_play(self, widget): self.on_replace_item(widget, True) def on_replace_item(self, widget, play_after=False): if self.status and self.status['state'] == 'play': play_after = True # Only clear if an item is selected: if self.current_tab == self.TAB_LIBRARY: num_selected = self.library_selection.count_selected_rows() elif self.current_tab == self.TAB_PLAYLISTS: num_selected = self.playlists_selection.count_selected_rows() elif self.current_tab == self.TAB_STREAMS: num_selected = self.streams_selection.count_selected_rows() else: return if num_selected == 0: return self.mpd_clear(None) self.on_add_item(widget, play_after) self.iterate_now() def menu_position(self, _menu): if self.config.expanded: x, y, width, height = self.current_treeview.get_allocation() # Find first selected visible row and popup the menu # from there if self.current_tab == self.TAB_CURRENT: widget = self.current_treeview column = self.current.columns[0] elif self.current_tab == self.TAB_LIBRARY: widget = self.library_treeview column = self.library.librarycolumn elif self.current_tab == self.TAB_PLAYLISTS: widget = self.playlists_treeview column = self.playlists.playlistscolumn elif self.current_tab == self.TAB_STREAMS: widget = self.streams_treeview column = self.streams.streamscolumn rows = widget.get_selection().get_selected_rows()[1] visible_rect = widget.get_visible_rect() row_y = 0 for row in rows: row_rect = widget.get_background_area(row, column) if row_rect.y + row_rect.height <= visible_rect.height and row_rect.y >= 0: row_y = row_rect.y + 30 break return (self.config.x + width - 150, self.config.y + y + row_y, True) else: return (self.config.x + 250, self.config.y + 80, True) def handle_change_status(self): # Called when one of the following items are changed: # 1. Current playlist (song added, removed, etc) # 2. Repeat/random/xfade/volume # 3. Currently selected song in playlist # 4. Status (playing/paused/stopped) if self.status == None: # clean up and bail out self.update_progressbar() self.update_cursong() self.update_wintitle() self.playing_song_change() self.update_statusbar() if not self.conn: self.librarydata.clear() self.playlistsdata.clear() self.streamsdata.clear() return # Display current playlist if self.prevstatus == None or self.prevstatus['playlist'] != self.status['playlist']: prevstatus_playlist = None if self.prevstatus: prevstatus_playlist = self.prevstatus['playlist'] self.current.current_update(prevstatus_playlist, self.status['playlistlength']) # Update progress frequently if we're playing if self.status['state'] in ['play', 'pause']: self.update_progressbar() # If elapsed time is shown in the window title, we need to update more often: if "%E" in self.config.titleformat: self.update_wintitle() # If state changes if self.prevstatus == None or self.prevstatus['state'] != self.status['state']: self.album_get_artist() # Update progressbar if the state changes too self.update_progressbar() self.update_cursong() self.update_wintitle() self.info_update(True) if self.status['state'] == 'stop': self.ppbutton.set_image(ui.image(stock=gtk.STOCK_MEDIA_PLAY, stocksize=gtk.ICON_SIZE_BUTTON)) self.ppbutton.get_child().get_child().get_children()[1].set_text('') self.UIManager.get_widget('/traymenu/playmenu').show() self.UIManager.get_widget('/traymenu/pausemenu').hide() if HAVE_STATUS_ICON: self.statusicon.set_from_file(self.find_path('sonata.png')) elif HAVE_EGG and self.eggtrayheight: self.eggtrayfile = self.find_path('sonata.png') self.trayimage.set_from_pixbuf(img.get_pixbuf_of_size(gtk.gdk.pixbuf_new_from_file(self.eggtrayfile), self.eggtrayheight)[0]) elif self.status['state'] == 'pause': self.ppbutton.set_image(ui.image(stock=gtk.STOCK_MEDIA_PLAY, stocksize=gtk.ICON_SIZE_BUTTON)) self.ppbutton.get_child().get_child().get_children()[1].set_text('') self.UIManager.get_widget('/traymenu/playmenu').show() self.UIManager.get_widget('/traymenu/pausemenu').hide() if HAVE_STATUS_ICON: self.statusicon.set_from_file(self.find_path('sonata_pause.png')) elif HAVE_EGG and self.eggtrayheight: self.eggtrayfile = self.find_path('sonata_pause.png') self.trayimage.set_from_pixbuf(img.get_pixbuf_of_size(gtk.gdk.pixbuf_new_from_file(self.eggtrayfile), self.eggtrayheight)[0]) elif self.status['state'] == 'play': self.ppbutton.set_image(ui.image(stock=gtk.STOCK_MEDIA_PAUSE, stocksize=gtk.ICON_SIZE_BUTTON)) self.ppbutton.get_child().get_child().get_children()[1].set_text('') self.UIManager.get_widget('/traymenu/playmenu').hide() self.UIManager.get_widget('/traymenu/pausemenu').show() if self.prevstatus != None: if self.prevstatus['state'] == 'pause': # Forces the notification to popup if specified self.on_currsong_notify() if HAVE_STATUS_ICON: self.statusicon.set_from_file(self.find_path('sonata_play.png')) elif HAVE_EGG and self.eggtrayheight: self.eggtrayfile = self.find_path('sonata_play.png') self.trayimage.set_from_pixbuf(img.get_pixbuf_of_size(gtk.gdk.pixbuf_new_from_file(self.eggtrayfile), self.eggtrayheight)[0]) self.playing_song_change() if self.status['state'] in ['play', 'pause']: self.current.center_song_in_list() if self.prevstatus is None or self.status['volume'] != self.prevstatus['volume']: try: self.volumescale.get_adjustment().set_value(int(self.status['volume'])) if int(self.status['volume']) == 0: self.volume_set_image("stock_volume-mute") elif int(self.status['volume']) < 30: self.volume_set_image("stock_volume-min") elif int(self.status['volume']) <= 70: self.volume_set_image("stock_volume-med") else: self.volume_set_image("stock_volume-max") self.volumebutton.set_tooltip_text(self.status['volume'] + "%") except: pass if self.conn: if mpdh.mpd_is_updating(self.status): # MPD library is being updated self.update_statusbar(True) elif self.prevstatus == None or mpdh.mpd_is_updating(self.prevstatus) != mpdh.mpd_is_updating(self.status): if not mpdh.mpd_is_updating(self.status): # Done updating, refresh interface self.mpd_updated_db() elif self.mpd_update_queued: # If the update happens too quickly, we won't catch it in # our polling. So let's force an update of the interface: self.mpd_updated_db() self.mpd_update_queued = False if self.config.as_enabled: playing = self.status and self.status['state'] == 'play' stopped = self.status and self.status['state'] == 'stop' if playing: mpd_time_now = self.status['time'] switched_from_stop_to_play = not self.prevstatus or (self.prevstatus and self.prevstatus['state'] == 'stop') self.scrobbler.handle_change_status(True, self.prevsonginfo, self.songinfo, switched_from_stop_to_play, mpd_time_now) elif stopped: self.scrobbler.handle_change_status(False, self.prevsonginfo) def mpd_updated_db(self): self.library.view_caches_reset() self.update_statusbar(False) # We need to make sure that we update the artist in case tags have changed: self.album_reset_artist() self.album_get_artist() # Now update the library and playlist tabs if self.library.search_visible(): self.library.on_library_search_combo_change() else: self.library.library_browse(root=self.config.wd) self.playlists.populate() # Update info if it's visible: self.info_update(True) return False def album_get_artist(self): if self.songinfo and 'album' in self.songinfo: self.album_return_artist_name() elif self.songinfo and 'artist' in self.songinfo: self.album_current_artist = [self.songinfo, mpdh.get(self.songinfo, 'artist')] else: self.album_current_artist = [self.songinfo, ""] def volume_set_image(self, stock_icon): image = ui.image(stock=stock_icon, stocksize=VOLUME_ICON_SIZE) self.volumebutton.set_image(image) def handle_change_song(self): # Called when one of the following items are changed for the current # mpd song in the playlist: # 1. Song tags or filename (e.g. if tags are edited) # 2. Position in playlist (e.g. if playlist is sorted) # Note that the song does not have to be playing; it can reflect the # next song that will be played. self.current.unbold_boldrow(self.current.prev_boldrow) if self.status and 'song' in self.status: row = int(self.status['song']) self.current.boldrow(row) if self.songinfo: if not self.prevsonginfo or mpdh.get(self.songinfo, 'file') != mpdh.get(self.prevsonginfo, 'file'): self.current.center_song_in_list() self.current.prev_boldrow = row self.album_get_artist() self.update_cursong() self.update_wintitle() self.playing_song_change() self.info_update(True) def update_progressbar(self): if self.conn and self.status and self.status['state'] in ['play', 'pause']: at, length = [float(c) for c in self.status['time'].split(':')] try: newfrac = at/length except: newfrac = 0 else: newfrac = 0 if not self.last_progress_frac or self.last_progress_frac != newfrac: if newfrac >= 0 and newfrac <= 1: self.progressbar.set_fraction(newfrac) if self.conn: if self.status and self.status['state'] in ['play', 'pause']: at, length = [int(c) for c in self.status['time'].split(':')] at_time = misc.convert_time(at) try: time = misc.convert_time(int(mpdh.get(self.songinfo, 'time'))) newtime = at_time + " / " + time except: newtime = at_time elif self.status: newtime = ' ' else: newtime = _('No Read Permission') else: newtime = _('Not Connected') if not self.last_progress_text or self.last_progress_text != newtime: self.progressbar.set_text(newtime) def update_statusbar(self, updatingdb=False): if self.config.show_statusbar: if self.conn and self.status: try: days = None hours = None mins = None total_time = misc.convert_time(self.current.total_time) try: mins = total_time.split(":")[-2] hours = total_time.split(":")[-3] if int(hours) >= 24: days = str(int(hours)/24) hours = str(int(hours) - int(days)*24).zfill(2) except: pass if days: days_text = gettext.ngettext('day', 'days', int(days)) if mins: if mins.startswith('0') and len(mins) > 1: mins = mins[1:] mins_text = gettext.ngettext('minute', 'minutes', int(mins)) if hours: if hours.startswith('0'): hours = hours[1:] hours_text = gettext.ngettext('hour', 'hours', int(hours)) # Show text: songs_text = gettext.ngettext('song', 'songs', int(self.status['playlistlength'])) if int(self.status['playlistlength']) > 0: if days: status_text = str(self.status['playlistlength']) + ' ' + songs_text + ' ' + days + ' ' + days_text + ', ' + hours + ' ' + hours_text + ', ' + _('and') + ' ' + mins + ' ' + mins_text elif hours: status_text = str(self.status['playlistlength']) + ' ' + songs_text + ' ' + hours + ' ' + hours_text + ' ' + _('and') + ' ' + mins + ' ' + mins_text elif mins: status_text = str(self.status['playlistlength']) + ' ' + songs_text + ' ' + mins + ' ' + mins_text else: status_text = "" else: status_text = "" if updatingdb: status_text = status_text + " " + _("(updating mpd)") except: status_text = "" else: status_text = "" if status_text != self.last_status_text: self.statusbar.push(self.statusbar.get_context_id(""), status_text) self.last_status_text = status_text def expander_ellipse_workaround(self): # Hacky workaround to ellipsize the expander - see # http://bugzilla.gnome.org/show_bug.cgi?id=406528 cursonglabelwidth = self.expander.get_allocation().width - 15 if cursonglabelwidth > 0: self.cursonglabel1.set_size_request(cursonglabelwidth, -1) self.cursonglabel1.set_size_request(cursonglabelwidth, -1) def get_current_song_text(self): return self.cursonglabel1.get_text(), self.cursonglabel2.get_text() def update_cursong(self): if self.conn and self.status and self.status['state'] in ['play', 'pause']: # We must show the trayprogressbar and trayalbumeventbox # before changing self.cursonglabel (and consequently calling # self.on_currsong_notify()) in order to ensure that the notification # popup will have the correct height when being displayed for # the first time after a stopped state. if self.config.show_progress: self.trayprogressbar.show() self.traycursonglabel2.show() if self.config.show_covers: self.trayalbumeventbox.show() self.trayalbumimage2.show() for label in (self.cursonglabel1, self.cursonglabel2, self.traycursonglabel1, self.traycursonglabel2): label.set_ellipsize(pango.ELLIPSIZE_END) self.expander_ellipse_workaround() if len(self.config.currsongformat1) > 0: newlabel1 = '<big><b>' + self.parse_formatting(self.config.currsongformat1, self.songinfo, True) + ' </b></big>' else: newlabel1 = '<big><b> </b></big>' if len(self.config.currsongformat2) > 0: newlabel2 = '<small>' + self.parse_formatting(self.config.currsongformat2, self.songinfo, True) + ' </small>' else: newlabel2 = '<small> </small>' if newlabel1 != self.cursonglabel1.get_label(): self.cursonglabel1.set_markup(newlabel1) if newlabel2 != self.cursonglabel2.get_label(): self.cursonglabel2.set_markup(newlabel2) if newlabel1 != self.traycursonglabel1.get_label(): self.traycursonglabel1.set_markup(newlabel1) if newlabel2 != self.traycursonglabel2.get_label(): self.traycursonglabel2.set_markup(newlabel2) self.expander.set_tooltip_text(self.cursonglabel1.get_text() + "\n" + self.cursonglabel2.get_text()) else: for label in (self.cursonglabel1, self.cursonglabel2, self.traycursonglabel1, self.cursonglabel2): label.set_ellipsize(pango.ELLIPSIZE_NONE) self.cursonglabel1.set_markup('<big><b>' + _('Stopped') + '</b></big>') if self.config.expanded: self.cursonglabel2.set_markup('<small>' + _('Click to collapse') + '</small>') else: self.cursonglabel2.set_markup('<small>' + _('Click to expand') + '</small>') self.expander.set_tooltip_text(self.cursonglabel1.get_text()) if not self.conn: self.traycursonglabel1.set_label(_('Not Connected')) elif not self.status: self.traycursonglabel1.set_label(_('No Read Permission')) else: self.traycursonglabel1.set_label(_('Stopped')) self.trayprogressbar.hide() self.trayalbumeventbox.hide() self.trayalbumimage2.hide() self.traycursonglabel2.hide() self.update_infofile() def update_wintitle(self): if self.window_owner: if self.conn and self.status and self.status['state'] in ['play', 'pause']: newtitle = self.parse_formatting(self.config.titleformat, self.songinfo, False, True) else: newtitle = '[Sonata]' if not self.last_title or self.last_title != newtitle: self.window.set_property('title', newtitle) self.last_title = newtitle def set_allow_art_search(self): self.allow_art_search = True def status_is_play_or_pause(self): return self.conn and self.status and self.status['state'] in ['play', 'pause'] def connected(self): return self.conn def tooltip_set_window_width(self): screen = self.window.get_screen() pointer_screen, px, py, _ = screen.get_display().get_pointer() monitor_num = screen.get_monitor_at_point(px, py) monitor = screen.get_monitor_geometry(monitor_num) self.notification_width = int(monitor.width * 0.30) if self.notification_width > consts.NOTIFICATION_WIDTH_MAX: self.notification_width = consts.NOTIFICATION_WIDTH_MAX elif self.notification_width < consts.NOTIFICATION_WIDTH_MIN: self.notification_width = consts.NOTIFICATION_WIDTH_MIN def on_currsong_notify(self, _foo=None, _bar=None, force_popup=False): if self.fullscreencoverart.get_property('visible'): return if self.sonata_loaded: if self.conn and self.status and self.status['state'] in ['play', 'pause']: if self.config.show_covers: self.traytips.set_size_request(self.notification_width, -1) else: self.traytips.set_size_request(self.notification_width-100, -1) else: self.traytips.set_size_request(-1, -1) if self.config.show_notification or force_popup: try: gobject.source_remove(self.traytips.notif_handler) except: pass if self.conn and self.status and self.status['state'] in ['play', 'pause']: try: self.traytips.notifications_location = self.config.traytips_notifications_location self.traytips.use_notifications_location = True if HAVE_STATUS_ICON and self.statusicon.is_embedded() and self.statusicon.get_visible(): self.traytips._real_display(self.statusicon) elif HAVE_EGG and self.trayicon.get_property('visible'): self.traytips._real_display(self.trayeventbox) else: self.traytips._real_display(None) if self.config.popup_option != len(self.popuptimes)-1: if force_popup and not self.config.show_notification: # Used -p argument and notification is disabled in # player; default to 3 seconds timeout = 3000 else: timeout = int(self.popuptimes[self.config.popup_option])*1000 self.traytips.notif_handler = gobject.timeout_add(timeout, self.traytips.hide) else: # -1 indicates that the timeout should be forever. # We don't want to pass None, because then Sonata # would think that there is no current notification self.traytips.notif_handler = -1 except: pass else: self.traytips.hide() elif self.traytips.get_property('visible'): try: self.traytips._real_display(self.trayeventbox) except: pass def on_progressbar_notify_fraction(self, *_args): self.trayprogressbar.set_fraction(self.progressbar.get_fraction()) def on_progressbar_notify_text(self, *_args): self.trayprogressbar.set_text(self.progressbar.get_text()) def update_infofile(self): if self.config.use_infofile is True: try: info_file = open(self.config.infofile_path, 'w') if self.status['state'] in ['play']: info_file.write('Status: ' + 'Playing' + '\n') elif self.status['state'] in ['pause']: info_file.write('Status: ' + 'Paused' + '\n') elif self.status['state'] in ['stop']: info_file.write('Status: ' + 'Stopped' + '\n') try: info_file.write('Title: ' + mpdh.get(self.songinfo, 'artist') + ' - ' + mpdh.get(self.songinfo, 'title') + '\n') except: try: info_file.write('Title: ' + mpdh.get(self.songinfo, 'title') + '\n') # No Arist in streams except: info_file.write('Title: No - ID Tag\n') info_file.write('Album: ' + mpdh.get(self.songinfo, 'album', 'No Data') + '\n') info_file.write('Track: ' + mpdh.get(self.songinfo, 'track', '0') + '\n') info_file.write('File: ' + mpdh.get(self.songinfo, 'file', 'No Data') + '\n') info_file.write('Time: ' + mpdh.get(self.songinfo, 'time', '0') + '\n') info_file.write('Volume: ' + self.status['volume'] + '\n') info_file.write('Repeat: ' + self.status['repeat'] + '\n') info_file.write('Random: ' + self.status['random'] + '\n') info_file.close() except: pass ################# # Gui Callbacks # ################# def on_delete_event_yes(self, _widget): self.exit_now = True self.on_delete_event(None, None) # This one makes sure the program exits when the window is closed def on_delete_event(self, _widget, _data=None): if not self.exit_now and self.config.minimize_to_systray: if HAVE_STATUS_ICON and self.statusicon.is_embedded() and self.statusicon.get_visible(): self.withdraw_app() return True elif HAVE_EGG and self.trayicon.get_property('visible'): self.withdraw_app() return True self.settings_save() self.artwork.artwork_save_cache() if self.config.as_enabled: self.scrobbler.save_cache() if self.conn and self.config.stop_on_exit: self.mpd_stop(None) sys.exit() def on_window_state_change(self, _widget, _event): self.volume_hide() def on_window_lost_focus(self, _widget, _event): self.volume_hide() def on_window_configure(self, window, _event): # When withdrawing an app, extra configure events (with wrong coords) # are fired (at least on Openbox). This prevents a user from moving # the window, withdrawing it, then unwithdrawing it and finding it in # an older position if not window.props.visible: return width, height = window.get_size() if self.config.expanded: self.config.w, self.config.h = width, height else: self.config.w = width self.config.x, self.config.y = window.get_position() self.expander_ellipse_workaround() def on_notebook_resize(self, _widget, _event): if not self.current.resizing_columns : gobject.idle_add(self.header_save_column_widths) gobject.idle_add(self.info.resize_elements, self.notebook.allocation) def on_expand(self, _action): if not self.config.expanded: self.expander.set_expanded(False) self.on_expander_activate(None) self.expander.set_expanded(True) def on_collapse(self, _action): if self.config.expanded: self.expander.set_expanded(True) self.on_expander_activate(None) self.expander.set_expanded(False) def on_expander_activate(self, _expander): currheight = self.window.get_size()[1] self.config.expanded = False # Note that get_expanded() will return the state of the expander # before this current click window_about_to_be_expanded = not self.expander.get_expanded() if window_about_to_be_expanded: if self.window.get_size()[1] == self.config.h: # For WMs like ion3, the app will not actually resize # when in collapsed mode, so prevent the waiting # of the player to expand from happening: skip_size_check = True else: skip_size_check = False if self.config.show_statusbar: self.statusbar.show() self.notebook.show_all() if self.config.show_statusbar: ui.show(self.statusbar) else: ui.hide(self.statusbar) self.notebook.hide() if not (self.conn and self.status and self.status['state'] in ['play', 'pause']): if window_about_to_be_expanded: self.cursonglabel2.set_markup('<small>' + _('Click to collapse') + '</small>') else: self.cursonglabel2.set_markup('<small>' + _('Click to expand') + '</small>') # Now we wait for the height of the player to increase, so that # we know the list is visible. This is pretty hacky, but works. if self.window_owner: if window_about_to_be_expanded: if not skip_size_check: while self.window.get_size()[1] == currheight: gtk.main_iteration() # Notebook is visible, now resize: self.window.resize(self.config.w, self.config.h) else: self.window.resize(self.config.w, 1) if window_about_to_be_expanded: self.config.expanded = True if self.status and self.status['state'] in ['play','pause']: gobject.idle_add(self.current.center_song_in_list) self.window.set_geometry_hints(self.window) if self.notebook_show_first_tab: # Sonata was launched in collapsed state. Ensure we display # first tab: self.notebook_show_first_tab = False self.notebook.set_current_page(0) # Put focus to the notebook: self.on_notebook_page_change(self.notebook, 0, self.notebook.get_current_page()) # This callback allows the user to seek to a specific portion of the song def on_progressbar_press(self, _widget, event): if event.button == 1: if self.status and self.status['state'] in ['play', 'pause']: at, length = [int(c) for c in self.status['time'].split(':')] try: pbsize = self.progressbar.allocation if misc.is_lang_rtl(self.window): seektime = int(((pbsize.width-event.x)/pbsize.width) * length) else: seektime = int((event.x/pbsize.width) * length) self.seek(int(self.status['song']), seektime) except: pass return True def on_progressbar_scroll(self, _widget, event): if self.status and self.status['state'] in ['play', 'pause']: try: gobject.source_remove(self.seekidle) except: pass self.seekidle = gobject.idle_add(self._seek_when_idle, event.direction) return True def _seek_when_idle(self, direction): at, length = [int(c) for c in self.status['time'].split(':')] try: if direction == gtk.gdk.SCROLL_UP: seektime = int(self.status['time'].split(":")[0]) + 5 if seektime < 0: seektime = 0 elif direction == gtk.gdk.SCROLL_DOWN: seektime = int(self.status['time'].split(":")[0]) - 5 if seektime > mpdh.get(self.songinfo, 'time'): seektime = mpdh.get(self.songinfo, 'time') self.seek(int(self.status['song']), seektime) except: pass def on_lyrics_search(self, _event): artist = mpdh.get(self.songinfo, 'artist') title = mpdh.get(self.songinfo, 'title') dialog = ui.dialog(title=_('Lyrics Search'), parent=self.window, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_FIND, gtk.RESPONSE_ACCEPT), role='lyricsSearch', default=gtk.RESPONSE_ACCEPT) dialog.action_area.get_children()[0].set_label(_("_Search")) dialog.action_area.get_children()[0].set_image(ui.image(stock=gtk.STOCK_FIND)) artist_hbox = gtk.HBox() artist_label = ui.label(text=_('Artist Name') + ':') artist_hbox.pack_start(artist_label, False, False, 5) artist_entry = ui.entry(text=artist) artist_hbox.pack_start(artist_entry, True, True, 5) title_hbox = gtk.HBox() title_label = ui.label(text=_('Song Title') + ':') title_hbox.pack_start(title_label, False, False, 5) title_entry = ui.entry(title) title_hbox.pack_start(title_entry, True, True, 5) ui.set_widths_equal([artist_label, title_label]) dialog.vbox.pack_start(artist_hbox) dialog.vbox.pack_start(title_hbox) ui.show(dialog.vbox) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: dialog.destroy() # Delete current lyrics: filename = self.info.target_lyrics_filename(artist, title, None, consts.LYRICS_LOCATION_HOME) misc.remove_file(filename) # Search for new lyrics: self.info.get_lyrics_start(artist_entry.get_text(), title_entry.get_text(), artist, title, os.path.dirname(mpdh.get(self.songinfo, 'file'))) else: dialog.destroy() def mpd_shuffle(self, _action): if self.conn: if not self.status or self.status['playlistlength'] == '0': return ui.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) while gtk.events_pending(): gtk.main_iteration() mpdh.call(self.client, 'shuffle') def on_menu_popup(self, _widget): self.update_menu_visibility() gobject.idle_add(self.mainmenu.popup, None, None, self.menu_position, 3, 0) def on_updatedb(self, _action): if self.conn: if self.library.search_visible(): self.library.on_search_end(None) mpdh.update(self.client, '/', self.status) self.mpd_update_queued = True def on_updatedb_shortcut(self, _action): # If no songs selected, update view. Otherwise update # selected items. if self.library.not_parent_is_selected(): self.on_updatedb_path(True) else: self.on_updatedb_path(False) def on_updatedb_path(self, selected_only): if self.conn and self.current_tab == self.TAB_LIBRARY: if self.library.search_visible(): self.library.on_search_end(None) filenames = self.library.get_path_child_filenames(True, selected_only) if len(filenames) > 0: mpdh.update(self.client, filenames, self.status) self.mpd_update_queued = True def on_image_activate(self, widget, event): self.window.handler_block(self.mainwinhandler) if event.button == 1 and widget == self.info_imagebox and self.artwork.have_last(): if not self.config.info_art_enlarged: self.info_imagebox.set_size_request(-1,-1) self.artwork.artwork_set_image_last() self.config.info_art_enlarged = True else: self.info_imagebox.set_size_request(152, -1) self.artwork.artwork_set_image_last() self.config.info_art_enlarged = False self.volume_hide() # Force a resize of the info labels, if needed: gobject.idle_add(self.on_notebook_resize, self.notebook, None) elif event.button == 1 and widget != self.info_imagebox: if self.config.expanded: if self.current_tab != self.TAB_INFO: self.img_clicked = True self.switch_to_tab_name(self.TAB_INFO) self.img_clicked = False else: self.switch_to_tab_name(self.last_tab) elif event.button == 3: artist = None album = None stream = None if self.conn and self.status and self.status['state'] in ['play', 'pause']: self.UIManager.get_widget('/imagemenu/chooseimage_menu/').show() self.UIManager.get_widget('/imagemenu/localimage_menu/').show() artist = mpdh.get(self.songinfo, 'artist', None) album = mpdh.get(self.songinfo, 'album', None) stream = mpdh.get(self.songinfo, 'name', None) if not (artist or album or stream): self.UIManager.get_widget('/imagemenu/localimage_menu/').hide() self.UIManager.get_widget('/imagemenu/resetimage_menu/').hide() self.UIManager.get_widget('/imagemenu/chooseimage_menu/').hide() self.imagemenu.popup(None, None, None, event.button, event.time) gobject.timeout_add(50, self.on_image_activate_after) return False def on_image_motion_cb(self, _widget, context, _x, _y, time): context.drag_status(gtk.gdk.ACTION_COPY, time) return True def on_image_drop_cb(self, _widget, _context, _x, _y, selection, _info, _time): if self.conn and self.status and self.status['state'] in ['play', 'pause']: uri = selection.data.strip() path = urllib.url2pathname(uri) paths = path.rsplit('\n') thread = threading.Thread(target=self.on_image_drop_cb_thread, args=(paths,)) thread.setDaemon(True) thread.start() def on_image_drop_cb_thread(self, paths): for i, path in enumerate(paths): remove_after_set = False paths[i] = path.rstrip('\r') # Clean up (remove preceding "file://" or "file:") if paths[i].startswith('file://'): paths[i] = paths[i][7:] elif paths[i].startswith('file:'): paths[i] = paths[i][5:] elif re.match('^(https?|ftp)://', paths[i]): try: # Eliminate query arguments and extract extension & filename path = urllib.splitquery(paths[i])[0] extension = os.path.splitext(path)[1][1:] filename = os.path.split(path)[1] if img.extension_is_valid(extension): # Save to temp dir.. we will delete the image afterwards dest_file = os.path.expanduser('~/.covers/temp/' + filename) misc.create_dir('~/.covers/temp') urllib.urlretrieve(paths[i], dest_file) paths[i] = dest_file remove_after_set = True else: continue except: # cleanup undone file misc.remove_file(paths[i]) raise paths[i] = os.path.abspath(paths[i]) if img.valid_image(paths[i]): stream = mpdh.get(self.songinfo, 'name', None) if stream is not None: dest_filename = self.artwork.artwork_stream_filename(mpdh.get(self.songinfo, 'name')) else: dest_filename = self.target_image_filename() if dest_filename != paths[i]: shutil.copyfile(paths[i], dest_filename) self.artwork.artwork_update(True) if remove_after_set: misc.remove_file(paths[i]) def target_image_filename(self, force_location=None, songpath=None, artist=None, album=None): # Only pass songpath, artist, and album if we are trying to get the # filename for an album that isn't currently playing if self.conn: # If no info passed, you info from currently playing song: if not album: album = mpdh.get(self.songinfo, 'album', "") if not artist: artist = self.album_current_artist[1] album = album.replace("/", "") artist = artist.replace("/", "") if songpath is None: songpath = os.path.dirname(mpdh.get(self.songinfo, 'file')) # Return target filename: if force_location is not None: art_loc = force_location else: art_loc = self.config.art_location if art_loc == consts.ART_LOCATION_HOMECOVERS: targetfile = os.path.expanduser("~/.covers/" + artist + "-" + album + ".jpg") elif art_loc == consts.ART_LOCATION_COVER: targetfile = self.config.musicdir[self.config.profile_num] + songpath + "/cover.jpg" elif art_loc == consts.ART_LOCATION_FOLDER: targetfile = self.config.musicdir[self.config.profile_num] + songpath + "/folder.jpg" elif art_loc == consts.ART_LOCATION_ALBUM: targetfile = self.config.musicdir[self.config.profile_num] + songpath + "/album.jpg" elif art_loc == consts.ART_LOCATION_CUSTOM: targetfile = self.config.musicdir[self.config.profile_num] + songpath + "/" + self.config.art_location_custom_filename targetfile = misc.file_exists_insensitive(targetfile) return misc.file_from_utf8(targetfile) def album_return_artist_and_tracks(self): # Includes logic for Various Artists albums to determine # the tracks. datalist = [] album = mpdh.get(self.songinfo, 'album') songs, playtime, num_songs = self.library.library_return_search_items(album=album) for song in songs: year = mpdh.get(song, 'date', '') artist = mpdh.get(song, 'artist', '') path = os.path.dirname(mpdh.get(song, 'file')) data = library.library_set_data(album=album, artist=artist, year=year, path=path) datalist.append(data) if len(datalist) > 0: datalist = misc.remove_list_duplicates(datalist, case=False) datalist = self.library.list_identify_VA_albums(datalist) # Find all songs in album: retsongs = [] for song in songs: if unicode(mpdh.get(song, 'album')).lower() == unicode(library.library_get_data(datalist[0], 'album')).lower() \ and mpdh.get(song, 'date', None) == library.library_get_data(datalist[0], 'year'): retsongs.append(song) artist = library.library_get_data(datalist[0], 'artist') return artist, retsongs else: return None, None def album_return_artist_name(self): # Determine if album_name is a various artists album. if self.album_current_artist[0] == self.songinfo: return artist, tracks = self.album_return_artist_and_tracks() if artist is not None: self.album_current_artist = [self.songinfo, artist] else: self.album_current_artist = [self.songinfo, ""] def album_reset_artist(self): self.album_current_artist = [None, ""] def on_image_activate_after(self): self.window.handler_unblock(self.mainwinhandler) def update_preview(self, file_chooser, preview): filename = file_chooser.get_preview_filename() pixbuf = None try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, 128, 128) except: pass if pixbuf == None: try: pixbuf = gtk.gdk.PixbufAnimation(filename).get_static_image() width = pixbuf.get_width() height = pixbuf.get_height() if width > height: pixbuf = pixbuf.scale_simple(128, int(float(height)/width*128), gtk.gdk.INTERP_HYPER) else: pixbuf = pixbuf.scale_simple(int(float(width)/height*128), 128, gtk.gdk.INTERP_HYPER) except: pass if pixbuf == None: pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, 1, 8, 128, 128) pixbuf.fill(0x00000000) preview.set_from_pixbuf(pixbuf) have_preview = True file_chooser.set_preview_widget_active(have_preview) del pixbuf self.call_gc_collect = True def image_local(self, _widget): dialog = gtk.FileChooserDialog(title=_("Open Image"),action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) filefilter = gtk.FileFilter() filefilter.set_name(_("Images")) filefilter.add_pixbuf_formats() dialog.add_filter(filefilter) filefilter = gtk.FileFilter() filefilter.set_name(_("All files")) filefilter.add_pattern("*") dialog.add_filter(filefilter) preview = ui.image() dialog.set_preview_widget(preview) dialog.set_use_preview_label(False) dialog.connect("update-preview", self.update_preview, preview) stream = mpdh.get(self.songinfo, 'name', None) album = mpdh.get(self.songinfo, 'album', "").replace("/", "") artist = self.album_current_artist[1].replace("/", "") dialog.connect("response", self.image_local_response, artist, album, stream) dialog.set_default_response(gtk.RESPONSE_OK) songdir = os.path.dirname(mpdh.get(self.songinfo, 'file')) currdir = misc.file_from_utf8(self.config.musicdir[self.config.profile_num] + songdir) if self.config.art_location != consts.ART_LOCATION_HOMECOVERS: dialog.set_current_folder(currdir) if stream is not None: # Allow saving an image file for a stream: self.local_dest_filename = self.artwork.artwork_stream_filename(stream) else: self.local_dest_filename = self.target_image_filename() dialog.show() def image_local_response(self, dialog, response, _artist, _album, _stream): if response == gtk.RESPONSE_OK: filename = dialog.get_filenames()[0] # Copy file to covers dir: if self.local_dest_filename != filename: shutil.copyfile(filename, self.local_dest_filename) # And finally, set the image in the interface: self.artwork.artwork_update(True) # Force a resize of the info labels, if needed: gobject.idle_add(self.on_notebook_resize, self.notebook, None) dialog.destroy() def imagelist_append(self, elem): self.imagelist.append(elem) def remotefilelist_append(self, elem): self.remotefilelist.append(elem) def image_remote(self, _widget): self.choose_dialog = ui.dialog(title=_("Choose Cover Art"), parent=self.window, flags=gtk.DIALOG_MODAL, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT), role='chooseCoverArt', default=gtk.RESPONSE_ACCEPT, separator=False, resizable=False) choosebutton = self.choose_dialog.add_button(_("C_hoose"), gtk.RESPONSE_ACCEPT) chooseimage = ui.image(stock=gtk.STOCK_CONVERT, stocksize=gtk.ICON_SIZE_BUTTON) choosebutton.set_image(chooseimage) self.imagelist = gtk.ListStore(int, gtk.gdk.Pixbuf) # Setting col=2 only shows 1 column with gtk 2.16 while col=-1 shows 2 imagewidget = ui.iconview(col=-1, space=0, margin=0, itemw=75, selmode=gtk.SELECTION_SINGLE) scroll = ui.scrollwindow(policy_x=gtk.POLICY_NEVER, policy_y=gtk.POLICY_ALWAYS, w=360, h=325, add=imagewidget) self.choose_dialog.vbox.pack_start(scroll, False, False, 0) hbox = gtk.HBox() vbox = gtk.VBox() vbox.pack_start(ui.label(markup='<small> </small>'), False, False, 0) self.remote_artistentry = ui.entry() self.remote_albumentry = ui.entry() text = [("Artist"), _("Album")] labels = [ui.label(text=labelname + ": ") for labelname in text] entries = [self.remote_artistentry, self.remote_albumentry] for entry, label in zip(entries, labels): tmphbox = gtk.HBox() tmphbox.pack_start(label, False, False, 5) entry.connect('activate', self.image_remote_refresh, imagewidget) tmphbox.pack_start(entry, True, True, 5) vbox.pack_start(tmphbox) ui.set_widths_equal(labels) vbox.pack_start(ui.label(markup='<small> </small>'), False, False, 0) hbox.pack_start(vbox, True, True, 5) vbox2 = gtk.VBox() vbox2.pack_start(ui.label(" ")) refreshbutton = ui.button(text=_('_Update'), img=ui.image(stock=gtk.STOCK_REFRESH)) refreshbutton.connect('clicked', self.image_remote_refresh, imagewidget) vbox2.pack_start(refreshbutton, False, False, 5) vbox2.pack_start(ui.label(" ")) hbox.pack_start(vbox2, False, False, 15) searchexpander = ui.expander(text=_("Edit search terms")) searchexpander.add(hbox) self.choose_dialog.vbox.pack_start(searchexpander, True, True, 0) self.choose_dialog.show_all() self.chooseimage_visible = True self.remotefilelist = [] stream = mpdh.get(self.songinfo, 'name', None) if stream is not None: # Allow saving an image file for a stream: self.remote_dest_filename = self.artwork.artwork_stream_filename(stream) else: self.remote_dest_filename = self.target_image_filename() album = mpdh.get(self.songinfo, 'album', '') artist = self.album_current_artist[1] imagewidget.connect('item-activated', self.image_remote_replace_cover, artist.replace("/", ""), album.replace("/", ""), stream) self.choose_dialog.connect('response', self.image_remote_response, imagewidget, artist, album, stream) self.remote_artistentry.set_text(artist) self.remote_albumentry.set_text(album) self.allow_art_search = True self.image_remote_refresh(None, imagewidget) def image_remote_refresh(self, _entry, imagewidget): if not self.allow_art_search: return self.allow_art_search = False self.artwork.artwork_stop_update() while self.artwork.artwork_is_downloading_image(): gtk.main_iteration() self.imagelist.clear() imagewidget.set_text_column(-1) imagewidget.set_model(self.imagelist) imagewidget.set_pixbuf_column(1) ui.focus(imagewidget) ui.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) thread = threading.Thread(target=self._image_remote_refresh, args=(imagewidget, None)) thread.setDaemon(True) thread.start() def _image_remote_refresh(self, imagewidget, _ignore): self.artwork.stop_art_update = False # Retrieve all images from amazon: artist_search = self.remote_artistentry.get_text() album_search = self.remote_albumentry.get_text() if len(artist_search) == 0 and len(album_search) == 0: gobject.idle_add(self.image_remote_no_tag_found, imagewidget) return filename = os.path.expanduser("~/.covers/temp/<imagenum>.jpg") misc.remove_dir_recursive(os.path.dirname(filename)) misc.create_dir(os.path.dirname(filename)) imgfound = self.artwork.artwork_download_img_to_file(artist_search, album_search, filename, True) ui.change_cursor(None) if self.chooseimage_visible: if not imgfound: gobject.idle_add(self.image_remote_no_covers_found, imagewidget) self.call_gc_collect = True def image_remote_no_tag_found(self, imagewidget): self.image_remote_warning(imagewidget, _("No artist or album name found.")) def image_remote_no_covers_found(self, imagewidget): self.image_remote_warning(imagewidget, _("No cover art found.")) def image_remote_warning(self, imagewidget, msgstr): liststore = gtk.ListStore(int, str) liststore.append([0, msgstr]) imagewidget.set_pixbuf_column(-1) imagewidget.set_model(liststore) imagewidget.set_text_column(1) ui.change_cursor(None) self.allow_art_search = True def image_remote_response(self, dialog, response_id, imagewidget, artist, album, stream): self.artwork.artwork_stop_update() if response_id == gtk.RESPONSE_ACCEPT: try: self.image_remote_replace_cover(imagewidget, imagewidget.get_selected_items()[0], artist, album, stream) # Force a resize of the info labels, if needed: gobject.idle_add(self.on_notebook_resize, self.notebook, None) except: dialog.destroy() pass else: dialog.destroy() ui.change_cursor(None) self.chooseimage_visible = False def image_remote_replace_cover(self, _iconview, path, _artist, _album, _stream): self.artwork.artwork_stop_update() image_num = int(path[0]) if len(self.remotefilelist) > 0: filename = self.remotefilelist[image_num] if os.path.exists(filename): shutil.move(filename, self.remote_dest_filename) # And finally, set the image in the interface: self.artwork.artwork_update(True) # Clean up.. misc.remove_dir_recursive(os.path.dirname(filename)) self.chooseimage_visible = False self.choose_dialog.destroy() while self.artwork.artwork_is_downloading_image(): gtk.main_iteration() def fullscreen_cover_art(self, _widget): if self.fullscreencoverart.get_property('visible'): self.fullscreencoverart.hide() else: self.traytips.hide() self.artwork.fullscreen_cover_art_set_image(force_update=True) self.fullscreencoverart.show_all() def fullscreen_cover_art_close(self, _widget, event, key_press): if key_press: shortcut = gtk.accelerator_name(event.keyval, event.state) shortcut = shortcut.replace("<Mod2>", "") if shortcut != 'Escape': return self.fullscreencoverart.hide() def header_save_column_widths(self): if not self.config.withdrawn and self.config.expanded: windowwidth = self.window.allocation.width if windowwidth <= 10 or self.current.columns[0].get_width() <= 10: # Make sure we only set self.config.columnwidths if self.current # has its normal allocated width: return notebookwidth = self.notebook.allocation.width treewidth = 0 for i, column in enumerate(self.current.columns): colwidth = column.get_width() treewidth += colwidth if i == len(self.current.columns)-1 and treewidth <= windowwidth: self.config.columnwidths[i] = min(colwidth, column.get_fixed_width()) else: self.config.columnwidths[i] = colwidth if treewidth > notebookwidth: self.current.expanderwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) else: self.current.expanderwindow.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.current.resizing_columns = False def systemtray_menu(self, status_icon, button, activate_time): self.traymenu.popup(None, None, gtk.status_icon_position_menu, button, activate_time, status_icon) def systemtray_activate(self, _status_icon): # Clicking on a gtk.StatusIcon: if not self.ignore_toggle_signal: # This prevents the user clicking twice in a row quickly # and having the second click not revert to the intial # state self.ignore_toggle_signal = True prev_state = self.UIManager.get_widget('/traymenu/showmenu').get_active() self.UIManager.get_widget('/traymenu/showmenu').set_active(not prev_state) if not self.window.window: # For some reason, self.window.window is not defined if mpd is not running # and sonata is started with self.config.withdrawn = True self.withdraw_app_undo() elif not (self.window.window.get_state() & gtk.gdk.WINDOW_STATE_WITHDRAWN) and self.window.is_active(): # Window is not withdrawn and is active (has toplevel focus): self.withdraw_app() else: self.withdraw_app_undo() # This prevents the tooltip from popping up again until the user # leaves and enters the trayicon again #if self.traytips.notif_handler == None and self.traytips.notif_handler != -1: #self.traytips._remove_timer() gobject.timeout_add(100, self.tooltip_set_ignore_toggle_signal_false) def tooltip_show_manually(self): # Since there is no signal to connect to when the user puts their # mouse over the trayicon, we will check the mouse position # manually and show/hide the window as appropriate. This is called # every iteration. Note: This should not occur if self.traytips.notif_ # handler has a value, because that means that the tooltip is already # visible, and we don't want to override that setting simply because # the user's cursor is not over the tooltip. if self.traymenu.get_property('visible') and self.traytips.notif_handler != -1: self.traytips._remove_timer() elif not self.traytips.notif_handler: pointer_screen, px, py, _ = self.window.get_screen().get_display().get_pointer() icon_screen, icon_rect, icon_orient = self.statusicon.get_geometry() x = icon_rect[0] y = icon_rect[1] width = icon_rect[2] height = icon_rect[3] if px >= x and px <= x+width and py >= y and py <= y+height: self.traytips._start_delay(self.statusicon) else: self.traytips._remove_timer() def systemtray_click(self, _widget, event): # Clicking on an egg system tray icon: if event.button == 1 and not self.ignore_toggle_signal: # Left button shows/hides window(s) self.systemtray_activate(None) elif event.button == 2: # Middle button will play/pause if self.conn: self.mpd_pp(self.trayeventbox) elif event.button == 3: # Right button pops up menu self.traymenu.popup(None, None, None, event.button, event.time) return False def on_traytips_press(self, _widget, _event): if self.traytips.get_property('visible'): self.traytips._remove_timer() def withdraw_app_undo(self): self.window.move(self.config.x, self.config.y) if not self.config.expanded: self.notebook.set_no_show_all(True) self.statusbar.set_no_show_all(True) self.window.show_all() self.notebook.set_no_show_all(False) self.config.withdrawn = False self.UIManager.get_widget('/traymenu/showmenu').set_active(True) if self.notebook_show_first_tab and self.config.expanded: # Sonata was launched in withdrawn state. Ensure we display # first tab: self.notebook_show_first_tab = False self.notebook.set_current_page(0) gobject.idle_add(self.withdraw_app_undo_present_and_focus) def withdraw_app_undo_present_and_focus(self): self.window.present() # Helps to raise the window (useful against focus stealing prevention) self.window.grab_focus() if self.config.sticky: self.window.stick() if self.config.ontop: self.window.set_keep_above(True) def withdraw_app(self): if HAVE_EGG or HAVE_STATUS_ICON: # Save the playlist column widths before withdrawing the app. # Otherwise we will not be able to correctly save the column # widths if the user quits sonata while it is withdrawn. self.header_save_column_widths() self.window.hide() self.config.withdrawn = True self.UIManager.get_widget('/traymenu/showmenu').set_active(False) def on_withdraw_app_toggle(self, _action): if self.ignore_toggle_signal: return self.ignore_toggle_signal = True if self.UIManager.get_widget('/traymenu/showmenu').get_active(): self.withdraw_app_undo() else: self.withdraw_app() gobject.timeout_add(500, self.tooltip_set_ignore_toggle_signal_false) def tooltip_set_ignore_toggle_signal_false(self): self.ignore_toggle_signal = False # Change volume on mousewheel over systray icon: def systemtray_scroll(self, widget, event): self.on_volumebutton_scroll(widget, event) def systemtray_size(self, widget, _allocation): if widget.allocation.height <= 5: # For vertical panels, height can be 1px, so use width size = widget.allocation.width else: size = widget.allocation.height if not self.eggtrayheight or self.eggtrayheight != size: self.eggtrayheight = size if size > 5 and self.eggtrayfile: self.trayimage.set_from_pixbuf(img.get_pixbuf_of_size(gtk.gdk.pixbuf_new_from_file(self.eggtrayfile), self.eggtrayheight)[0]) def switch_to_tab_name(self, tab_name): self.notebook.set_current_page(self.notebook_get_tab_num(self.notebook, tab_name)) def switch_to_tab_num(self, tab_num): vis_tabnum = self.notebook_get_visible_tab_num(self.notebook, tab_num) if vis_tabnum != -1: self.notebook.set_current_page(vis_tabnum) def on_switch_to_tab1(self, _action): self.switch_to_tab_num(0) def on_switch_to_tab2(self, _action): self.switch_to_tab_num(1) def on_switch_to_tab3(self, _action): self.switch_to_tab_num(2) def on_switch_to_tab4(self, _action): self.switch_to_tab_num(3) def on_switch_to_tab5(self, _action): self.switch_to_tab_num(4) def switch_to_next_tab(self, _action): self.notebook.next_page() def switch_to_prev_tab(self, _action): self.notebook.prev_page() def on_volume_lower(self, _action): new_volume = int(self.volumescale.get_adjustment().get_value()) - 5 if new_volume < 0: new_volume = 0 self.volumescale.get_adjustment().set_value(new_volume) self.on_volumescale_change(self.volumescale, 0, 0) def on_volume_raise(self, _action): new_volume = int(self.volumescale.get_adjustment().get_value()) + 5 if new_volume > 100: new_volume = 100 self.volumescale.get_adjustment().set_value(new_volume) self.on_volumescale_change(self.volumescale, 0, 0) # Volume control def on_volumebutton_clicked(self, _widget): if not self.volumewindow.get_property('visible'): x_win, y_win = self.volumebutton.window.get_origin() button_rect = self.volumebutton.get_allocation() x_coord, y_coord = button_rect.x + x_win, button_rect.y+y_win width, height = button_rect.width, button_rect.height self.volumewindow.set_size_request(width, -1) self.volumewindow.move(x_coord, y_coord+height) self.volumewindow.present() else: self.volume_hide() def on_volumebutton_scroll(self, _widget, event): if self.conn: if event.direction == gtk.gdk.SCROLL_UP: self.on_volume_raise(None) elif event.direction == gtk.gdk.SCROLL_DOWN: self.on_volume_lower(None) def on_volumescale_scroll(self, _widget, event): if event.direction == gtk.gdk.SCROLL_UP: new_volume = int(self.volumescale.get_adjustment().get_value()) + 5 if new_volume > 100: new_volume = 100 self.volumescale.get_adjustment().set_value(new_volume) elif event.direction == gtk.gdk.SCROLL_DOWN: new_volume = int(self.volumescale.get_adjustment().get_value()) - 5 if new_volume < 0: new_volume = 0 self.volumescale.get_adjustment().set_value(new_volume) def on_volumescale_change(self, obj, _value, _data): new_volume = int(obj.get_adjustment().get_value()) mpdh.call(self.client, 'setvol', new_volume) self.iterate_now() def volume_hide(self): self.volumebutton.set_active(False) if self.volumewindow.get_property('visible'): self.volumewindow.hide() def mpd_pp(self, _widget, _key=None): if self.conn and self.status: if self.status['state'] in ('stop', 'pause'): mpdh.call(self.client, 'play') elif self.status['state'] == 'play': mpdh.call(self.client, 'pause', '1') self.iterate_now() def mpd_stop(self, _widget, _key=None): if self.conn: mpdh.call(self.client, 'stop') self.iterate_now() def mpd_prev(self, _widget, _key=None): if self.conn: mpdh.call(self.client, 'previous') self.iterate_now() def mpd_next(self, _widget, _key=None): if self.conn: mpdh.call(self.client, 'next') self.iterate_now() def on_remove(self, _widget): if self.conn: model = None while gtk.events_pending(): gtk.main_iteration() if self.current_tab == self.TAB_CURRENT: self.current.on_remove() elif self.current_tab == self.TAB_PLAYLISTS: treeviewsel = self.playlists_selection model, selected = treeviewsel.get_selected_rows() if ui.show_msg(self.window, gettext.ngettext("Delete the selected playlist?", "Delete the selected playlists?", int(len(selected))), gettext.ngettext("Delete Playlist", "Delete Playlists", int(len(selected))), 'deletePlaylist', gtk.BUTTONS_YES_NO) == gtk.RESPONSE_YES: iters = [model.get_iter(path) for path in selected] for i in iters: mpdh.call(self.client, 'rm', misc.unescape_html(self.playlistsdata.get_value(i, 1))) self.playlists.populate() elif self.current_tab == self.TAB_STREAMS: treeviewsel = self.streams_selection model, selected = treeviewsel.get_selected_rows() if ui.show_msg(self.window, gettext.ngettext("Delete the selected stream?", "Delete the selected streams?", int(len(selected))), gettext.ngettext("Delete Stream", "Delete Streams", int(len(selected))), 'deleteStreams', gtk.BUTTONS_YES_NO) == gtk.RESPONSE_YES: iters = [model.get_iter(path) for path in selected] for i in iters: stream_removed = False for j in range(len(self.config.stream_names)): if not stream_removed: if self.streamsdata.get_value(i, 1) == misc.escape_html(self.config.stream_names[j]): self.config.stream_names.pop(j) self.config.stream_uris.pop(j) stream_removed = True self.streams.populate() self.iterate_now() # Attempt to retain selection in the vicinity.. if model and len(model) > 0: try: # Use top row in selection... selrow = 999999 for row in selected: if row[0] < selrow: selrow = row[0] if selrow >= len(model): selrow = len(model)-1 treeviewsel.select_path(selrow) except: pass def mpd_clear(self, _widget): if self.conn: mpdh.call(self.client, 'clear') self.iterate_now() def on_repeat_clicked(self, widget): if self.conn: if widget.get_active(): mpdh.call(self.client, 'repeat', 1) else: mpdh.call(self.client, 'repeat', 0) def on_random_clicked(self, widget): if self.conn: if widget.get_active(): mpdh.call(self.client, 'random', 1) else: mpdh.call(self.client, 'random', 0) def on_prefs(self, _widget): trayicon_available = HAVE_EGG or HAVE_STATUS_ICON trayicon_in_use = ((HAVE_STATUS_ICON and self.statusicon.is_embedded() and self.statusicon.get_visible()) or (HAVE_EGG and self.trayicon.get_property('visible'))) extras = Extras_cbs() extras.popuptimes = self.popuptimes extras.notif_toggled = self.prefs_notif_toggled extras.crossfade_toggled = self.prefs_crossfade_toggled extras.crossfade_changed = self.prefs_crossfade_changed display = Display_cbs() display.stylized_toggled = self.prefs_stylized_toggled display.art_toggled = self.prefs_art_toggled display.playback_toggled = self.prefs_playback_toggled display.progress_toggled = self.prefs_progress_toggled display.statusbar_toggled = self.prefs_statusbar_toggled display.lyrics_toggled = self.prefs_lyrics_toggled display.trayicon_available = trayicon_available behavior = Behavior_cbs() behavior.trayicon_toggled = self.prefs_trayicon_toggled behavior.trayicon_in_use = trayicon_in_use behavior.sticky_toggled = self.prefs_sticky_toggled behavior.ontop_toggled = self.prefs_ontop_toggled behavior.decorated_toggled = self.prefs_decorated_toggled behavior.infofile_changed = self.prefs_infofile_changed format = Format_cbs() format.currentoptions_changed = self.prefs_currentoptions_changed format.libraryoptions_changed = self.prefs_libraryoptions_changed format.titleoptions_changed = self.prefs_titleoptions_changed format.currsongoptions1_changed = self.prefs_currsongoptions1_changed format.currsongoptions2_changed = self.prefs_currsongoptions2_changed self.preferences.on_prefs_real(extras, display, behavior, format) def prefs_currentoptions_changed(self, entry, _event): if self.config.currentformat != entry.get_text(): self.config.currentformat = entry.get_text() for column in self.current_treeview.get_columns(): self.current_treeview.remove_column(column) self.current.initialize_columns() self.current.update_format() def prefs_libraryoptions_changed(self, entry, _event): if self.config.libraryformat != entry.get_text(): self.config.libraryformat = entry.get_text() self.library.library_browse(root=self.config.wd) def prefs_titleoptions_changed(self, entry, _event): if self.config.titleformat != entry.get_text(): self.config.titleformat = entry.get_text() self.update_wintitle() def prefs_currsongoptions1_changed(self, entry, _event): if self.config.currsongformat1 != entry.get_text(): self.config.currsongformat1 = entry.get_text() self.update_cursong() def prefs_currsongoptions2_changed(self, entry, _event): if self.config.currsongformat2 != entry.get_text(): self.config.currsongformat2 = entry.get_text() self.update_cursong() def prefs_ontop_toggled(self, button): self.config.ontop = button.get_active() if self.window_owner: self.window.set_keep_above(self.config.ontop) def prefs_sticky_toggled(self, button): self.config.sticky = button.get_active() if self.window_owner: if self.config.sticky: self.window.stick() else: self.window.unstick() def prefs_decorated_toggled(self, button): self.config.decorated = not button.get_active() if self.window_owner: if self.config.decorated != self.window.get_decorated(): self.withdraw_app() self.window.set_decorated(self.config.decorated) self.withdraw_app_undo() def prefs_infofile_changed(self, entry, _event): if self.config.infofile_path != entry.get_text(): self.config.infofile_path = os.path.expanduser(entry.get_text()) if self.config.use_infofile: self.update_infofile() def prefs_crossfade_changed(self, crossfade_spin): crossfade_value = crossfade_spin.get_value_as_int() mpdh.call(self.client, 'crossfade', crossfade_value) def prefs_crossfade_toggled(self, button, crossfade_spin): crossfade_value = crossfade_spin.get_value_as_int() if button.get_active(): mpdh.call(self.client, 'crossfade', crossfade_value) else: mpdh.call(self.client, 'crossfade', 0) def prefs_playback_toggled(self, button): self.config.show_playback = button.get_active() func = 'show' if self.config.show_playback else 'hide' for widget in [self.prevbutton, self.ppbutton, self.stopbutton, self.nextbutton, self.volumebutton]: getattr(ui, func)(widget) def prefs_progress_toggled(self, button): self.config.show_progress = button.get_active() func = 'show' if self.config.show_progress else 'hide' for widget in [self.progressbox, self.trayprogressbar]: getattr(ui,func)(widget) def prefs_art_toggled(self, button, art_hbox1, art_hbox2, art_stylized): button_active = button.get_active() art_hbox1.set_sensitive(button_active) art_hbox2.set_sensitive(button_active) art_stylized.set_sensitive(button_active) if button_active: self.traytips.set_size_request(self.notification_width, -1) self.artwork.artwork_set_default_icon() for widget in [self.imageeventbox, self.info_imagebox, self.trayalbumeventbox, self.trayalbumimage2]: widget.set_no_show_all(False) if widget in [self.trayalbumeventbox, self.trayalbumimage2]: if self.conn and self.status and self.status['state'] in ['play', 'pause']: widget.show_all() else: widget.show_all() self.config.show_covers = True self.update_cursong() self.artwork.artwork_update() else: self.traytips.set_size_request(self.notification_width-100, -1) for widget in [self.imageeventbox, self.info_imagebox, self.trayalbumeventbox, self.trayalbumimage2]: ui.hide(widget) self.config.show_covers = False self.update_cursong() # Force a resize of the info labels, if needed: gobject.idle_add(self.on_notebook_resize, self.notebook, None) def prefs_stylized_toggled(self, button): self.config.covers_type = button.get_active() self.library.library_browse(root=self.config.wd) self.artwork.artwork_update(True) def prefs_lyrics_toggled(self, button, lyrics_hbox): self.config.show_lyrics = button.get_active() lyrics_hbox.set_sensitive(self.config.show_lyrics) self.info.show_lyrics_updated() if self.config.show_lyrics: self.info_update(True) def prefs_statusbar_toggled(self, button): self.config.show_statusbar = button.get_active() if self.config.show_statusbar: self.statusbar.set_no_show_all(False) if self.config.expanded: self.statusbar.show_all() else: ui.hide(self.statusbar) self.update_statusbar() def prefs_notif_toggled(self, button, notifhbox): self.config.show_notification = button.get_active() notifhbox.set_sensitive(self.config.show_notification) if self.config.show_notification: self.on_currsong_notify() else: try: gobject.source_remove(self.traytips.notif_handler) except: pass self.traytips.hide() def prefs_trayicon_toggled(self, button, minimize): # Note that we update the sensitivity of the minimize # CheckButton to reflect if the trayicon is visible. if button.get_active(): self.config.show_trayicon = True if HAVE_STATUS_ICON: self.statusicon.set_visible(True) if self.statusicon.is_embedded() or self.statusicon.get_visible(): minimize.set_sensitive(True) elif HAVE_EGG: self.trayicon.show_all() if self.trayicon.get_property('visible'): minimize.set_sensitive(True) else: self.config.show_trayicon = False minimize.set_sensitive(False) if HAVE_STATUS_ICON: self.statusicon.set_visible(False) elif HAVE_EGG: self.trayicon.hide_all() def seek(self, song, seektime): mpdh.call(self.client, 'seek', song, seektime) self.iterate_now() def on_link_click(self, type): browser_not_loaded = False if type == 'artist': browser_not_loaded = not misc.browser_load("http://www.wikipedia.org/wiki/Special:Search/" + urllib.quote(mpdh.get(self.songinfo, 'artist')), self.config.url_browser, self.window) elif type == 'album': browser_not_loaded = not misc.browser_load("http://www.wikipedia.org/wiki/Special:Search/" + urllib.quote(mpdh.get(self.songinfo, 'album')), self.config.url_browser, self.window) elif type == 'edit': if self.songinfo: self.on_tags_edit(None) elif type == 'search': self.on_lyrics_search(None) elif type == 'editlyrics': browser_not_loaded = not misc.browser_load(self.info.lyricwiki_editlink(self.songinfo), self.config.url_browser, self.window) if browser_not_loaded: ui.show_msg(self.window, _('Unable to launch a suitable browser.'), _('Launch Browser'), 'browserLoadError', gtk.BUTTONS_CLOSE) def on_tab_click(self, _widget, event): if event.button == 3: self.notebookmenu.popup(None, None, None, event.button, event.time) return True def on_notebook_click(self, _widget, event): if event.button == 1: self.volume_hide() def notebook_get_tab_num(self, notebook, tabname): for tab in range(notebook.get_n_pages()): if self.notebook_get_tab_text(self.notebook, tab) == tabname: return tab def notebook_tab_is_visible(self, notebook, tabname): tab = self.notebook.get_children()[self.notebook_get_tab_num(notebook, tabname)] if tab.get_property('visible'): return True else: return False def notebook_get_visible_tab_num(self, notebook, tab_num): # Get actual tab number for visible tab_num. If there is not # a visible tab for tab_num, return -1.\ curr_tab = -1 for tab in range(notebook.get_n_pages()): if notebook.get_children()[tab].get_property('visible'): curr_tab += 1 if curr_tab == tab_num: return tab return -1 def notebook_get_tab_text(self, notebook, tab_num): tab = notebook.get_children()[tab_num] return notebook.get_tab_label(tab).get_child().get_children()[1].get_text() def on_notebook_page_change(self, _notebook, _page, page_num): self.current_tab = self.notebook_get_tab_text(self.notebook, page_num) to_focus = self.tabname2focus.get(self.current_tab, None) if to_focus: gobject.idle_add(ui.focus, to_focus) gobject.idle_add(self.update_menu_visibility) if not self.img_clicked: self.last_tab = self.current_tab def on_library_search_text_click(self, _widget, event): if event.button == 1: self.volume_hide() def on_window_click(self, _widget, event): if event.button == 1: self.volume_hide() elif event.button == 3: self.menu_popup(self.window, event) def menu_popup(self, widget, event): if widget == self.window: if event.get_coords()[1] > self.notebook.get_allocation()[1]: return if event.button == 3: self.update_menu_visibility(True) gobject.idle_add(self.mainmenu.popup, None, None, None, event.button, event.time) def on_tab_toggle(self, toggleAction): name = toggleAction.get_name() if not toggleAction.get_active(): # Make sure we aren't hiding the last visible tab: num_tabs_vis = 0 for tab in self.notebook.get_children(): if tab.get_property('visible'): num_tabs_vis += 1 if num_tabs_vis == 1: # Keep menu item checking and exit.. toggleAction.set_active(True) return # Store value: if name == self.TAB_CURRENT: self.config.current_tab_visible = toggleAction.get_active() elif name == self.TAB_LIBRARY: self.config.library_tab_visible = toggleAction.get_active() elif name == self.TAB_PLAYLISTS: self.config.playlists_tab_visible = toggleAction.get_active() elif name == self.TAB_STREAMS: self.config.streams_tab_visible = toggleAction.get_active() elif name == self.TAB_INFO: self.config.info_tab_visible = toggleAction.get_active() # Hide/show: tabnum = self.notebook_get_tab_num(self.notebook, name) if toggleAction.get_active(): ui.show(self.notebook.get_children()[tabnum]) else: ui.hide(self.notebook.get_children()[tabnum]) def on_library_search_shortcut(self, _event): # Ensure library tab is visible if not self.notebook_tab_is_visible(self.notebook, self.TAB_LIBRARY): return if self.current_tab != self.TAB_LIBRARY: self.switch_to_tab_name(self.TAB_LIBRARY) if self.library.search_visible(): self.library.on_search_end(None) self.library.libsearchfilter_set_focus() def update_menu_visibility(self, show_songinfo_only=False): if show_songinfo_only or not self.config.expanded: for menu in ['add', 'replace', 'playafter', 'rename', 'rm', 'pl', \ 'remove', 'clear', 'update', 'new', 'edit', 'sort', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() return elif self.current_tab == self.TAB_CURRENT: if len(self.currentdata) > 0: if self.current_selection.count_selected_rows() > 0: for menu in ['remove', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').show() else: for menu in ['remove', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() if not self.current.filterbox_visible: for menu in ['clear', 'pl', 'sort']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').show() else: for menu in ['clear', 'pl', 'sort']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() else: for menu in ['clear', 'pl', 'sort', 'remove', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() for menu in ['add', 'replace', 'playafter', 'rename', 'rm', \ 'update', 'new', 'edit']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() elif self.current_tab == self.TAB_LIBRARY: if len(self.librarydata) > 0: if self.library_selection.count_selected_rows() > 0: for menu in ['add', 'replace', 'playafter', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').show() self.UIManager.get_widget('/mainmenu/updatemenu/updateselectedmenu/').show() else: for menu in ['add', 'replace', 'playafter', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() self.UIManager.get_widget('/mainmenu/updatemenu/updateselectedmenu/').hide() else: for menu in ['add', 'replace', 'playafter', 'tag', 'update']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() for menu in ['remove', 'clear', 'pl', 'rename', 'rm', 'new', 'edit', 'sort']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() if self.library.search_visible(): self.UIManager.get_widget('/mainmenu/updatemenu/').hide() else: self.UIManager.get_widget('/mainmenu/updatemenu/').show() self.UIManager.get_widget('/mainmenu/updatemenu/updatefullmenu/').show() elif self.current_tab == self.TAB_PLAYLISTS: if self.playlists_selection.count_selected_rows() > 0: for menu in ['add', 'replace', 'playafter', 'rm']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').show() if self.playlists_selection.count_selected_rows() == 1 and mpdh.mpd_major_version(self.client) >= 0.13: self.UIManager.get_widget('/mainmenu/renamemenu/').show() else: self.UIManager.get_widget('/mainmenu/renamemenu/').hide() else: for menu in ['add', 'replace', 'playafter', 'rm', 'rename']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() for menu in ['remove', 'clear', 'pl', 'update', 'new', 'edit', 'sort', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() elif self.current_tab == self.TAB_STREAMS: self.UIManager.get_widget('/mainmenu/newmenu/').show() if self.streams_selection.count_selected_rows() > 0: if self.streams_selection.count_selected_rows() == 1: self.UIManager.get_widget('/mainmenu/editmenu/').show() else: self.UIManager.get_widget('/mainmenu/editmenu/').hide() for menu in ['add', 'replace', 'playafter', 'rm']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').show() else: for menu in ['add', 'replace', 'playafter', 'rm']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() for menu in ['rename', 'remove', 'clear', 'pl', 'update', 'sort', 'tag']: self.UIManager.get_widget('/mainmenu/' + menu + 'menu/').hide() def find_path(self, filename): full_filename = None if HAVE_SUGAR: full_filename = os.path.join(activity.get_bundle_path(), 'share', filename) else: if os.path.exists(os.path.join(os.path.split(__file__)[0], filename)): full_filename = os.path.join(os.path.split(__file__)[0], filename) elif os.path.exists(os.path.join(os.path.split(__file__)[0], 'pixmaps', filename)): full_filename = os.path.join(os.path.split(__file__)[0], 'pixmaps', filename) elif os.path.exists(os.path.join(os.path.split(__file__)[0], 'share', filename)): full_filename = os.path.join(os.path.split(__file__)[0], 'share', filename) elif os.path.exists(os.path.join(__file__.split('/lib')[0], 'share', 'pixmaps', filename)): full_filename = os.path.join(__file__.split('/lib')[0], 'share', 'pixmaps', filename) elif os.path.exists(os.path.join(sys.prefix, 'share', 'pixmaps', filename)): full_filename = os.path.join(sys.prefix, 'share', 'pixmaps', filename) if not full_filename: print filename + " cannot be found. Aborting..." sys.exit(1) return full_filename def on_tags_edit(self, _widget): ui.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) while gtk.events_pending(): gtk.main_iteration() files = [] temp_mpdpaths = [] if self.current_tab == self.TAB_INFO: if self.status and self.status['state'] in ['play', 'pause']: # Use current file in songinfo: mpdpath = mpdh.get(self.songinfo, 'file') fullpath = self.config.musicdir[self.config.profile_num] + mpdpath files.append(fullpath) temp_mpdpaths.append(mpdpath) elif self.current_tab == self.TAB_LIBRARY: # Populates files array with selected library items: items = self.library.get_path_child_filenames(False) for item in items: files.append(self.config.musicdir[self.config.profile_num] + item) temp_mpdpaths.append(item) elif self.current_tab == self.TAB_CURRENT: # Populates files array with selected current playlist items: temp_mpdpaths = self.current.get_selected_filenames(False) files = self.current.get_selected_filenames(True) tageditor = tagedit.TagEditor(self.window, self.tags_mpd_update, self.tags_set_use_mpdpath) tageditor.set_use_mpdpaths(self.config.tags_use_mpdpath) tageditor.on_tags_edit(files, temp_mpdpaths, self.config.musicdir[self.config.profile_num]) def tags_set_use_mpdpath(self, use_mpdpath): self.config.tags_use_mpdpath = use_mpdpath def tags_mpd_update(self, tag_paths): mpdh.update(self.client, list(tag_paths), self.status) self.mpd_update_queued = True def on_about(self, _action): about_dialog = about.About(self.window, self.config, version.VERSION, __license__, self.find_path('sonata_large.png')) stats = None if self.conn: # Extract some MPD stats: mpdstats = mpdh.call(self.client, 'stats') stats = {'artists': mpdstats['artists'], 'albums': mpdstats['albums'], 'songs': mpdstats['songs'], 'db_playtime': mpdstats['db_playtime'], } about_dialog.about_load(stats) def systemtray_initialize(self): # Make system tray 'icon' to sit in the system tray if HAVE_STATUS_ICON: self.statusicon = gtk.StatusIcon() self.statusicon.set_from_file(self.find_path('sonata.png')) self.statusicon.set_visible(self.config.show_trayicon) self.statusicon.connect('popup_menu', self.systemtray_menu) self.statusicon.connect('activate', self.systemtray_activate) elif HAVE_EGG: self.trayimage = ui.image() self.trayeventbox = ui.eventbox(add=self.trayimage) self.trayeventbox.connect('button_press_event', self.systemtray_click) self.trayeventbox.connect('scroll-event', self.systemtray_scroll) self.trayeventbox.connect('size-allocate', self.systemtray_size) self.traytips.set_tip(self.trayeventbox) try: self.trayicon = egg.trayicon.TrayIcon("TrayIcon") self.trayicon.add(self.trayeventbox) if self.config.show_trayicon: self.trayicon.show_all() self.eggtrayfile = self.find_path('sonata.png') self.trayimage.set_from_pixbuf(img.get_pixbuf_of_size(gtk.gdk.pixbuf_new_from_file(self.eggtrayfile), self.eggtrayheight)[0]) else: self.trayicon.hide_all() except: pass def dbus_show(self): self.window.hide() self.withdraw_app_undo() def dbus_toggle(self): if self.window.get_property('visible'): self.withdraw_app() else: self.withdraw_app_undo() def dbus_popup(self): self.on_currsong_notify(force_popup=True) def main(self): gtk.main() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/misc.py�����������������������������������������������������������������������0000664�0000000�0000000�00000012355�11255764730�0015756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import os, subprocess, re, locale, sys def convert_time(raw): # Converts raw time to 'hh:mm:ss' with leading zeros as appropriate h, m, s = ['%02d' % c for c in (raw/3600, (raw%3600)/60, raw%60)] if h == '00': if m.startswith('0'): m = m[1:] return m + ':' + s else: if h.startswith('0'): h = h[1:] return h + ':' + m + ':' + s def bold(s): if not (str(s).startswith('<b>') and str(s).endswith('</b>')): return '<b>%s</b>' % s else: return s def unbold(s): if str(s).startswith('<b>') and str(s).endswith('</b>'): return s[3:-4] else: return s def escape_html(s): # & needs to be escaped first, before more are introduced: s = s.replace('&', '&') s = s.replace('<', '<') s = s.replace('>', '>') s = s.replace('"', '"') return s def unescape_html(s): s = s.replace('<', '<') s = s.replace('>', '>') s = s.replace('"', '"') s = s.replace(' ', ' ') # & needs to be unescaped last, so it can't get unescaped twice s = s.replace('&', '&') # FIXME why did we have this too? s = s.replace('amp;', '&') return s # XXX Should we depend on a library to do this or get html from the services? def wiki_to_html(s): s = re.sub(r"'''(.*?)'''", r"<b>\1</b>", s) s = re.sub(r"''(.*?)''", r"<i>\1</i>", s) return s def strip_all_slashes(s): s = s.replace("\\", "") s = s.replace("/", "") s = s.replace("\"", "") return s def _rmgeneric(path, __func__): try: __func__(path) except OSError: pass def is_binary(f): if '\0' in f: # found null byte return True return False def link_markup(s, enclose_in_parentheses, small, linkcolor): if enclose_in_parentheses: s = "(" + s + ")" if small: s = "<small>" + s + "</small>" if linkcolor: color = linkcolor else: color = "blue" #no theme color, default to blue.. s = "<span color='" + color + "'>" + s + "</span>" return s def iunique(iterable, key=id): seen = set() for i in iterable: if key(i) not in seen: seen.add(key(i)) yield i def remove_list_duplicates(inputlist, case=True): # Note that we can't use list(set(inputlist)) # because we want the inputlist order preserved. if case: key = lambda x:x else: # repr() allows inputlist to be a list of tuples # FIXME: Doesn't correctly compare uppercase and # lowercase unicode key = lambda x:repr(x).lower() return list(iunique(inputlist, key)) the_re = re.compile('^the ') def lower_no_the(s): s = unicode(s) s = the_re.sub('', s.lower()) s = str(s) return s def create_dir(dirname): if not os.path.exists(os.path.expanduser(dirname)): os.makedirs(os.path.expanduser(dirname)) def remove_file(filename): if os.path.exists(filename): try: os.remove(filename) except: pass def remove_dir_recursive(path): if not os.path.isdir(path): return files = os.listdir(path) for x in files: fullpath = os.path.join(path, x) if os.path.isfile(fullpath): f = os.remove _rmgeneric(fullpath, f) elif os.path.isdir(fullpath): remove_dir_recursive(fullpath) f = os.rmdir _rmgeneric(fullpath, f) def file_exists_insensitive(filename): # Returns an updated filename that exists on the # user's filesystem; checks all possible combinations # of case. if os.path.exists(filename): return filename regexp = re.compile(re.escape(filename), re.IGNORECASE) path = os.path.dirname(filename) try: files = os.listdir(path) except OSError: return filename for x in files: fullpath = os.path.join(path, x) if regexp.match(fullpath): return fullpath return filename def browser_load(docslink, browser, window): if browser and browser.strip(): browsers = [browser.strip()] else: browsers = ["gnome-open", # default, we are a "gnome" app "x-www-browser", # default on Debian-based systems "exo-open", "kfmclient openURL", "firefox", "mozilla", "opera"] for browser in browsers: try: subprocess.Popen(browser.split()+[docslink]) break # done except OSError: pass # try next else: # none worked return False return True def file_from_utf8(filename): import gobject try: return gobject.filename_from_utf8(filename) except: return filename def is_lang_rtl(window): import pango # Check if a RTL (right-to-left) language: return window.get_pango_context().get_base_dir() == pango.DIRECTION_RTL def sanitize_musicdir(mdir): if mdir is None: return '' mdir = os.path.expanduser(mdir) if mdir and not mdir.endswith("/"): mdir = mdir + "/" return mdir def mpd_env_vars(): host = None port = None password = None if 'MPD_HOST' in os.environ: if '@' in os.environ['MPD_HOST']: password, host = os.environ['MPD_HOST'].split('@') else: host = os.environ['MPD_HOST'] if 'MPD_PORT' in os.environ: port = int(os.environ['MPD_PORT']) return (host, port, password) def get_files_recursively(dirname): filenames = [] os.path.walk(dirname, _get_files_recursively, filenames) return filenames def _get_files_recursively(filenames, dirname, files): filenames.extend([os.path.join(dirname, f) for f in files]) def setlocale(): try: locale.setlocale(locale.LC_ALL, "") # XXX this makes python-mpd correctly return lowercase # keys for, e.g., playlistinfo() with a turkish locale: locale.setlocale(locale.LC_CTYPE, "C") except: print "Failed to set locale" sys.exit(1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/mpdhelper.py������������������������������������������������������������������0000664�0000000�0000000�00000006060�11255764730�0016777�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import locale, sys, os from time import strftime from misc import remove_list_duplicates suppress_errors = False def suppress_mpd_errors(val): global suppress_errors suppress_errors = val def status(client): result = call(client, 'status') if result and 'state' in result: return result else: return {} def currsong(client): return call(client, 'currentsong') def get(mapping, key, alt=''): # Returns either the value in the dict or, currently, the # first list's values. e.g. this will return 'foo' if genres # is ['foo' 'bar']. This should always be used to retrieve # values from a mpd song. value = mapping.get(key, alt) if isinstance(value, list): return value[0] else: return value def getnum(mapping, key, alt='0', return_int=False, str_padding=0): # Same as get(), but sanitizes the number before returning tag = get(mapping, key, alt) return sanitize(tag, return_int, str_padding) def sanitize(tag, return_int, str_padding): # Sanitizes a mpd tag; used for numerical tags. Known forms # for the mpd tag can be "4", "4/10", and "4,10". ret = 0 split_tag = tag.replace(',',' ',1).replace('/',' ',1).split() if split_tag[0].isdigit(): ret = int(split_tag[0]) return ret if return_int else str(ret).zfill(str_padding) def conout(s): # A kind of 'print' which does not throw exceptions if the string # to print cannot be converted to console encoding; instead it # does a "readable" conversion print s.encode(locale.getpreferredencoding(), "replace") def call(mpdclient, mpd_cmd, *mpd_args): try: retval = getattr(mpdclient, mpd_cmd)(*mpd_args) except: if not mpd_cmd in ['disconnect', 'lsinfo', 'listplaylists']: if not suppress_errors: print strftime("%Y-%m-%d %H:%M:%S") + " " + str(sys.exc_info()[1]) if mpd_cmd in ['lsinfo', 'list']: return [] else: return None return retval def mpd_major_version(client): try: version = getattr(client, "mpd_version", 0.0) parts = version.split(".") return float(parts[0] + "." + parts[1]) except: return 0.0 def mpd_is_updating(status): return status and status.get('updating_db', 0) def update(mpdclient, paths, status): # mpd 0.14.x limits the number of paths that can be # updated within a command_list at 32. If we have # >32 directories, we bail and update the entire library. # # If we want to get trickier in the future, we can find # the 32 most specific parents that cover the set of files. # This would lower the possibility of resorting to a full # library update. # # Note: If a future version of mpd relaxes this limit, # we should make the version check more specific to 0.14.x if mpd_is_updating(status): return # Updating paths seems to be faster than updating files for # some reason: dirs = [] for path in paths: dirs.append(os.path.dirname(path)) dirs = remove_list_duplicates(dirs, True) if len(dirs) > 32 and mpd_major_version(mpdclient) >= 0.14: call(mpdclient, 'update', '/') else: call(mpdclient, 'command_list_ok_begin') for directory in dirs: call(mpdclient, 'update', directory) call(mpdclient, 'command_list_end') ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�11255764730�0016124�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata-album.png������������������������������������������������������0000664�0000000�0000000�00000002361�11255764730�0021217�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���szz���sRGB����bKGD������ pHYs�� �� ����tIME "\z���tEXtComment�Created with GIMPW��LIDATXýMlTUt:TX["`ԏ5n\(Ĩ$~ .4n\h 7nH4D(1m)) L˼. Nۙ)gs9Xv8[^ RQ KB@) 4Q16-}8sx`pIB(gHc=[__Ip�Cu׾9~a ͮNi͹g[x*)kw@>cN拣3řtzuE]5 <\q야OZ/n*;V#jغ& twT2d5ӿ#,(b鱶, syƒYۂgd tp�-A5+ P%[#L�H4p�/tw_-G:pG#<01x?[ܻnsU+A(Y i`H:Z,cb *l`cC vV-xNSX߅lV laWG\V_[grf"r%lorƺ)n.rz]`guL&0kk s159n FkŠ ߧ\,B`BHU=|O)z׮5F, p˹V^ Ԓ_]͞Nzڛև4# ^э7>Wd,X4ۃz# toA)zӅjEGQ7ɻo+/L.cߎRH B1ʤB2W$]-miHe-<;9zxZ=7ds@^_șiзeH4S j);wLƵ_N5{KHYVYIoGH]Z80D2 ώI_3.{?*R7ekŬ4)qJ#khaB ^1P#~x�L'J&Ἦ]􊗭ϟhk�w77^7:88Sl;s^>]ds 3C5-_=ӵA<tDB7.G_wl3VWxn{Cl_cԊ-=q����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata-artist.png�����������������������������������������������������0000664�0000000�0000000�00000006653�11255764730�0021435�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���0���0���W���bKGD������tIME F b�� MIDATh{}?̝s{]zzm1RR`Tj"JPF4QDg(U[JiTjBIRJ^c^>>uc>6 ?ȣs{5~'8|S.NdO+ _# Ua5FǑa))^3=O]m=<zOi!y1Z+LOMjD)M%4[-5ݕ~dͿ^?UsˏesFN{%ldJ(ZP)a Dz+ʯw;͏~sV* Հ')\\őŨ4!Fclw~tVɟ÷U?zj)b@ \A<  i<@Jj7+|hZ'0W@^ɏJ6j##Ց2P"RHX\ܡG\d&,*Z++۶NM6:K+P,qI'hpR#!E7iԥ1^tz/`#M`-4>t<r/&[Ax �) XSYL:Wg)T .ayWRp2`x/y2IRX$ �Bfq0"`@0 �qbGS{KBQb9ͳJk!G>?^)R"2AR)4%M32PZt0,mҘ-UFX`TyۮkiWW{|WIE< V"NSD(t$=ˎ1͇(=~ 'EuHNi"fvRr~�\I^7;}c9B x8Ki$ Q }SjbM,nBbMd1q 7nu˜:Rq<�}lqQ zADEk˾\.QjĨ>+|׋c8AY %[D8>BQ),R^N{q[r ch7c%ESl"B@z ]tԧ|$}U�T$? n$i&%V&`L2+"<?D>w})-/WwN-u^{l-`q\0֤X1-cV%XU`5jk^Y&.ew;˵Z'"+fdo^abJ^_D z}9=䉪<>f Fa>6cU, ͻ<씨rVfau582>;Ƒ m t>ZJV:m!V#1*¤=LêVB4q1g3?WkJZa~M@±@P~Ź.0l05Bay`A!yIHDwYmE:ރ{v9pc4R. |B%%5ŪXTaiʎwC<pՠS08Fklߺ>|ڽ̡T`�C8.M 4Ksm2mhLZA ;7n^sD%u4V�.B<JZg5`-XkРR <_PzR|蝜8qm%nycLI:UcggOdo;,_[Kkk`0v_"Ϡ0Ŗ +U\΄DFx?/n['Tp{kO:W[Kaэր gk0~ų2O&_=2AXMT$Ksn->ǏvHʑSA\b]ΗLN"NYS Rg޽7QG8aq-Xe)zZ4Os8xJ~vޞ쎱B|z}?/zf3@iǬ8TGkWc/ clfFcY+ z[ko0q�~^wL̒jvJ*L[9BOl؜nvݸX2#FIk ak_Vغm3j ;JW)3ls3.. [!;K}nL/ؽkkE<q B*8J`9GvSR{6҅ͫ=zeRMqi49(UE-))ʩ[Pǎq2KSG:MN>o*V-`-֚ CY ,7WÐ0 9($I!5,6Z?@ǎ?Z^hwΝ{LOclt/!NzB?J1zphX0Fc\E/v=X3ڰ2XJ?R p$Sq, Om[N8l qmX#b_ƿ;PzuS%~rEů,A8TQ*Rc��+sc@s>G܍�G8Z8O57;-5lT:_sj1];{Ȯ`-v+Yp\4X-k � ]~<2cŲwpBk񬵮1ާk'K/Ѩtsa _xpt}SANHG,57&@\ ! B hzd|lbV<k;zM^8>|5z0&P&`I%6_WbCpj:2_hqA['qcbGƙ&�p.Z%t{qch<"r7&[jqnjn7ɻҵ:zeXat{5ໂFY2ֺ?2?pgl 7_FvlJ,vMIv^ج[%&,RZo}yb<rhP df_V)V+�8ZK(+(=|/m5V!F-~.L>B8#].kecNJVz,6ﺊ�VƨWhH镭5ָXXk% FH%̄IܚSsM�[$/ju6m "d8K~kV�p9@r>|i>byMP ����IENDB`�������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata-case.png�������������������������������������������������������0000664�0000000�0000000�00000033647�11255764730�0021045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��X��X���f���sBIT|d��� pHYs�� �� B(x���tEXtSoftware�www.inkscape.org<�� �IDATxɎ$Iv(ث(\# ??л#Y,Ƭ)2=^Xz$*v@UKkͿ˿q︰ݶ 3w3M^G3>ϑ׍>gY{*f̘3<Iz_-gy9߻2?ls>{w-2-ubon綘U{]I}w~t}1ö<_Xv=<}-wxlkџYó>A%dqs5}}ßY朠n_<_>}Ob9u~Hcc)>"b_~I?8η5ߖc{tO51mcog16|G]ϩ ߓ21CC;Ʃ9x|t;亓}}4QOQ_Gyx:#_Ǿz>W_D]+Զ0 BPF[CyoJ_O%œUݡv]>92e0xƐ>9Zk C 1Ϧ&Fb$k}ro'3g[ư1|Ke Ɛ߮c^m3XC>1kRSǼlk n cse y#: KO_wŔ6K#*`a~sϖ1 ֖0x`͹jYI7a[Z5ml9ð-a~u$`hVlz~sv[C6axlζ1 aN}HZI[s75ir߲?)mua|+bjCz{o0ưrQsX_cƐ:~OEE9/_VfǢ[x1[9կ1 ٖ1Lk}W%$mOOuc s5f S{?CbCj_<=0羫mMښ_1x1KC7l_aBe.Rg2lp3<6g[[C~sql1<$R_b5R:4uoζwl[9s0c}DCBevFajeǎik97g[k;xT%B 2 j*LC959ۚk C؜mݯ1 =u~IY*ԺɽY959lkcLFĝ5X։+6g[0,6GcKBO:`u/u9p %59Jaro bs5t 'Tf(:X[q{ζM2WlζC<92c_h](Z`na K%{P{7KRʖY Ğӛd~<ml9[눸$`0K'6S9[xZ_cvs05]k !bza *+'v~axlζƌ!Ga~:Tq&(!Ykv,I5Cr5v_*Hʩmj7 Ο뛤1<~rϐXxlζa RI8[iX;i oO_ةmwmo pT]ona*s>9*M2W0Wsϖ1 V1bP]~*<4879/6g[Ɛo wO2 }bs#iKix|o51hc lo]D\Fh54:K5ۃklk~_l6 g[k{xaRRKJ^x7IcrQsX_c_٪7Q mKI7g[[]D\~.&0P2 ..PO؜m Cߜm1b0[zTfNVc_io ǯcT}Iyj79֖0mx0&鱻'U48 4==q7[Zi+GƐc}iROlζFR=j59lk~K0,v cX߶7O.ivx`Y44KUqU1hưVka$U׉k%K(M2w0<vj[PR[eD|}y iܳc>$Fo yڐ7g[%.">DG5\B%<}c3U›dXc-ܻ1 V1\GĻP^к+uYcoO_ô=g[Ɛ "}4U"(=X5RҎc荡olrNcEn騒g:7>\خKbF+k=m>`c 9s0^F0&kg2i-}<lk~inLC~i1 {~Ylk~Km ^uخel+Xx{c_{Ͽ1\>h%]kz7mp[xaJoi>'6s%%mO/87sC~=a:oZ:ej|oSbsv9V cJ8si()imїomc}?>cHi.LCصrcs` DZ xj2 k'Zb19s94[ e!i bKzk{c@pRԱfFih;V؜mrsx%"3Vs�G&i(u-{o[a c+޷K KJڢ79 !U"S2 R:4uyVۧsxƐXY$7oaj2 k}lk~KC6m Cbd2 m-|<~}cCIcT΃-$Z4֖>$kÜSs(cXZLˁ-Vcs5j}k[#]D<@64ؤLCaucX95ӱoCb,([RgFnpa5<6g[K!Gc/l^6LC؜mLZ1_ζUD|M1 0AejxV ֒,Vp/"M�`q=Xc5RPOôs~9Zs xZVĵ�:*ӰY?`r1hc ϡ1"MY&bVE ZcQ>$KC6j{9Zccv8iX{vix%% 0)!s*"(Y2 K5&i VsUj[uD|6^aYLXauncSڽoO. ƨ2 }bs3ikqNV5;9#ﳲʨ2 RMT>귆1y?5=."Աf ('v~a6l,/#[؁ڃ5I %~L֖Ɛ<Rۺ tiy9Tl7%ǐ%<%l`d2 k'm[ÜlkϿo["hD @Tf2is;${uw6a2 5%mQU-ahlI?xoZ6mR>9ʑ%4< oyu\?p)ml98*2944KuLCV[rP"WaO4MŕiX`9ѥ|H֘1hc ϡ1VgwC, CcKPVW_8 4Ժ@>sk d[k;L84,Be$<!xc~s܃U,՘1DyV[{ 9{_G8[:Xj8U՜mmi K7G[ëobKpֲiI[at9*_ cH\@d*P,Մ2 !%ǐ-<5ưo"M�_a~|?$7g[1hc a1&v? 2 }bs{v9&}N9bC6:ˁo�Тu{lp‡乌{Y+bTbd!g9*u C+k|e4͛D �=܃U,U^qnc_{NM+0Q%-RXaKK;Cc^׉k�(kۚEYk[<acz A|i(i*C>9An5Ga_Eċ8v-�TS!W4!'1侟ZÜcJ\D4VG:!76g[s!GK>C5窱̧uVXˁ=?p4pYOs�dԹkv;Plk1|_X2 Ru!|VWlrUՇD,�3YLCII[n)>\cxVy�f4K>s2 kr琳ϱzRaD=^O=}: f-PrSVcCWc!qM.'6g[S:o 9(9}47X2 %R=.Yo s9=ob.zz-P/֩1\G_�(S2 Rm}oζpkmDFvr%7oaj2 |o~P=X[LZ5ml9=Y+�*pS9he.'6g[~ЏƷ$[�XLCc~~1guD|eI.{RJP!Z?V~ob?k6q�VYK[W½Ǿu" *'6g[s'mQ؜mÔϐZ/L%%<i;G%{/ $*'uY4Ahc턧Ol>DE|NP2 [Tmhc ϡow%AmYLC9\OlζjJV漟C1Ei^'r%-,NX:c�4,֘-RҶTsG_iv8�6"{g2'Z~9X|h^,˅Cb4_ζ|#?i.A44K|r,o O~OC�Աf ('v~p/ opfzz~su6k4׉s�2 5/vsH} p&V)ӰvA?$vH[9(9LsDfv�Tf2iczo |ejJڢolq?CbK/fv�L*'6g[9DG-o1iH|_S4T6K-$ s;ofv�ZWaD+u%ᱫzi8TrҳcCĻ4Դp>srEDfv�<*ph T 'Z[KrQsH~MU<�g-_+Y2�` T'6ה,|9n3;�Ce)'6g[#g5zWڽ|bMA,Kf*Lr5ml!>lf`4oAd-<E|8� .'6g[g~*-:;3>?E|�i侅K{ >)/�0XԱZfNŶ(9ᙻv5]+MA�9Y^q椡ol6jN8oc_]z�ff` IÐZ=G[#_ո`Y4,Ԥ-J췄g)U"�&ZaYelkd%G>o4׉s�E5er;LC3]cFM쫳&lFicZJ6j}cmA2 5-&fgUR“SǾU_�ȩs%%mO/8V̐Kډ~M�0ej|)Iж~Į95�04EIжbjyh�f7K>s2 -!Y9~3D�,b2 %R ܋UR;Y)-;9�XLuere$<s~Ji>&EM.'6g[SgǞ8V̐m"F\&`q4{Pɽٙk'<Ccuω�XE=XSϗE]3SbKKr!M �Xͳ,U1DICخs ǐ\Pg%%<K&mQf7X>4c\I�(3Xk'<KۢaJ9ڨ%�{^³rK;Ֆlqk�h݃:Vr`Dd%G5<OO�@Q:K50*mvfL[9ڨ9\D'G f2lp!Y~JR%W�TcP>9ۚ;i2fg[=,(�U\"uj2 }b{:eA�9*ph T iX2Y}?kRI�؜2 [ThYT[WO1�PE4􉝣הhYTUD+�j\"rk%+&~2sfd/Ӱt[c/YF)Tc\]&b:4=K9*!YFɉ UOlζr&m-J:c~NOZ44Kc{3=5̰"+�6Աf ('gɤa"�܃U,UWlhY$W�l*eoy?k'm7_\iiX{v,NVJM>]D[4D�)~*g T4Vɉߔh7x�؜4(!Yߘ󿏦yMTOlζr&m~--2q�جIeJ9cLOJJ.ω�`Ӟmyj`:[T#?�yeJrbd%GkRbEĿGtf�E4Դp>mjJ~Msh�£2 p5m=KzP&q�O<K5f |,Um~* �ge2 %%mOOukiHLˁv4d)'6g[#g5zq?Ti_$:_,UDk'GkRC4͋5�pT%ZK,:hmY\OlζRirK&+9(miQv�8uVXT iH%+9(miQv�prjJǦ&+9(-ѺUQ% R= oyu~ V\ET�e-Ӱt[cMuTL ˁnb?su8�<qr뾱5,-|J6֚jkTi)0W7YFiK1�]OlζrΎ|JTmF|�N]$̝6Kzo#m��:`M=_RҎcCmxMK�:,P,Մ}W]$UcXr+v:�xg:��IDAT:4�==+)Y2iIRˁM}"�`2 &m-&+9Xk*S8�0Puerӓmx~�\OlζΎ==qlk$mD<�02 .'Yu*{�FkLi?F8�LЫLCT4)qh%�&Jnr,U2 m15-~K�yk -$+[X|89 �rԜh8?6Yi> D�@&i(iv,%+}+qi%�uJ+ajjHg^-y]� leJʴY"⏉X�`4VΤŜVζ) �,jPf&bY;$��fԱfzJyPrE\$�ftTa T7e74/�-'v~O\')}*1"~8�, DKRb"Tjd/Ӱt[c8NJjj{_]iX{j,VDTmG|�4LC؜mLڞ:,U*SDg<�QeJw}Ww6�܃:V,U2 Nx7v4<+!Y<éc%R~Mu]�`%i;W' SJJ%bRaٱS-_*i+3�yS9[\8Khw�f+PRvBTm&� 0LC؜mIN? iyu~hD8�PIeJ{m4u"�(Dʙz~-&Z<e4͏�@A:4hMm{nvO[{9K:�04԰ߢYhA�{TPmˁRg6s=�@=X5RMH5zYy� 5{%mIJTC}L� LC؜mm^Eˁ¾+�R2 k/-m#]<|hD<�PA?3J{"D �PelkvllQ,U*6"O�@3X.w5chi�ֺ+uomZTm- fTaY1K�GKʝh==qlYXK�Y4,V6JX<{`3N.>}7vƥ,m^xr뻈A�؎j4/j;'K�-4V6j;&"N�{Vr x7vh[`:`M=?5iBж, F,Ӱ,1矞8cA�ذ4 IJbYyK�qi$Z`f)Ӑai}`r!K�p+{oaxCc- h݃:DDwA�84MÅCz:6, k!b"?, UaY1m,1A�83MKi(,D̳xmD|h�ذ=XK'>ky_GFtn��r,*k}? x=6[4EW�Val4/*"l�ضleYLYk�ضle0mŅ4M"�Ae=?_]<<'b�32LC}Pk}[EDk{țh#ss}D|:�QfZPOlľb�@<[2ƘOOukj;6�2{m5gRv�@2 Ǵ~/M\M4Ǯ�LCiT7w{6�O*04vY?Eܦ�WrVo5K@<0�pNJ볩YI�=XS6he.pv�U2 .f*Zv�ler17 6ml�NyS9cm,ݳTmml�:M.v|Y4"6�]&i8:gmo~M!�Ie(Ѻ?.�xO:v꺒'~{v�2 m5jjK;GLj�iS,U2 �QCs֘-opMC�6=XSf֞4�@4)i*Ìhw`�SzixzY!|�W%gNm+3VǾ8j�2 6ıB�6K.v%mѾh�zJZg&i.��ٚwbin.�8%9Yen"I�!Z+?=^,2 k �W-Rulpo.�WKJ^~M �裳ډ\I[\]DċT��'DtNu�Zk T=EӼ �"k T=b�X=Xc5R !mI�`magW�,iX+њhG'�2Z/.�dp>9ʙED|>"�Lih}|v�{Rj:{qqww~�=XR}\\\]�=XcR+�`UiݻX�9ROU�0Y4W_}u�0yP,U[[o߾>�˳RŚ�ֹk5>ě7o�S=XR믏��xxy�%YX{�ZO^]]ŋ/�X¬e&�к+uY777��2LCi43�{_"iv�XR2 R>܏:�[LC>h��uY/_ϟ?�,-9Q_gq�R,Raٱׯ_ǧO�![>9:L^�%9^,UwŇ�2LC؜mI^�To^\\ě7oRC��XMrVܳTc�O夎MxQ��k܃,U/_n;�`miș=(�4۷o�LKq�R<+u-iׯ_�4ŋk��JQ\X˃�@zz>؛7o*5�bti( �@ N.T*~��SU,Uk{�Z<xlrzX.^x1�2<ǿWJ=~!nnn��P~*'x-�5yeixpyy޽k�@a~N~_KJf��js0ooovxUq��=XM\^6NPիWq{{c��)z/^|QT{*%*'ulzX?~?v��0?`U="�K~6�J.]իWW�JHln�jv`=Xև�Jպ+ulo~׍�5aI�ڝ܃:67 ߽{777o�DJa �؆e$Z.~7�PY4͛}��:Kò<�l2 9ix{{o߾t��܃5|O��k-�[ҺDT=x�(e^~<�PY4U �ؚY4tẼ?q�RM.'+�`#%�^\\�(_2 s2{�lUo� sTk2 ޽ �P Vļ+�`)p8;vo޼p��eCi۸y��;>Wv�Š2 }bOoN]�=[j{Dě7obMc�%`ؗe �8'*'ullu޽��܃kǏ.-�m2 sLC[ �84*�/[a�Qen<�4v�E=XSο> �Ueò<�K94�4DD|)nnn)�@%f+` �8W4tJ�strRn̷ �P4�ՠ=XCK�sջLÐzXw �P VĴ}Y?~\�P4{�Y4�,e]]]U֛�ɳ?cs;�@2 s7Lén?~}��U\7 ?|L��IO夎u �cB˃��{R^)��'&Zs�@ui<�L �`r Ir�2 4P �'{�`ubI��~1L}|i�2 >}n7�Tgr��\+�&i �ౣ%ˆetk��u+u+�c4ò<�ps, ��ǎ`ϟv�Nr+��l<K��:* � {D&nnn=� *�@Aelp�܃:vZQ�v?Ӗ\ϟ5�:J �b4H��N\r�2 f��NT.+� *ۃ��Z4Y�k �@2 G%X��N.>Ų �[2 ױ햻3�J.` �e�O`�Z"�Y��j֫L+�3X6�G�UA�_g3X��tTurv � ��ui<�0Lg �0{H��96+�܃e �`e$X��Ý\"Y��*wrP�0O<`�pL7�{noo!�{,�ӺDx}}��l%B��D�Yk �8R#h��+.V!�%`�/Y+�f"$X��SX"� �@f=Xf��Ki`�wT&Y�~^�Ls]�0, � �@f`�df� Gev]vUo�v^�L([>��6,˃��ә�L�%B�`I��D�ٳ"f��r � �`g$W��yH��2`�d&�L� � 4H��0� � 3 �@f~�`�df � gf��rz�?�  �@f,�̾\�e;�@f�23� � 3 �@f`�df � 3 �@f,�� �@f,�$X��ك�,�$X��I��2{f�@^f��2`�d&�L�M���L� � 3 �@f6�df � 3 �@f,�$X��I��2`�d&�L� � 3 �@f,�$X��I��2`�d&�L� � 3 �@f,�$X��I��2k~GD|2>WUD}D?+�/aYI7�l%B�$X��0l<����IENDB`�����������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata-stock_volume-max.png�������������������������������������������0000664�0000000�0000000�00000003004�11255764730�0023407�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������������bKGD X��� pHYs���H���H�Fk>��� vpAg�������xL��aIDATXVMLS[>[PqB۸R]HÂA"BM Ah"@47J@ &HMZ ܿy |d{|̹_zrNΦM7ONNNz5># 8KIgΜil% @.^\9fc{GvuT wV+B#0yyyyB$IѬ�YF�`TW9rJV[w0 8#?yz��֒0}&[,+yP,˲,jZՕVSS_ɓZУGëhqֶ6V}h쬮~dӧ 킂>kWd���@VcYU*;;;;;ܹf.====3W8$!1p cbwOE괴H4):Xssԯzkt DQEqpfhh �c}lƍ*lv+Tvߺ,#4:J!L$ RQ'777`i*YYYY$IBB0HCy ecI\9!/^ 1@QQ̋1n7�Q� H&>rtAUb BdybB ln$$!Bbea^ D ^�85U@Xa,L331Fϟ@8#IJ,˲i4F(Ҁbx>e�0&dr2>L�avǟ; áXF(ǀЀi $jj0ə޵=cY9p�FF~�2�0 �oKh4Fc%B;߿+/oژX&&L~�!�OYd6e*caNWd@PC]~]}ξP(%EpQ,c<3NK բޮ16e}uin> AQ2J�!^F"wl[k4ybyfsmݻ+رCTۓ}�˺\.8ॶV0qUUee Cs3B]X(q妚Ds0!� _x-SSoLOwv45_ LD(#{v\\Q-K5eΗh�,==N(*�\Y=kčgtx(c�n <^++?Q~1Yr���"zTXtSoftware��x+//.NN,H/J�6XS\����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata-stock_volume-med.png�������������������������������������������0000664�0000000�0000000�00000002372�11255764730�0023376�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������������bKGD X��� pHYs���H���H�Fk>��� vpAg�������xL��WIDATXVMLSKs-miZ@#BŅ;Xv.k7*jaAB&h#BM A+ )MMΟ! MMn敿>(䜹w|33` b'{톆{왚jmmiiiYZJ$cJ'Tj"YeY6 ]˗Kz{N)J'^qT*sw7B�bSSS׋bo g^fXUUn(emLYeayHNuB!ZVrtu]xv˗8t۷�C陙W6IRJ"ׯ˲$qF-x^s8nn+5JGG�qsv.[SΜ9yy<t:N{{+WZ!4Mx@`l,JB>P(-  e*#^or#dcr•CHu]׹+WB�0k.> @ikk B:|6J}0 0 c)%dvR�Gyc0N&P|^UƗW<r/-$k;" PUUEH$Il6m- + qB)cl{�< $%ϫj>ϬU4M׋Dx|a�D"XC\$r,y#I� @)BoߖM ~lr/<ii- LLLLÿ36m_b#$dJ4f_oYFPݿ?81g2L:x8<>WWKR 4 cuu78G}qSQEQDUTL&dl6zɓ@yf0t7?_(7 HR4FŊ3 v;SL}\ݷ %.2?ϊO f+jnӧacͲzѶ▐+M~<B)!NNNMæܹ]D֯<8 s x?#PUjw!�_yb}X���"zTXtSoftware��x+//.NN,H/J�6XS\����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata-stock_volume-min.png�������������������������������������������0000664�0000000�0000000�00000002075�11255764730�0023414�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������������bKGD X��� pHYs���H���H�Fk>��� vpAg�������xL��IDATXOAgvlK%i(7@*5BKALA@A ăpQӤ.5D 1TBBx{yyo|73]RZ>y23kMMW^qpJUz<R?2M4Z%Xld0*=dOw 1B c-@><|V0K+֭hKs΅u]P(w@ݻ�@!&'ĄiNL `,6<~_B ޮ:A0 0N~82 QJ)gxb<(B`Ë}}xUI@:D#ς\ilDRCȲ- 2!"x!>cƢъevws_Oƿ|fwv<u]& G!8c;;`ۅmPUC!P�`۶i!Z @)LX !@ ΅M_uB  y8CBRJzN Z*ԴuQMHy;8W"�HSdz-P*yƆ|p^1bcggfg{ٳ ro.-%KKBmm  gZ*[B߾eYe\QEPL&d/,~P[[{{[ﺄ@W %d2魸w dL3><DZ[#1؅\dRlzCMǏ;;ssg,=MiQU�`B8t:mYBp˗++ѣj2a|ʃ(tws}d*OZ͎f���"zTXtSoftware��x+//.NN,H/J�6XS\����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata-stock_volume-mute.png������������������������������������������0000664�0000000�0000000�00000002457�11255764730�0023607�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������������bKGD X��� pHYs���H���H�Fk>��� vpAg�������xL��IDATXVMLQnl6*=@p΁֟PD=jH-^L$h!R &^8jl&&i[_`bULC_ffy�pddtw=vȑ/_D7oF]"˒$I7oB`ݮÍv�l6z �Hv=�UUJl>�zz._tmM;wH$ɆP>?sD|lT*JEhizjeYquyW��M4M3t@8<0�r\.Woo0 Zf� Ξu8cnC[V;t�EQ/@Bt:v:$IeK%Ǚ$I$WZY_>~e.˲ƺ,> ˂Pk@(�p(aDI�˂P.#�F^([(,|WYޫ=�rD-@�1">F`((�#_T-Z]߫n��IdfeY��8)8 85!f# XPGFGUs\n}ŋHdn\XjEj,Wg bAliYZZZ8sfyyye[[[[D陙�9NSB֖<$"j0  T*JmoQ(<}:;ɵk^^,˒xдl�A4 ҒL&蔦8�r\��>꾅(*FQUbXLUd2480(cO[[##詡w!<v(4~ߏXNW4@:(Վ +~Q3f4VdzݻIjP, ء~DQN pN�`z f�^Ux5(b=qG<~( p#Z,�kk@ �iy'D3w䱎u7` WYdonF͈$ɲ, L&0:$T*�2@�1Nݼzxs_?#GB! BΝ++++yB67F~o#?���"zTXtSoftware��x+//.NN,H/J�6XS\����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata.png������������������������������������������������������������0000664�0000000�0000000�00000012013�11255764730�0020114�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������>a���sRGB����bKGD������ pHYs�� �� ����tIME8=���tEXtComment�Created with GIMPW��fIDATx]Yl\ys2 }$JR%rdתmY%5 RMA %hi8NְDvUXǒlY]2%Js3s.}93R8et~,νw92eʔ)SL2eʔ)SL2eʔ)X7b? .s�!� +!;&n#,~+sE|V�zȫX@SxaaBeLO1,XDM̔ }H-|\LDP}g�>f@֮LQ� -!c-XllSpUw@ �YղNE(V`6b) ,X%Z P@S@cr�4@6Ũ�9d{dE�|�> nV%U;xjsE�ʭ>4mXGÿٷmMr<M{AӗCz!:y}v^f@ze ExE2dZ'ͪ0Pz/�2mEZj%X=�@7,›V)��9$;f4rc e8VbPE*m-CD KÙǡۥtm㵭Š�r#WT׺hLOc}�[& rTК:5V\юU +Q|II膖B�KZW �:x4d_?*w@9,`qH �m)͸ ��]:1$zO@S@4>d*;5IXx@ Gi iG[@#ޅQ�w_>Lv8nm35 dJ �+]@X�=s4,>}<*0X󵨛�*, O4;��8g'@Ptq{c=$2?rն>f~z!T@ 6A71A s>{@}Gλ �s';rT 1�@zO]N>Is(674"j霕t'GH2$CI'H@q'>OAͻ5_W�sL& %)GI௓ ؖ߼-G+Hq5w5(~ز; E9*nw pm9�0 pAxޅK?|]FF<>W5}ݷ,@EEyXE#k_&ʜx�<E{AZNQat?4!E9 e�8ɱ3O%u%#x=ERZ<gEݵ) o*02[)F\gQ9ii"+�d}*zO[)x/[[ ƚmȵ$H@Dt"vo$?!yJgs=jZ|"=3fcIU $? Š=eӂBpzߕgH+2Ȋ~99z(/*p��ysfp"�s/ʑbȦ`oeƟXB�� sּzr/_"-ʿfgF'W)YLJ(o35(٣]JZ xmk#0%5d)Oz?.}O$ąki6^ۺU-S2� �s,*oF[Sd44p9I!Y `լ[f\`�X6#$wp%C0j76#P2heh+Q7ͮ$ 7+$eRxC.C"f\g:[^=^܌+ ŕ3|}p__/^g"Vk,m@ƛtHfۗ?R&J\[+UJZ K)&[lٲ).r@<�2VTuXe )|($I=��ꬸb,'VkMJCȒ09h&@C˼E%�kYez�]ע9�?ӅHc V`1,F@H^;G. ->��cAE%US  y0>cB4�&KƊ� X\c H}QOW)' )sI.E$־a Cu|mVR��$9'cXT`ٮό,HCT5`<8kQoB%h)QN.�F@ =ޅ>MI5I`I_LB�]x4#{  |hVb e >;ÿJ6X<r�V9 r 7SuJkt0w<<O9ogX^ۅk=}<LP1|ڈ\oxNh2� 4w!z9Z٤pK-+ک/ȱ5/i&`i[Or�*"w(dS42D="DZ&Bb8|E{@ _uϐE"uO F O4N< 3ll~� "G> sZkP;zz+�jY2k22Q��goSd'ћ/fߓ#BjjTh)o]" H`>}f0K�H$Hx}҉p.Yi.#GO}s\!#P 0oly M:@4pGswygţJGSNGVP ن^!',`9~x<"@" � +Ұ֖00H}o+J;0ut#+<(]`\�i _?HZ+ `%UE9Vbrt)u;XCbl\=Y�<DHrlFfvoÌ)?âwv"@Y83fxӐd}^(Bh/䦥4 Ob7�: (Y{`KgwRk +ּ߿5>Ќb4|x r #ϋgs?>C]pWֵzLkj�1+K9.\q�7Shzb Y oYׁ\_~�`� p=#jQp|({ދ|tI3B �Ym3$Jn 4smֶ֠RkJnnFdՀ`� 6ϼDF 4c++)yK ^z;yܱr&u8ǢrK! >󱳔$@KKusm}+m<#ϲܯ>ԍmWlcEe-[uTn~''zO@ퟯedwȵٮx[ 3�>[o|N^Q$a"b4|YEvV\q7uH_㵭ː} &@ڼz�(1{Lk9?&& AởU4l4eoeU�LRx(42ex[+ yOr\�J՚׬!gZrP)M_lMuc @z F'.�p @k^B�? 2#':av2a#1x{P\�cgZ౿]-[,̵Rx8s1RH'�D&v^�B&@v5޹0p,|Ă w}WD[pL+g* +0w@ <%QܱQE%T"JXPyɛNS4J��xc&,+j,epX=�*Ç4? Ҽ"k0EF=�< *ȉ]K�X8_ B�*(#crb1p#WRhhqM'oQj \4* 5~ C#T 0 #oӇ-kCU |!.x,/u\S0/p'"+?{"+sz7H FA��"\ ,#+_=c|~� �i\rj"u[)?ikT4 C`1c˵ŕyDhλ/`١\Gޅ6§yMi4"j6qٛCIW Nả �h}I_s2�Y#,"Ixgi|?{~gh �$H$eLCն~]xs@aY_sy%+ 'M | : riF7܍orm0^T\ޟ�)ǀEO5~T<{>M=-dSI" eܲ׷@*ԍ6.dEnApҎys;F={AK_H^3 a\{ZSg m_@fԍ&@Z $K�EA! 9 RFdrdGG(26]93~fXM,.3Z{A] TL2aNU45Wfr@b$�ȉ9^KRζhm2eʔ)SL2eʔ)SL'1����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata_disconnect.png�������������������������������������������������0000664�0000000�0000000�00000015362�11255764730�0022337�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������>a���sRGB����bKGD������ pHYs�� �� ����tIME*p1CZ���tEXtComment�Created with GIMPW��MIDATx}yxClKmݖmlK2@&1!y2{Llfd2dg&Ilfu2@bg7a 0%�}Ƈ,aݭ{nI-ɖaSUUw{Q/////r釔W/ʩqyEvO�38ާ}�|xƜ F�$(_( *Ͱ(0-Y{�WOnr si> |r@ (%ɰAT|J@y�Y[4D!a> V\EBQl]'��"b��BbZ�OΙo!Dy 55@@>�Z1��V`ESw̘, ?�!gV?f�TK}�dF)n@dgi;},[jn@c�s BU`( -^wgTc�J`sZf$ZYR]/gVYH +!d9$wZLp ?PTq>�2 M V%`i殔 W " p ѷuwPd篳Bʩ>�2" Q}`u.<WT`�rBN43sjv47�(E_V/N�P (5DNa5 1Z5soWj; cCfmm0-.k=/D�LnX+?vl0ML.f]/aJLbq@0:�Rԉ}i {4bQ ,0) �Xv�~9�ܴ@[di7 >\^�((^<0wuZ:Vgne`D!e}9*2��<?0�>j�#rqnK$ŢgL ��V`Z+�NG[)kJs`*YY[Zx+�t &!q� @u[Nbޙ^ !KEo?j >�.#aJ_"GC.֓T�GC uh0i.!Ǔ;|�\bgV/ P *0vXfI ģNen?tu h\" q>�.k/4`8P9� vS?{NvӐ�irz8}�)嬹 I.?h8~(�{H|:)55֊JVp ? SPVRr@hk@gL{-lGJB"qc��k9d(ѝGP>dxϏ=ArM>�.EkHI%{NS8FrTџ3D!X{MOpqLP ,)wz 5jU'Dq)A!ۉ>kQ@[!g삛o,K0v�$j- k@ 9O0pL3}=q/!�dꍲk�H7-$Ӫ N4"z>&HtQر<iasי\?}l&!r5:9 )0t3~J5|a 9'`,�]PFRVx:r?<7/֟1s4Abțsʬ|�^\l d(@ZN�C@_v11w|�\5dT#w::X~ת{Z7'Y`Usf"x0r&7 Bu꠭Nx N?M'`bS@!f7,KѠ?2o@_} G{vBDiYWo<gIQ((yxʿ ţMieZ<`뎳�LBUKj:$gbڬеCx`A 0O֎s� )r uɣ3f0h9[ObХwF Ø{|�L,�QvHLK �cl$Ow!}'$~`4[AD+>Zr)8p�Y>�&N7` 9:r1g�cCBJ9Q9DIN8T? +j$|��F 6ѓUKn;- @8-F`� .0DVuCG1i (wz)@Y�L`^]cgB1C@x6X&񃣞T}�L %sI%C�cag*g�֊ .�Q.sL5.`"g�WݿSJ6} Z |9[t'؉L"D |5:u Y`ÒjAŋI*vO8~`"M_M,UݬZ3@ׁͅuj{~^\&�eDBΚ;(Jh8fR):)K^ a,C=;n@�HdqIZ1L؉$$Sp׋)yN5oci``.T.V!gnϘ_Nu�zuHS|Fk ʡҬ�&8{;2�pW9Y½>x�LEҴ߃VAl+-a K9T?8}�L/6)U&�dV3L(Ǽ$fȖ{{tW+b &N5 9ǁrڝ}{bPo7H*ӌ�$Q8k ubNhz Ʈ/73`" � . aT 0nG3'|Yy? )]cp^ yWJeNv($�QT@$g:u뉶U>�.0׎pb:TlK p}y%._(}J5}0 n $B9w4uKPjnrƻPIp^<�>{$ʟ6ˤ`xՈ˱ (C_^k0~M: @]1@l#H,aҶgҕbWr\(G[/J7,້pӘ{$x�Mrd�)DHPN4%7Α3gC + " };}ƻCov>٭N:pbkuU�ų ҆y_}Ya!+ 5{׶Q*p5?2& ??" �(-آ42t=E|\Y0s-` Isnb86� -�(m0{טU J{?zWMo^~:N30CN�Eq#soߍi>w4�afqx='RJ |A�Lu�0/�HBX*˨Z2ͨX|țf`91O4MB2 k\_5}̱߫/<~W:%)Yy>O3C{4ߑ6@`  @5 ȝ ޾ #ĔdD(b{\EDzcc/gV}@V-_`IBLk5Ev9 ?G?}F8YT9LAىQH<7DXT! DD!G?r/p? Dd��UwuN%�zX}K즫ea:듊I^ԋI;{c/<rVW!!Z?3?rךBԏ�0D%�.w7<^.5@,?B#h]kz|wT�@ʸz�¹Vh1}B9a,JIC7Yˬߋsv,Lf#m5W3�!)4\ p531u4q�* o1C7nXpն tڗ�mߝoT/,Lڲ)8bY_0-bvo"f (oDz)S(0E"xthEC&3�p4nXQm7O�U~7v,]dZ+zS EV-T�hu=$p9I � -Z2�* d1%%Őr'ֱn J RB g[Y2YvO OꜳoW\Y" U95$�NyN(I la"<ʭGOG0F?o̙}2̥K禸8C}N<tۭ>2xo`VyК&0Q~h `&}�yOMv)x ^qQVj_*i&/i'1\/\h 0f?ֿA}iPd� <P5Fg�˩fm ŸQWn؞�' ~ߣӡkɤ;1t__#⿬ܺ牋Cb?1B-"p- Y+G:uXJh>�{~ɘ?䱣8lG@Cy%kpu<eSʭ{D%� LI�̜} <YmOlJiHP~̑.rnE |`_P  q}f$ o ~rnRRc��9ƠPv)a5.gp}lGO1>NϤ=Az@ ) %�3${tc=M� Q+H$qў׹ýh\gjZ?Do0{rTŠ�(*�ivYhW@&l\g(굢CHwSkM� �iűH3X_1u˱&icv VZSk"։ wM`Q{DtoㆺO%P殶V(+ѮV0{c @iU.hMzge{ CaHSB\1SG7is]��?ўqfޥZt дN6mK;C*փ~} tNZui_:ԔvZ27.NJ}Ӧ@ʒ'ǯGUs+;1\Oj]m\DM#+kuVىl>0wp; xҊfRэ��tsZ54uG͋a5ubE)| aD7=!o[erhv蛬kud� e9Tbۯ>Gկ.wra罗{0*?hNnɪߠR F@x =\ xHiX{D13]8ɩٞ'w^x]7}I_a"#M ":iڛ/ɀ4#ZZGF@XH9q~N^=%{`أ=vrڬ6X+V]eK[<u;}@4)Ro.$:HK5,ka+~jϽKZS3Ia5Qh˷%i-LN;o%i\w&;s/E)a11G7jz[d//`XT '*Pܱ{xDb)4R?/apX<d1�/[j.je$fc==~߽I Yʡ-q+AxS|@K[YϪH8~O]Y_ri9Y OsVnQ&N FW*ul+AsCspocu' 4nl#7&nQ.e'( cfH?(-H#\?7+wcuðtK G}b?Q�~ϐQ6+(R<YdL>;G::g~ԣt4Lpw}k8qq 4VH G>%m}nTj6CwR  !e``YR=¹ ȴ` DE(kuZ5q='{ Ïxݢw2P& Tϖ=ڨG6m1εWeۅG\�F HCW}*db (NVL$B ʅ4@ WpJ9h.d;H;vsOlsy[wLӬ=s'ǾV W<{V<VjO$$a80@VPP8Oʲڀ(e4$ SR0$# A,X);sښӭ'*:'D////2ey27����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata_large.png������������������������������������������������������0000664�0000000�0000000�00000026160�11255764730�0021276�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������>a���sRGB����bKGD������ pHYs�� �� ����tIME:2 ���tEXtComment�Created with GIMPW�� �IDATx}{\Uo}NUuuw:ݝL$PQ #8quq\0s3A3r3"D@(y@HMGүs^ϩsN~dIu{{89N89NM7h"/pBz`ǎaIG>+> AǙ"Y3:Y�fq&<E.8e|F�QB�n*ϸ2#v-3��2G4{ի̙snkkl6۔f'uoTݯ}w}��M'#8?v=W .miiw#ͳ>[n�� Z7F1@gqWZf:$k===6mÛo{=Fǒ h>k%[nl7M:uIlumذa 7=�F`#⻖ ^z鼛n%K\vc3_{o{#>k�;0%~`�4|_쪫V>o>IbaÆo_wu1� hƀy�~o}Bq\7^}>}b7=|04}݅}#=Ǽ�@T'A%b08 בXL<mj̛1!ȑ\߾}>w֭[Xߠ0Rs@# O~[9眏 <m{۸?^bqHG,$1HZz@ %VeB !@Z15 V(~ѻ`Zֹ+iYhAK×}]vLPc8\//zonozhπl},や �$)$0J@`К0I(H+_{Ax4*/8NMftO_qy^g'a& &vmꪫI_>9[_O<LB8�$$@Bh~oCt:f! *�V;v?+؆|I6?kiW(yoY]x絗;ӧr?7oWt[&c h? +<oE6u샏?vC[g&5RN&uH$jjڞB`QkgfPP~~}8z++dt'<_c�G-VP) iii{477M;}}wx/:'7S\=l0 )_� ""MD3 U41�[ٽ0K"bN!$iZ:L;ٍuiMuϟ{qKK F�? fŊפyҠu $"!%i1FC(eh(Ypa a^D$ ~~ƃYhRCέannѢEP7ம.5Xw�Lo|_2L]ʋ^4rܜ#4Gm W%_c8||p!#$tx=,kɦSV,ظq�*E a};-i_=M,  M3\/Wd?Խg$ H!7д/Sk:|5PPϸ[|mޮn76!t2,!- jL&бM#嚌�C%ow<:""u:k=u{ӞSN_f͵E�wqeCCCkǟ_~r2H'ko zo*VM#%aCcY@B:S]cӗ΃irW~2 @ x+P<5i'S=s,+)[W7qB_k4W&eDz S*K}AB@ 44?ߓvz;\׭tCiQw[[[̙s~uS7ulN&$](2y"$ecNScQt7KS~@!p^.;Wy}kdc0@%87tӥizloP"Y/d a'į2&ܷ oih;aA_1dHp(SpӮsg_fMf@ ;ŋA̦NdruNIJM˙/'"֡_95Ae$h&|([&,]|w}4-"1chLL:uYR|r,KW` >^/}(Sk-g̞q-OID4FykSZ8$e WSmօfPL4ivv?xK$kIbTfM|fcw \>=rqђvКK։@J}:uC2zHHKn6=Ǫ=8ε^p4>@h\u¿=!$dԺnت(nȞ<K;Kjnd>2�2 <[PVĜ4߉AB ;^;48`N VJ{c�NF B p}T$yC̸hTΞ, P�|4qIdl}3It mhhhQZrejGGO(IL}C5޲`�9_�"P0 L!=p6(y_0iR$ޢJ۵u*k.9Uhix~^m4�(\y�o?&h�僔xpPRc1bg`*rƱ�CY$69G;^dAj>qFQ\pz偕gT?'\ C DO :5z:Q=OO?cA?<I@|fƅfƜOi'F"}VChG�@9rL&J)DzDdH`˝~!X!�px4LL1P~C/_p�$~03q>*ag4tDPa֜YSbMkj6}`V~hc#cN 72q~7q&{-% +;b|sy*1BV0a5#ZCj'yi�{CŸپ)�/Y3p6=9v¹- @t`jXNvk'067V:?j88&BHsqQb`0y`僼N$ 0lqHq>S\YNkƞۯ !b�߄| �ap4?>,} ^DUf՗u<2Hs ">;7ށ)֬<W̒xk!,dgKOL'iNG؄O iXw�w>dk.B}RgBèHbDv4 LگO C@>b  ~}On;3ZU̘k@L~M@@Ij�Mb\%?eW'5NVh�\ga9S&�̣8u4vuo Ι }(/41&-}gqx{DT"X;3Z*i|< ;{�i`}Ob2}+P7c~!4ф2 ='棶$^˥?+�:BHOV9ktx^+)30({W ?a5@Dݏ I) fUP"[β`T~ �B\y{lc윟|%58`�) 3 Jt$k&R{0 ::.> 9Kȭ5>�a҅;.HP]u{߇7eqeKL?�H?|I*/E.o00E$?-(&a 0Vϫu `I!T} v37Ѝڊ{Ǽ%X3)av46IOqR?ґ6 %a�;:JZȘ=! #Hp2<UʹZ+SNY)7!�nr LȊSK hC $`7nW__s.ъ?]d4̧ t'*0裔sB�T0~-/(팦ΛV࡭ Z@h[% +Vw7y<df-+\Ek �8&AQ12}=0@E:VG=u6gܒD*AВIM8`?[7v�nmUsa~탅2Gu{ kjQ�MQPY32$A M f[Ql4> zo ;}epZJ< hkWIE1$ۘ&E_kD}N63C=]D*$|$Ld f<\d.f䅝!�Bx/؉W1x5I!mЩZ%`fXWR$Pjj2tf#.�+iUexƀĸ' _ч@%Y@.cKLHh@p#)%.o/`[a�ŧ3dSȃIhհQ$`a- gWV/ERk`Nh˺_O_L$C ]v�ΞbtUQ'A�|B2@�CZ{׊,>aFPC8g~wcaD $.6�\d{yUJ`=JjS"x|~rln"T`ma(겥wB"^@a8D|8* x "hI(LTS2Lג aeˆa?ۤ}+p~'b-7!mf~%*` r:)~ s�2bplW^M $v˪ez}_Fᜂ"Y} kN0�7y.#{C!Ӳ2 w16]]]Uk]Y3!@vB,JԵ-[Д;�̥kcD�q՛o v;JJE/v":qg T>GýB^C?ٗw Lh:1+U68L ӏ+q%X8w$�|Ȭ"'D<HJ` jnV Fe^a<yB9!>8jթ3ʔ+Œac~i<d‰(i5H8x٧bӞx2 ;c�Z'i\)-[f,ϖeImQJCKSI ƪsb;݋MF46&P@R5 7:P}8K~0^&`Ht*蜝^DRn fƎ@B=jI8B<2 3%'tδxp ^K> e"R_GĿա٠p4\MѠ8c/HEƀI.w؎C9k%l҅J ,wtQ.fᘄDR], HR[853f�_dJ4I%$Щ,'lg9"@`qBGOQeI�03 5DG#>!"0h;VUk%@8k8ox>>]P*hxkGX@kEV+Ҍz-[}AgLJ($`#Bjp)yۼ"lz+qԚdžFbI</[vAw߃Wy A$J c\ad�>_=#2TP 7/eL̘X8�0pC`iM<d:& kNJ%ɗv]fh"ZQdÎG1a�HԉUO $7/>a'{Vb*sq _(z40AqIMݞɶBB*PD"x2h�ec (#@Z~HX6l,k!}\SaeY�m=PbڮAO,Vf~ggc%!s ^=?8>&`vqCJ~a 7w3:_*ҙ3 FmD!S \\ woG7mxYi-֤X;2NhPlYA$�^/s\u!+T]@9}2⛉ @ɗSN .߄Lǂ܈ysh1X׏G!{  S hKX0IbnuX}�@P|LN >Vg6hlp!WxʉoA  g6gss`%$ee0u2b�:x>?m^.}לH=]) ? 7!JsV#9.A Ⱥ4ʹZae%Ugahŧx_K'R&-c`)6ͼt[O*}ׇHbH_Wwݯ_0˃s AO@_z�\ $H)ӺV͏!0x}@j~:obg`2g+A~]B%P.>2RB]WMMN@_& >7)Om覥`q߇»/D(L�.PH#k&E) '߬l:ۘ>X:-b�ؒT6cs':QQ5oRr:3:)_e%>U`gDGM6 %)^T6IT&<%c89@<ܖ,I>bN(DP[JְfQ5:7?忑EKO8=_aK1! T*Kd[>l_@rlǒ8ѥL̉@*՛7e3�3c[g)wߕj` * #�dq3Ddt 4WĢ2.>3@]P) !s'~“L`v(>CN%Լ``d:|aFc{WaI&z˴5k06*;ِ>&dxh}u`I.Xjd Za=�Oޮm˳ !Ry(#RՂuNoooGD3:X?Smi;4(_A�롺WV |m�}d-! U<)L%=Jƒ577KXAk=!Htuu[n=vsgց�]G7x�1ٿƋ w?̄\oAH ӵHH[/R,H 'z5 b)F 嫳Y(P\ �TgggUќ7cZ= >k5ĕ?P^<ǝv;^x^X:~H~! G%ih'4e' {x̺=[]cǎ̩IyEM 0QL mϟv܈g_5=oK :H ď( 8`V7P8kтj}G4|;vp:5-Y+B>ֱ!JveACAN�� IDAT܊xq'?<>ӭ^{xנ4(sDebMIB{23`gЬ`qyS뫝tנ�oͿJ;ɚKVMCAh߳@9R!J5Q爵auE=uA?Ϟ}a /m>7k�7 Yi%syr'FY@+"{\<uEDpң��7箹|>-7鲙zk`'J ljxA�0\;m '׍DWge|YC]_߇x^,9.�n];8U,Ai/5@sAyF姦sP ja3@h� ݻK_{f?=vlIPIhhŠ_�+󢝌a{iǖAŶpI 8c 2jRc}WmtpkKcSi@fM!Jp5pt3C ~QY2 _ raޱiRcC5zzz]v�z`ǎp€>迦1eM m1R.+XU\&@+@  6lcH3 wޒ*Dmñ i XG|,qJ*wlw؅#f#~4 W(W=538x{.[v[>`m)Te…2I@O?iӦ-|tutmn Yu# %Er 4QP ZyW+toErrm״RN J ?9# kFX%vbɪ>?8qϾkʳϘZbq׭[{��;vs _~mS' r[$}02&XHH&!`oq Dց2 \Aټ2y Sr@TWeAn֙q"W!yP!,D&g$_V'~d8ďzIq~9ܫlz(`/O#>�?[n>k}jjGhzcڴi#O^|S FȬ&�V$fs$ӀК!Xٞ~T*a "PLFV%ې.%$0_MrRO 7p7~G^pO(Pkk+V| e 7M:~a_DBAD}2ᾩ!$aalkvmE&u�5˷,5xpAYDc6rA8.B8yA/H> 0aj? ` -Y qoOG[4uSs=/ַê~¨ --- 1:.9ӧOO>oso_ ^f"0D5|)HSZ@dLf2Ҕ!&Ȃ8N.RB !-# #q!JOf*i]c$A!`f61vu3ܿçe2Tⷷf͚k`Z7,( �O>5k\YWWהvܢy'YuټЁ>h b 4vcY1XX㰷2\5]a[Y8{K`�KhIIuP +fChf &rLfD4T۠:( i'SZk+R^H= u7==?Nէ}׮]{n'H `@Z)ʕ+8vl5x٪t}偕b4k2]}A8e>a7O+0+rȇ�]FL J@+bXA89H  ^9 iuRTY(|"+0~ޣ&{xe4BGyooևUkr89�]Gu]-t3m;] 7c( IDB(!~"!6BHMs �NZվPCxE2!M/;+(cQ(|v솫dܙk3<G�~Oy@;~osnGZk~]]ҳa. # !/9&,P:U뽤~*붎aE4~ZfZMh^5gRfՂ)3Of-j˖-W-?"L Lp}L&7əb{z =dJeߪjqwWJjlw[&5dJ6nW&j$0A@7W_}]-yy,` ?;?OmcQf'0) ֯_W_kll9҇LW~Kچ|\D===}+_%h?b 8�IXv'./rƱxu"<sR/O/ݺk׮+1e2&K~ҥKߗdrjeݻ=ܳ:zQ( ee/|u]w駟oQ,wC=wXRL ǔʴAdi7qɊ+3{MMMOیoڹsnXZU$w"0@ -3!2�2~˚5k.7o|95744LR昙hD&"Z}}}G|ݳgϖM6m|V%౔qg*A1D|35A# ^6a:xEGȔ�ILx3@3 oT1Bx}B`xӌ qr'qr'qr��?M^����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata_pause.png������������������������������������������������������0000664�0000000�0000000�00000012331�11255764730�0021314�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������>a���sRGB����bKGD������ pHYs�� �� ����tIME)\l���tEXtComment�Created with GIMPW��4IDATx]ypu{{vɒ%YK$o1񊁐� YBiH44id2tdZ&mRBSZЙ&@I`l yvIo{Oг i=3K}9w90f̘1cƌ3f̘1cƌ3f̘1ci5Kr>0V[x1C+�&uoC+$T�WbQ�uޞ0W2xaQoւP[g}F*X {\9$Im j �am CZA^}}(K\ $p6BB4Qs, C+�l�%�"jI!%+@T ]G+d@S@gjRB�,8M�y7 d/۸k!@~DQrX|QI%UU +)i9ik*`io^ ^삤&k[-F !BQ�i YQ:M*@š+n հʦhI3 Q $�},VYtlXrM M1K 㣏lZ) Q dMsYNS:2XGNFiVY *`/7 $QqE%@RD(yGM&PՀ O}�VC%+ZI*hC]s`N9ɶ7mXY$0 0~y±�ltb ~^z8TT{-1C�yh�i*\ �Plp@:u0:>͟Ψ�yJeus- @Vw�Wϼn�9JC;nlhQ� Dy:y�Ɂ�@W>|+ V7*C�]�`=@D罹=Ns?I{i;t}fC  M!Φap?.0L x_S^�3p.ڭ6pFBC'Iau:�AO۝7@B6_'ȉ؆�ò(ޔwf!'<`?F/!C[\�٭ׄ(2 UGx $ܔ{:s]KDs6ؔF\!e*jHk)�YM/%~y=1$*eUW7W5`Yt Q1'ủM@ >|7'tjq0.j;9n,9 30{2rXXz3@TWDzzT<@EF?\AT2lrE2%t 瑬�P&Գ:u/ge!Ww6() \;oh!i5g@398&r<=9(QD"n[EuSH0w&(TR Dՙ5R0QA!|O=CVgF^졂!?�lls(] � {VM�)Aw~ Ṅ�`f5^%\^}CNg(ݳNqdJ0]_y^zWVZXMђڛcpQVY\a5eFSGA=|X#yZbge Ff r"I<P~~ᑃzAfN X$J~^9V8`_Wo+Pl@e#HjիN8=M!:w  ^zg;ZzM}!�CK U a~e?J`zK>ZwdT`[v# 0>`0,@B,WV'UG{�q#A:sS}BE>AB2PEJHQ)Su85Zw-K-_2 0$VEtmV0rn[xYVy;`u �V˺60Yl̃\$vQ��٢b=e,k(ĘST.�\�;`7Xs`f ƫ@rt�}y�?ׅhvH ?(2 0{?AZBJ7@Xn\x@8 D`6I'rݘo8'Lm `zLH q`RЍ,&i}l H{ݤSZ_+' I�uVr@iN qe[T��4{91L'Ǿ3N` (FTR�P @;[e *>[ ^>&btb}/SBzXRM6AX떒j@'8HgΦW9} DՠQ]6d:r6iN{Snf_VEј<=S˿8簶UPy}oy&?|IM#:T 7?�oBׂu~ۻs7dpI-HȺ+HKuA>AW^+eê zr_];�4B'k>fS $컽SeSxj(R^9g9o0SD|l{ݼegR/=Xo�׾sGV i7dCyJ��OiPکBo0PT5L�jC q_{8Jhd/!LVBF8 bS'}'H.P .FfZwTQ(D8P~t> I?8NV!D* $JX27u/n{.K_BcL`N�$J,**Z9n7ϾyƷ7iD2GDKQ_SBG�DuSBTGuש !Gd�vh*VOuN?_b˝ӼȸV o:^OAygT!@o!$Mp:v*usRKxPGu0ުWN"u6[&6 NJ|�D{ajgOq*5-ҳow "Aj\ݲD/aXN19E D{=>A7y>O+1{ iMD9sf�`4�u�|@4O\#�[٠Wp2reӪ| pHKcS�|y�3VݲDЯUGW~tL< 3RKy֋�k �\p�_P< s�4N�$9iZUZk6E;`6E 8� s[xla9[( DYMjNNyXp!upt.IE嶈~b8CAT{$_%�2ξN%\g%\q ,�+C[*-eMg(8n_-,d;[ɮ*ʾj-YWo'px:umL-8/~}(XOLӾ5gz mT}ͭWˊEwd IITneCS}{һi^BBNrb=B`Ժz�%NdWX|"weICp·kXˢjɓ+�LL>ǻQhA W%�;zWX3Eh"!*e5^:OVӺ(4/ˆUK {?CF@g�ZN[Zẻ7ˆoeZD?LX^\(.@ !+z� G8ޓ[ F@�]?�M[(?zimmۄP6E0u2ގy>Xh0\POH&,#FdZ8밀&2Dp>CJEJT81/ 1�_fQ@ 쥲G'L$Һ<(eY^|h  Q��sVq:ֽ o&!G@?Zc�&P9N 5ybxυzF&�~d)*nq=9dj!$ �@#:_U<|iZws*PZ= )Uwz/ʼnGW~NǼ=,_~�doS޾]?d<0OЏw;N|||?P~U9�@~Љٰŕ99GU;ޞϸ>ћ>/4 ElprGuϙC7s^T=@Z "9Z˾s+U"|K`0=7pa�{v xv=}$s7aIgp3Oe`[L BOzo# ‰!-^ u';{MN3K L (:}H =nίm 'i-Uq:5W:;|z6ۗRbʙU s:uP >d7Cw-YI+Sih=A;{}=W _h<^̀wp_e3�s�j$>VC[iA8VNh9FҪ'T7X@X<^D/gw^:^[6Ȯ*P1|o*ʜ F--$*eK d$+>OSӺ^JC̴3f̘1cƌ3f̘1cƌ36s{g<E����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonata_play.png�������������������������������������������������������0000664�0000000�0000000�00000013067�11255764730�0021153�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������>a���sRGB����bKGD������ pHYs�� �� ����tIME!]X���tEXtComment�Created with GIMPW��IDATx]ip\ՙ=߽oEjIւM666`H B$,5EMfT*S35S)jH&f& cblc e[־{jƶՒ*UKݯ9|}gygygygygygJU>U .Ҕk=\~F�ΨRVLp|Ħ{g ;^TU�+g2u)%S? ˮR<p/I3V9|JD�0u\[b-k4r fb %jT<\`% 𳊙.Ϝk ,Q1L,YC"-M뫈k�2h0_* ?�g47ug&S-GVP:fʩb ooN57 1>wL3+yd<T#@t] 4}Fq״3 GKExYLbZ+*(P|/56U܀G,Z|EM( ҏ%Xkg4W|#@ɠY Mw #X+(Yg,4ru(ѓyZU7T#@�DeBTث 7�+e%U_3VNy =dշj*2%OcޤKwA74x 0n|e�t(٫с?{MىEoBh:GC00VX�͸� )nѶ/&:>Ƽr튅nrUJxRȫj&�BIy7 z~fn^k,35= dL/�JJ u:Ul:vPO`e,3q%ff,@'{��Cv+_ڣOAO\_Ȫ2o2* YnB7' R2o,F(egT ޡ^դW'% 0q0ߍ_J/@W'��q9!{X�1^Jg|w_&ï{FYITr{(0 TlȎ=cAcB"ݼVkXp´ $0OoYbXL9J)ϐ Xq'*{OR\ 5V_R\G *~ U,� m`4 { 21b弢[�` ^;k>1V|JX'\x~^3OxI(ePXc,N2&{#rh:`b S@B ӉpF \{NjwQvQ�Ls9S� B9 򧞋g_ gPV̎?UzZf@`|ec\G ȿfZS $("·;Ne�"O|}уuv+fVhR<\5cd8UQUy )D8νTPv>>89^XAmHuD<\� ٠�Ѕ9`<%pEU|I%� s0>w/WG}ue-_A(:Q9?$۞w* ӯaFO{ o%Mu`ZchtT|PC74cn*fi�� ?)uWF:?FMl|tzP)O�d"py[ dI)zEH1$-M/^#;YKrx2huK0HQ;/ ,E%]tɡ)kgE<\huJ+^qqP qA8y'cm>S "'_9CH&7dR`q-10 A:|a\m2׮ OLqN+&G/rHqb-N %PXּի9 `~cx}YP"(%7=$g?� -�3+i G!T\vuah&Hgϖ8P/h32G%� WX�=&NG�~ ʊB4MX� \c,XFDrʒ H_;b�=Uh0kƼ:GTt\�FJkA\b Hu\Y1?Z +&<\ ū@df'T<">7+*He[f# J5,Y;9%rp#*((Wv̶x8__}g94}ΘKFcg1 3P{RM`I,ELC�Sh #g[}d恨Z&c#9p(=d#:KdqTsm|(){|<d;gU:U +9.{cY#=5-Jʱ~|0F`2_#7b]\Ct羚Jvˁ/E0&�5"5+_Nw&(k8L[,ֶgޓ}n@�+t X2P+;EF&!L|VMuq/$2#dA_x}F31+ ;1ʚ_6Yk�Ddo'ؗ|Vk ޝC?p m ഌd)�\Q_Fn[p) +h �U(Fq H@=+;)�kZt2 q@n8w0W}Xq.#};7$Sx 0oL 29Ɓpz�ݻMŀ~NDt<M'VV[MZUաxf �S?AcL#8E�Ċ*4*(ӚLAe{'^xnų)__{r{ȓ `U2W#8/ں+>&`Eͥg9V(!Dt%hﻺs hA8}R}? pvtfN!D8Ps9`UtE�u,$V'_`YϣTD%m ;#0R(1$sEe<7w`k*>5ƽ7;257E73QHCɘrV\7\k=됳gˠ>Iމc3fZZ__!s4Fp8y�� B#X=7ΟKg\7>+�@@�ʆjgG>ާ?o'x8N3C �YuӲsfHJE]|~@p8Pr&�3�NkVEZ¥r=ts�5<E&4c%.+k-K>Tމ۹8,XsiG�� �w�< x(R Fm4 |X7WQʛ5ϑ/xq=sk�i H7V^|G9o\vohm]w3W|o+:%w?@ @5ox" B=:2:@3W}H_rUfwDbdn`e5Ya^{xĦNꦙX9-c_d�X/� B"F)Pdkֲ/4mAʗ' !jYg8wr`Dm�!o�- ]*Ȕ}@Z'ݼ>!FX9|; tϵR*!:Y�B�>`s8~*5ϳ/f-} V1EOAL2@n۾,V�_KA_Pbż~ ~J8{!>�-�� �s5~w\mO "�j5�p8\2\�}7[5KɻjO(+~WJ�c8^ };*]o]fpi�dup8 |]G71)N8L�oℷB3\�S\KT)uӇ�:_�xx"YC.!0 ˑ7~F#l�M�nM~ `?�|O�fk/'tV�ޫx "~�@ %W�1Ki݁R*b굂K�' `�;=cR1KC*6 !'b�^*?B|� �d)( ◆;Qe!@' �^9 uM PA8R twaF\ iR np>c|` �vB<=7�kc;oh}4ӼkoǶ8vp@�JFaca8nG7p M`8"xуnFMa�;�< 6g,W �@Ɵ}%QLiV'~U:d#{d #$B�9 SBwn2~q&%%ƪ*>Kמw8e2Fߧ͹U>rmPQSƒu>CD�Akc?֙_w@O i2%6t]? kD;^zto_9Ѩ~*)GJx9Ӭ> Sh[ʱ^Gb.g[.F/)qlp?�(3Lwowozv *|2o8RJP[|yk3}ig{ �}��? m7ﵜ_w0 <n~s#n`W6v!eA|9GO`ji�I��P(2OQ6N@/"ܷ׷˩Z2|ksxMJ9, e?8\)m=|}l$k=BFy8ߘ yb} iKy̅x-HWRGXۧ"}=ӗ;(NEBR9 aqZ}kn/XJf F=ATUXiRTBtCHʊPvKY^qOvv:(]=]pxt S 20j�2|Ŝ7 qh:'_NA)!츫זNn۾jsn:mX=3<3<3<3<,g*t'����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonatacd.png����������������������������������������������������������0000664�0000000�0000000�00000004504�11255764730�0020431�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���M���M��� ���sRGB����bKGD������ pHYs�� �� B(x���tIME<q��IDATx\v$%"oIJbgGnsI>G!a~,CUUih#�IYR }ʲDUU�ڦ}s<e_0)yxxQ'm#z_a*EQEC37S�9~ EQ��p8M47B'n~קiBJ ,CQv3Pce y}w]e뾚oX)%8TCrCUU!cǶfH+RE-iy.^tQRՕ(&ihC5=)s} c B98`|yB#Mʲ q# CE1 ׈h P@UU(EQNݧqt^Ҳ(*6 5YAJ<hCڼ1:nH�Ly1]QȲG$0MY!"$I(xbH`1p ,UU[`7UV$|҃1Ơ:4MCeqU6^$8PU0E#T3 A M˘\8_EE(e"&eY4 á榋shiu 7Yi fUUq8ubwvV61Ҫ&Y`sJǁ(}6Fϩ&caD22ũb&Enum>b0 ~V21^^^X3Km!AJ\SƜ{{.EMִ))Sӏ5\ Ͳ աiuuҧU^UUPUa"eY"A(i( `4D`SDY<Fbv89<|I%n$ ޺0h`S+MTUuvfYӠ[s>r%^:qibݢ( ܛYE4(2ɏ%Iv{qvi3틦|j"NU>=�5ZiZ3SUN'ߋض]WkܲYJē$kXS5Q6j~%Y;ufO>iY#kJt]o|Փq[6VLjp2Q>֙n9v{W5VwOqfoK`}߿h@LJ4}$ |GEQjdž<Q+O'.65R )H-.U"eYHӴ5DՕ[(c-ٽiN8PU?@UU ۶oEc}ZSn4M^[}0 oE7i,zv%%IE z͏ǩGI,O ?hXVXVHsV+vsk#І*eY^^Pҟ),znUq$I˅\;Fftׯ�0 ocl<)V1y\ׅ5(t~(*Nc0My#YymQOcW])}~~veY<eYböm͓Lo0 y=ؘ|80 z 'n 1KfG' l67/Md驞تiBh~LC+oŅ(0 5lo!4 5Th囟Oȿr4f<Oic˲mQ_�OgUnO)MxhJQ %]nQ:NCi~shw|J$iDxn ij[GΛ6;)ױc7i~8mRƖO;ёۂ Ϳ9JSx/sO-MϹT hl.(*Q= F'[ûLh}g㴾ܴ"rq%~ket{o4]q<yw r5| Jݛ}b)O7 87Me�9ŒAJYGl".d8hU)gs]a 5KTvZ۶g{qEb i]0MeM^b)8zZJAĵ"sq ]a&4MvZ2MSDQ48ݛ ^EМ5.IxI4$.I \5'y47K)c}׷v�1WfCx~~^'-)yxxiթxzz]&mj"̀!VU^' btPjr@����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/pixmaps/sonatacd_large.png����������������������������������������������������0000664�0000000�0000000�00000011562�11255764730�0021605�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������3���sRGB����bKGD������ pHYs�� �� B(x���tIME @4|)��IDATx]vH.fI&gcf&37ح>-6 ޠP>t_��v">v>޶ھxt0 hG 0 H7��qu]nPtL?1aJ}_wy]C[{�~mׂ(TO^j�@QPB,˔/޶A|iEQ-$Tُ3Ǟ�qCY)0ƔZLn3U*SUZ$yzNxyAm@,!2`5X{1wM6u`%⽊&sp] À,(͠jXM' 8n5sh ǠI٪e]hj+˒0 ! C8Psפ!mܣ"6i יjBo2JċX(29E1vMYb@Q1 0M}2QQ,ys, sV6ŭօ>\OXAnB i *QvcYL$,1fUp&^.Ωȫ* A`2 q84syl6Z1p2M'Ž*'\Rʟ1eC.s`IFaeY\6CO1 R qbHǒ4M,KceUi YeYPdYv0ɽ¦ QqjyTp`7p$Ii^5kŸ#,3U %ܩzLmY삣849DR;'YG̈́&Rz2S(˒s\`J)AEPJ1YݦW؇W IE/Rzp!xUY$4%dYQie`IymQcom) ,ګÝ G@iz¶m, 8B#m#mX 1d]4{msp'q_ $<mk4M/:{m*Y}j)Bfwj$r$I I#! F-VS ! 9Ҕuٖ$ AeYa)zyM!_g&f3”u94M!c00fi)9XNS2w)-0X!b1Mӓ*H64YGME)Iv;hp,b I9VWRߕy~:Uܩn[eM=qWbyUxmBPՑ:6Y/UNɻAUxMK *�kufiz�;;*'Xd]%؅>dl9ԔR LaP-MS}Z){(BOUzW msHZ*cͅkPR)Fe C *Xfssu\cs]+0:…8ťN!m�_cYgP2 (&C:f<A*E'ӧb 4Cu|}}iS9W_Oq\J�yi'%If^buGs,5yud]U"A𘌖=Eu{&}sdWМv;XT8`Yf%]& AMu*^U%|||h~BU]y BM.U1}E%u6DoTց{IYLJd6)kR"Mh LM^]=3yu"]sM]kI8xڂ]F_ zșO@l!4$Y}_ȫj-F֛�%EU[qmTׯB6OUo6 +դ< Ǣo6^m\tiQ$3gipZ'ؕWAu\ (i:TMJe>d]'oGkՍʞc]F躒(tHFZVSا:oB$'DtZ;$CTb^$ |~~uCd$WX} T_u]E47zk@S@d}A۸SE7KCrSiKX]^pÂM"FڻIuy9Ӑ eK츋 ng<ZQc8, 8ֱC1X6qd[SMMr9"]k�k~~jp ^j͠j=;>l6DX*di͠*HW+օJf0YՉuvbPS KFTW58! CH(t]EkYbh5 U1n{ f'qCQi VԹ9DeC�J4xd.<<<C㾞 ��O*]aV hUPG!^$ <<+a=p1d+"="Md5joZvtjiB<9|||LY F4Eh= 1$I§:cDʲ*0`Z뺓hcmI}˂3 RF,˽aG`oSX,%xO XT}'A0 1dYVxBEsX.�_aJ)n;r1!jҘ<Gl Mi\bbpR ߿�,ځy*rfMz{'}V8#}Vz"ʲTv H;NxBVVsliF`uP2)r<"u,}{ h8v?yJi4Ma5`.Z N|XŁ17\.MS>E<n{&]'W_[$߿gmcoTG2fooo<8\.gNXudnx|+mK8Pkx{{,<(=ň|_,[c1чmi1ڪ7~~}}흓z ///\.!"pS,B^$%Y>\.~XI8n@ȻLӜ[d73ux|| shuזeVCMDMzc^P۶fB`ƤD9 'S_)l"2އL\J 8w0 &U,..iV&N,bH%8Q^Q|>W936`,P ,Ihmk0<Nzh,MYNSeYyM,;Z˸']jĀ(N8ע8AA+n{@B~E ,BԼb�jd@{0IiТ(&WED�@h .iUJD;7'5mɲ� Z+H9ԤVcU%qŰii e6/Bs-m^o욬Rv<LkiAT,i,_~Aezz r`@yCj?A]\a[\zt$MZ3^adh?`5]kiRY'um<Uc-ܪH&w5/2^IOv bv 6*HwZ%[,qLL*2F,qc5t$9*Z9rJE[I!BqF Tk`v;`͝r]U[xC&QmKY$I'ohdYs-#aԴ+!͠(hDMJT)D 3i Y8!M\w8Un&R:&"cq|M\p&0^Bң� M"Ku R>&c#.%^`'crTsm$8[u ɚ18z$7F\Y?WBlu[6Z. !B+?/AcrKBN5dy\UVBO58@M/(!ۭ&gT� "K6nO *�K 뺓w-Aoֵ }&<o0,N ktkXFG)ԉ!sjU?\zC1~ND98E˲`ہm0ϵiTQuV 7Qu pФ^r56Mo۶ eYmy^˴.nNcUћ88ΤceE 3Ra\F)( MS>*wJ�cAǼU*XհD`YEIL`1ct,'10۶qp0\턝PK]WOOfX˲m,&j,xk2yX&4MvB8,˺zC^=]}Qs1PpdҋKEmïp-VNfY2^404ͽ@iUڦit"}0N[ɭwv6M!0 0 c5ۛ {>x/+>|#4@PUT5u5Thc_@rq`i:J�S1\?3@/ j!Lf^_%, W\~#˟B`>ARx~~3Rxxx��\gTi/6ZQNgGMϟz `/0 <@K'����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/playlists.py������������������������������������������������������������������0000664�0000000�0000000�00000017626�11255764730�0017055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This module implements a user interface for mpd playlists. Example usage: import playlists self.playlists = playlists.Playlists(self.config, self.window, self.client, lambda:self.UIManager, self.update_menu_visibility, self.iterate_now, self.on_add_item, self.on_playlists_button_press, self.get_current_songs, self.connected, self.TAB_PLAYLISTS) playlistswindow, playlistsevbox = self.playlists.get_widgets() ... self.playlists.populate() ... """ import gtk, pango import ui, misc import mpdhelper as mpdh class Playlists(object): def __init__(self, config, window, client, UIManager, update_menu_visibility, iterate_now, on_add_item, on_playlists_button_press, get_current_songs, connected, TAB_PLAYLISTS, new_tab): self.config = config self.window = window self.client = client self.UIManager = UIManager self.update_menu_visibility = update_menu_visibility self.iterate_now = iterate_now # XXX Do we really need this? self.on_add_item = on_add_item self.on_playlists_button_press = on_playlists_button_press self.get_current_songs = get_current_songs self.connected = connected self.mergepl_id = None self.actionGroupPlaylists = None # Playlists tab self.playlists = ui.treeview() self.playlists_selection = self.playlists.get_selection() self.playlistswindow = ui.scrollwindow(add=self.playlists) self.tab = new_tab(self.playlistswindow, gtk.STOCK_JUSTIFY_CENTER, TAB_PLAYLISTS, self.playlists) self.playlists.connect('button_press_event', self.on_playlists_button_press) self.playlists.connect('row_activated', self.playlists_activated) self.playlists.connect('key-press-event', self.playlists_key_press) # Initialize playlist data and widget self.playlistsdata = gtk.ListStore(str, str) self.playlists.set_model(self.playlistsdata) self.playlists.set_search_column(1) self.playlistsimg = gtk.CellRendererPixbuf() self.playlistscell = gtk.CellRendererText() self.playlistscell.set_property("ellipsize", pango.ELLIPSIZE_END) self.playlistscolumn = gtk.TreeViewColumn() self.playlistscolumn.pack_start(self.playlistsimg, False) self.playlistscolumn.pack_start(self.playlistscell, True) self.playlistscolumn.set_attributes(self.playlistsimg, stock_id=0) self.playlistscolumn.set_attributes(self.playlistscell, markup=1) self.playlists.append_column(self.playlistscolumn) self.playlists_selection.set_mode(gtk.SELECTION_MULTIPLE) def get_model(self): return self.playlistsdata def get_widgets(self): return self.playlistswindow def get_treeview(self): return self.playlists def get_selection(self): return self.playlists_selection def populate_playlists_for_menu(self, playlistinfo): if self.mergepl_id: self.UIManager().remove_ui(self.mergepl_id) if self.actionGroupPlaylists: self.UIManager().remove_action_group(self.actionGroupPlaylists) self.actionGroupPlaylists = None self.actionGroupPlaylists = gtk.ActionGroup('MPDPlaylists') self.UIManager().ensure_update() actions = [("Playlist: %s" % playlist.replace("&", ""), gtk.STOCK_JUSTIFY_CENTER, misc.unescape_html(playlist), None, None, self.on_playlist_menu_click) for playlist in playlistinfo] self.actionGroupPlaylists.add_actions(actions) uiDescription = """ <ui> <popup name="mainmenu"> <menu action="plmenu"> """ uiDescription += "".join('<menuitem action=\"%s\"/>' % action[0] for action in actions) uiDescription += '</menu></popup></ui>' self.mergepl_id = self.UIManager().add_ui_from_string(uiDescription) self.UIManager().insert_action_group(self.actionGroupPlaylists, 0) self.UIManager().get_widget('/hidden').set_property('visible', False) # If we're not on the Current tab, prevent additional menu items # from displaying: self.update_menu_visibility() def on_playlist_save(self, _action): plname = self.prompt_for_playlist_name(_("Save Playlist"), 'savePlaylist') if plname: if self.playlist_name_exists(_("Save Playlist"), 'savePlaylistError', plname): return self.playlist_create(plname) def playlist_create(self, playlistname, oldname=None): mpdh.call(self.client, 'rm', playlistname) if oldname is not None: mpdh.call(self.client, 'rename', oldname, playlistname) else: mpdh.call(self.client, 'save', playlistname) self.populate() self.iterate_now() def on_playlist_menu_click(self, action): plname = misc.unescape_html(action.get_name().replace("Playlist: ", "")) response = ui.show_msg(self.window, _("Would you like to replace the existing playlist or append these songs?"), _("Existing Playlist"), "existingPlaylist", (_("Replace playlist"), 1, _("Append songs"), 2), default=self.config.existing_playlist_option) if response == 1: # Overwrite self.config.existing_playlist_option = response self.playlist_create(plname) elif response == 2: # Append songs: self.config.existing_playlist_option = response mpdh.call(self.client, 'command_list_ok_begin') for song in self.get_current_songs(): mpdh.call(self.client, 'playlistadd', plname, mpdh.get(song, 'file')) mpdh.call(self.client, 'command_list_end') return def playlist_name_exists(self, title, role, plname, skip_plname=""): # If the playlist already exists, and the user does not want to replace it, return True; In # all other cases, return False playlists = mpdh.call(self.client, 'listplaylists') if playlists is None: playlists = mpdh.call(self.client, 'lsinfo') for item in playlists: if 'playlist' in item: if mpdh.get(item, 'playlist') == plname and plname != skip_plname: if ui.show_msg(self.window, _("A playlist with this name already exists. Would you like to replace it?"), title, role, gtk.BUTTONS_YES_NO) == gtk.RESPONSE_YES: return False else: return True return False def prompt_for_playlist_name(self, title, role): plname = None if self.connected(): # Prompt user for playlist name: dialog = ui.dialog(title=title, parent=self.window, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT), role=role, default=gtk.RESPONSE_ACCEPT) hbox = gtk.HBox() hbox.pack_start(ui.label(text=_('Playlist name') + ':'), False, False, 5) entry = ui.entry() entry.set_activates_default(True) hbox.pack_start(entry, True, True, 5) dialog.vbox.pack_start(hbox) ui.show(dialog.vbox) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: plname = misc.strip_all_slashes(entry.get_text()) dialog.destroy() return plname def populate(self): if self.connected(): self.playlistsdata.clear() playlistinfo = [] playlists = mpdh.call(self.client, 'listplaylists') if playlists is None: playlists = mpdh.call(self.client, 'lsinfo') for item in playlists: if 'playlist' in item: playlistinfo.append(misc.escape_html(mpdh.get(item, 'playlist'))) playlistinfo.sort(key=lambda x: x.lower()) # Remove case sensitivity for item in playlistinfo: self.playlistsdata.append([gtk.STOCK_JUSTIFY_FILL, item]) if mpdh.mpd_major_version(self.client) >= 0.13: self.populate_playlists_for_menu(playlistinfo) def on_playlist_rename(self, _action): plname = self.prompt_for_playlist_name(_("Rename Playlist"), 'renamePlaylist') if plname: model, selected = self.playlists_selection.get_selected_rows() oldname = misc.unescape_html(model.get_value(model.get_iter(selected[0]), 1)) if self.playlist_name_exists(_("Rename Playlist"), 'renamePlaylistError', plname, oldname): return self.playlist_create(plname, oldname) # Re-select item: row = 0 for pl in self.playlistsdata: if pl[1] == plname: self.playlists_selection.select_path((row,)) return row = row + 1 def playlists_key_press(self, widget, event): if event.keyval == gtk.gdk.keyval_from_name('Return'): self.playlists_activated(widget, widget.get_cursor()[0]) return True def playlists_activated(self, _treeview, _path, _column=0): self.on_add_item(None) ����������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/plugins/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�11255764730�0016124�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/plugins/__init__.py�����������������������������������������������������������0000664�0000000�0000000�00000000000�11255764730�0020223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/plugins/localmpd.py�����������������������������������������������������������0000664�0000000�0000000�00000003505�11255764730�0020274�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # this is the magic interpreted by Sonata, referring to construct_tab below: ### BEGIN PLUGIN INFO # [plugin] # plugin_format: 0, 0 # name: Local MPD # version: 0, 0, 0 # description: A tab for controlling local MPD # author: Tuukka Hastrup # author_email: Tuukka.Hastrup@iki.fi # url: http://sonata.berlios.de # [capabilities] # tabs: construct_tab ### END PLUGIN INFO import subprocess, locale import gobject, gtk from sonata.misc import escape_html def update(label): # schedule next update gobject.timeout_add(1000, update, label) # don't update if not visible if not label.window or not label.window.is_viewable(): return commands = [("Processes", ["sh", "-c", "ps wwu -C mpd"]), ("Networking", ["sh", "-c", "netstat -Watue --numeric-hosts | egrep ':6600|^Proto'"]), ("Files", ["sh", "-c", "ls -lRh /etc/mpd.conf /var/lib/mpd"]), ] outputs = [(title, subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE ).communicate()) for title, command in commands] text = '\n'.join(["<b>%s</b>\n<tt>%s</tt><i>%s</i>\n" % (title, escape_html(stdout), escape_html(stderr)) for title, (stdout, stderr) in outputs]) label.set_markup(text.decode(locale.getpreferredencoding(), 'replace')) # nothing magical here, this constructs the parts of the tab when called: def construct_tab(): vbox = gtk.VBox() label = gtk.Label() label.set_properties(xalign=0.0, xpad=5, yalign=0.0, ypad=5, selectable=True) vbox.pack_start(label) update(label) window = gtk.ScrolledWindow() window.set_properties(hscrollbar_policy=gtk.POLICY_AUTOMATIC, vscrollbar_policy=gtk.POLICY_AUTOMATIC) window.add_with_viewport(vbox) window.show_all() # (tab content, icon name, tab name, the widget to focus on tab switch) return (window, None, "Local MPD", None) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/plugins/test.py���������������������������������������������������������������0000664�0000000�0000000�00000002771�11255764730�0017464�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # this is the magic interpreted by Sonata, referring to on_enable etc. below: ### BEGIN PLUGIN INFO # [plugin] # plugin_format: 0, 0 # name: Test plugin # version: 0, 0, 0 # description: A simple test plugin. # author: Tuukka Hastrup # author_email: Tuukka.Hastrup@iki.fi # url: http://sonata.berlios.de # [capabilities] # enablables: on_enable # tabs: construct_tab # playing_song_observers: on_song_change ### END PLUGIN INFO # nothing magical from here on import gtk, pango from sonata.misc import escape_html songlabel = None # this gets called when the plugin is loaded, enabled, or disabled: def on_enable(state): global songlabel if state: songlabel = gtk.Label("No song info received yet.") songlabel.props.ellipsize = pango.ELLIPSIZE_END else: songlabel = None # this constructs the parts of the tab when called: def construct_tab(): vbox = gtk.VBox() vbox.pack_start(gtk.Label("Hello world!")) vbox.pack_start(songlabel) vbox.pack_start(gtk.Label("(You can modify me at %s)" % __file__.rstrip("c"))) vbox.show_all() # the return value goes off to Base.new_tab(page, stock, text, focus): # (tab content, icon name, tab name, the widget to focus on tab switch) return (vbox, None, "Test plugin", None) # this gets called when a new song is playing: def on_song_change(songinfo): if songinfo: songlabel.set_markup("<b>Info for currently playing song:</b>"+ "\n%s" % escape_html(repr(songinfo))) else: songlabel.set_text("Currently not playing any song.") songlabel.show() �������sonata-1.6.2.1/sonata/pluginsystem.py���������������������������������������������������������������0000664�0000000�0000000�00000011100�11255764730�0017551�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import os, re, StringIO import ConfigParser, pkgutil import sonata.plugins def find_plugin_dirs(): return [os.path.expanduser('~/.sonata/plugins'), '/usr/local/lib/sonata/plugins'] # add dirs from sys.path: sonata.plugins.__path__ = pkgutil.extend_path(sonata.plugins.__path__, sonata.plugins.__name__) # add dirs specific to sonata: sonata.plugins.__path__ = find_plugin_dirs() + sonata.plugins.__path__ class Plugin(object): def __init__(self, path, name, info, load): self.path = path self.name = name self._info = info self._load = load # obligatory plugin info: format_value = info.get('plugin', 'plugin_format') self.plugin_format = tuple(map(int, format_value.split(','))) self.longname = info.get('plugin', 'name') versionvalue = info.get('plugin', 'version') self.version = tuple(map(int, versionvalue.split(','))) self.version_string = '.'.join(map(str, self.version)) self._capabilities = dict(info.items('capabilities')) # optional plugin info: try: self.description = info.get('plugin', 'description') except ConfigParser.NoOptionError: self.description = "" try: self.author = info.get('plugin', 'author') except: self.author = "" try: self.author_email = info.get('plugin', 'author_email') except: self.author_email = "" try: self.iconurl = info.get('plugin', 'icon') except ConfigParser.NoOptionError: self.iconurl = None try: self.url = info.get('plugin', 'url') except: self.url = "" # state: self._module = None # lazy loading self._enabled = False def get_enabled(self): return self._enabled def get_features(self, capability): if not self._enabled or not capability in self._capabilities: return [] module = self._get_module() if not module: return [] features = self._capabilities[capability] try: return [getattr(module, f) for f in features.split(', ')] except KeyboardInterrupt: raise except "Exception": print ("Failed to access features in plugin %s." % self.name) return [] def _get_module(self): if not self._module: try: self._module = self._load() except Exception: print "Failed to load plugin %s." % self.name return None return self._module def force_loaded(self): return bool(self._get_module()) class PluginSystem(object): def __init__(self): self.plugin_infos = [] self.loaded_plugins = {} self.notifys = [] def get_info(self): return self.plugin_infos def get(self, capability): return [(plugin, feature) for plugin in self.plugin_infos for feature in plugin.get_features(capability)] def notify_of(self, capability, enable_cb, disable_cb): self.notifys.append((capability, enable_cb, disable_cb)) for plugin, feature in self.get(capability): enable_cb(plugin, feature) def set_enabled(self, plugin, state): if plugin._enabled != state: # make notify callbacks for each feature of the plugin: plugin._enabled = True # XXX for plugin.get_features # process the notifys in the order they were registered: for capability, enable, disable in self.notifys: callback = enable if state else disable for feature in plugin.get_features(capability): callback(plugin, feature) plugin._enabled = state def find_plugins(self): for path in sonata.plugins.__path__: if not os.path.isdir(path): continue for entry in os.listdir(path): if entry.startswith('_'): continue # __init__.py etc. if entry.endswith('.py'): try: self.load_info(path, entry[:-3]) except Exception: print "Failed to load info:", print os.path.join(path, entry) def load_info(self, path, name): f = open(os.path.join(path, name+".py"), "rt") text = f.read() f.close() pat = r'^### BEGIN PLUGIN INFO.*((\n#.*)*)\n### END PLUGIN INFO' infotext = re.search(pat, text, re.MULTILINE).group(1) uncommented = '\n'.join(line[1:].strip() for line in infotext.split('\n')) info = ConfigParser.SafeConfigParser() info.readfp(StringIO.StringIO(uncommented)) # XXX add only newest version of each name plugin = Plugin(path, name, info, lambda:self.import_plugin(name)) self.plugin_infos.append(plugin) if not info.options('capabilities'): print "Warning: No capabilities in plugin %s." % name def load_plugin(self, _path, name): # XXX load from a .py file - no .pyc etc. plugin = self.import_plugin(name) self.loaded_plugins[name] = plugin return plugin def import_plugin(self, name): __import__('sonata.plugins', {}, {}, [name], 0) plugin = getattr(sonata.plugins, name) return plugin pluginsystem = PluginSystem() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/preferences.py����������������������������������������������������������������0000664�0000000�0000000�00000105246�11255764730�0017326�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This module provides a user interface for changing configuration variables. Example usage: import preferences ... prefs = preferences.Preferences() prefs.on_prefs_real(self.window, self.prefs_window_response, tab callbacks...) """ import gettext, hashlib import gtk from consts import consts from config import Config from pluginsystem import pluginsystem import ui import misc import os class Extras_cbs(object): """Callbacks and data specific to the extras tab""" popuptimes = [] popuplocations = [_('System tray'), _('Top Left'), _('Top Right'), _('Bottom Left'), _('Bottom Right'), _('Screen Center')] notif_toggled = None crossfade_changed = None crossfade_toggled = None class Display_cbs(object): """Callbacks specific to the display tab""" stylized_toggled = None art_toggled = None playback_toggled = None progress_toggled = None statusbar_toggled = None lyrics_toggled = None trayicon_available = None class Behavior_cbs(object): """Callbacks and data specific to the behavior tab""" trayicon_toggled = None trayicon_in_use = None sticky_toggled = None ontop_toggled = None decorated_toggled = None infofile_changed = None class Format_cbs(object): """Callbacks specific to the format tab""" currentoptions_changed = None libraryoptions_changed = None titleoptions_changed = None currsongoptions1_changed = None currsongoptions2_changed = None class Preferences(): """This class implements a preferences dialog for changing configuration variables. Many changes are applied instantly with respective callbacks. Closing the dialog causes a response callback. """ def __init__(self, config, reconnect, renotify, reinfofile, settings_save, populate_profiles_for_menu): self.config = config # These are callbacks to Main self.reconnect = reconnect self.renotify = renotify self.reinfofile = reinfofile self.settings_save = settings_save self.populate_profiles_for_menu = populate_profiles_for_menu # Temporary flag: self.updating_nameentry = False self.prev_host = None self.prev_password = None self.prev_port = None self.window = None self.last_tab = 0 self.display_trayicon = None self.direntry = None self.using_mpd_env_vars = False def on_prefs_real(self, extras_cbs, display_cbs, behavior_cbs, format_cbs): """Display the preferences dialog""" self.prefswindow = ui.dialog(title=_("Preferences"), parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, role='preferences', resizable=False, separator=False) self.prefsnotebook = gtk.Notebook() tabs = [(_("MPD"), 'mpd'), (_("Display"), 'display'), (_("Behavior"), 'behavior'), (_("Format"), 'format'), (_("Extras"), 'extras'), (_("Plugins"), 'plugins'), ] for display_name, name in tabs[:-1]: label = ui.label(text=display_name) func = getattr(self, '%s_tab' % name) tab = func(locals().get('%s_cbs' % name)) self.prefsnotebook.append_page(tab, label) hbox = gtk.HBox() hbox.pack_start(self.prefsnotebook, False, False, 10) self.prefswindow.vbox.pack_start(hbox, False, False, 10) close_button = self.prefswindow.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) self.prefswindow.show_all() self.prefsnotebook.set_current_page(self.last_tab) close_button.grab_focus() self.prefswindow.connect('response', self._window_response) # Save previous connection properties to determine if we should try to # connect to MPD after prefs are closed: self.prev_host = self.config.host[self.config.profile_num] self.prev_port = self.config.port[self.config.profile_num] self.prev_password = self.config.password[self.config.profile_num] def mpd_tab(self, cbs=None): """Construct and layout the MPD tab""" mpdlabel = ui.label(markup='<b>' + _('MPD Connection') + '</b>') frame = gtk.Frame() frame.set_label_widget(mpdlabel) frame.set_shadow_type(gtk.SHADOW_NONE) controlbox = gtk.HBox() profiles = ui.combo() add_profile = ui.button(img=ui.image(stock=gtk.STOCK_ADD)) remove_profile = ui.button(img=ui.image(stock=gtk.STOCK_REMOVE)) self._populate_profile_combo(profiles, self.config.profile_num, remove_profile) controlbox.pack_start(profiles, False, False, 2) controlbox.pack_start(remove_profile, False, False, 2) controlbox.pack_start(add_profile, False, False, 2) namelabel = ui.label(textmn=_("_Name") + ":") nameentry = ui.entry() namelabel.set_mnemonic_widget(nameentry) hostlabel = ui.label(textmn=_("_Host") + ":") hostentry = ui.entry() hostlabel.set_mnemonic_widget(hostentry) portlabel = ui.label(textmn=_("_Port") + ":") portentry = gtk.SpinButton(gtk.Adjustment(0 ,0 ,65535, 1),1) portentry.set_numeric(True) portlabel.set_mnemonic_widget(portentry) dirlabel = ui.label(textmn=_("_Music dir") + ":") direntry = gtk.FileChooserButton(_('Select a Music Directory')) self.direntry = direntry direntry.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) direntry.connect('selection-changed', self._direntry_changed, profiles) dirlabel.set_mnemonic_widget(direntry) passwordlabel = ui.label(textmn=_("Pa_ssword") + ":") passwordentry = ui.entry(password=True) passwordlabel.set_mnemonic_widget(passwordentry) passwordentry.set_tooltip_text(_("Leave blank if no password is required.")) autoconnect = gtk.CheckButton(_("_Autoconnect on start")) autoconnect.set_active(self.config.autoconnect) autoconnect.connect('toggled', self._config_widget_active, 'autoconnect') # Fill in entries with current profile: self._profile_chosen(profiles, nameentry, hostentry, portentry, passwordentry, direntry) # Update display if $MPD_HOST or $MPD_PORT is set: host, port, password = misc.mpd_env_vars() if host or port: self.using_mpd_env_vars = True if not host: host = "" if not port: port = 0 if not password: password = "" hostentry.set_text(str(host)) portentry.set_value(port) passwordentry.set_text(str(password)) nameentry.set_text(_("Using MPD_HOST/PORT")) for widget in [hostentry, portentry, passwordentry, nameentry, profiles, add_profile, remove_profile]: widget.set_sensitive(False) else: self.using_mpd_env_vars = False nameentry.connect('changed', self._nameentry_changed, profiles, remove_profile) hostentry.connect('changed', self._hostentry_changed, profiles) portentry.connect('value-changed', self._portentry_changed, profiles) passwordentry.connect('changed', self._passwordentry_changed, profiles) profiles.connect('changed', self._profile_chosen, nameentry, hostentry, portentry, passwordentry, direntry) add_profile.connect('clicked', self._add_profile, nameentry, profiles, remove_profile) remove_profile.connect('clicked', self._remove_profile, profiles, remove_profile) rows = [(namelabel, nameentry), (hostlabel, hostentry), (portlabel, portentry), (passwordlabel, passwordentry), (dirlabel, direntry)] connection_table = gtk.Table(len(rows), 2) connection_table.set_col_spacings(12) for i, (label, entry) in enumerate(rows): connection_table.attach(label, 0, 1, i, i+1, gtk.FILL, gtk.FILL) connection_table.attach(entry, 1, 2, i, i+1, gtk.FILL|gtk.EXPAND, gtk.FILL) connection_alignment = gtk.Alignment(0.5, 0.5, 1.0, 1.0) connection_alignment.set_padding(12, 12, 12, 12) connection_alignment.add(connection_table) connection_frame = gtk.Frame() connection_frame.set_label_widget(controlbox) connection_frame.add(connection_alignment) table = gtk.Table(2, 1) table.set_row_spacings(12) table.attach(connection_frame, 0, 1, 0, 1, gtk.FILL|gtk.EXPAND, gtk.FILL) table.attach(autoconnect, 0, 1, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL) alignment = gtk.Alignment(0.5, 0.5, 1.0, 1.0) alignment.set_padding(12, 0, 12, 0) alignment.add(table) frame.add(alignment) tab = gtk.Alignment(0.5, 0.5, 1.0, 1.0) tab.set_padding(12, 12, 12, 12) tab.add(frame) return tab def extras_tab(self, cbs): """Construct and layout the extras tab""" if not self.scrobbler.imported(): self.config.as_enabled = False extraslabel = ui.label(markup='<b>' + _('Extras') + '</b>') frame = gtk.Frame() frame.set_label_widget(extraslabel) frame.set_shadow_type(gtk.SHADOW_NONE) as_checkbox = gtk.CheckButton(_("_Audioscrobbling (Last.fm)")) as_checkbox.set_active(self.config.as_enabled) as_user_label = ui.label(textmn=_("_Username:")) as_pass_label = ui.label(textmn=_("_Password:")) as_user_entry = ui.entry(text=self.config.as_username, changed_cb=self._as_username_changed) as_user_label.set_mnemonic_widget(as_user_entry) if len(self.config.as_password_md5) > 0: as_pass_entry = ui.entry(text='1234', password=True, changed_cb=self._as_password_changed) else: as_pass_entry = ui.entry(text='', password=True, changed_cb=self._as_password_changed) as_pass_label.set_mnemonic_widget(as_pass_entry) as_user_box = gtk.HBox(spacing=12) as_user_box.pack_end(as_user_entry, False, False) as_user_box.pack_end(as_user_label, False, False) as_pass_box = gtk.HBox(spacing=12) as_pass_box.pack_end(as_pass_entry, False, False) as_pass_box.pack_end(as_pass_label, False, False) as_entries = gtk.VBox() as_entries.pack_start(as_user_box) as_entries.pack_start(as_pass_box) display_notification = gtk.CheckButton(_("Popup _notification on song changes")) display_notification.set_active(self.config.show_notification) time_names = ["%s %s" % (i , gettext.ngettext('second', 'seconds', int(i))) for i in cbs.popuptimes if i != _('Entire song')] time_names.append(_('Entire song')) notification_options = ui.combo(items=time_names, active=self.config.popup_option, changed_cb=self._notiftime_changed) notification_locs = ui.combo(items=cbs.popuplocations, active=self.config.traytips_notifications_location, changed_cb=self._notiflocation_changed) notifhbox = gtk.HBox(spacing=6) notifhbox.pack_end(notification_locs, False, False) notifhbox.pack_end(notification_options, False, False) display_notification.connect('toggled', cbs.notif_toggled, notifhbox) if not self.config.show_notification: notifhbox.set_sensitive(False) crossfadespin = gtk.SpinButton() crossfadespin.set_range(1, 30) crossfadespin.set_value(self.config.xfade) crossfadespin.set_numeric(True) crossfadespin.set_increments(1, 5) crossfadespin.connect('value-changed', cbs.crossfade_changed) crossfadelabel2 = ui.label(text=_("Fade length") + ":") crossfadelabel2 = ui.label(textmn=_("_Fade length") + ":") crossfadelabel2.set_mnemonic_widget(crossfadespin) crossfadelabel3 = ui.label(text=_("sec")) crossfadebox = gtk.HBox(spacing=12) crossfadebox.pack_end(crossfadelabel3, False, False) crossfadebox.pack_end(crossfadespin, False, False) crossfadebox.pack_end(crossfadelabel2, False, False) crossfadecheck = gtk.CheckButton(_("C_rossfade")) crossfadecheck.connect('toggled', self._crossfadecheck_toggled, crossfadespin, crossfadelabel2, crossfadelabel3) crossfadecheck.connect('toggled', cbs.crossfade_toggled, crossfadespin) crossfadecheck.set_active(self.config.xfade_enabled) crossfadecheck.toggled() # Force the toggled callback widgets = (as_checkbox, as_entries, display_notification, notifhbox, crossfadecheck, crossfadebox) table = gtk.Table(len(widgets), 1) table.set_col_spacings(12) table.set_row_spacings(6) for i, widget in enumerate(widgets): table.attach(widget, 0, 1, i, i+1, gtk.FILL|gtk.EXPAND, gtk.FILL) alignment = gtk.Alignment(0.5, 0.5, 1.0, 1.0) alignment.set_padding(12, 0, 12, 0) alignment.add(table) frame.add(alignment) tab = gtk.Alignment(0.5, 0.5, 1.0, 1.0) tab.set_padding(12, 12, 12, 12) tab.add(frame) as_checkbox.connect('toggled', self._as_enabled_toggled, as_user_entry, as_pass_entry, as_user_label, as_pass_label) if not self.config.as_enabled or not self.scrobbler.imported(): for widget in (as_user_entry, as_pass_entry, as_user_label, as_pass_label): widget.set_sensitive(False) return tab def display_tab(self, cbs): """Construct and layout the display tab""" displaylabel = ui.label(markup='<b>' + _('Display') + '</b>') frame = gtk.Frame() frame.set_label_widget(displaylabel) frame.set_shadow_type(gtk.SHADOW_NONE) art = gtk.CheckButton(_("_Album art")) art.set_active(self.config.show_covers) stylized_combo = ui.combo(items=[_("Standard"), _("Stylized")], active=self.config.covers_type, changed_cb=cbs.stylized_toggled) stylized_hbox = gtk.HBox(spacing=12) stylized_hbox.pack_end(stylized_combo, False, False) stylized_hbox.pack_end(ui.label( text=_("Artwork style:")), False, False) stylized_hbox.set_sensitive(self.config.show_covers) art_combo = ui.combo(items=[_("Local only"), _("Local and remote")], active=self.config.covers_pref) art_combo.connect('changed', self._config_widget_active, 'covers_pref') orderart_label = ui.label(text=_("Search locations:")) art_hbox = gtk.HBox(spacing=12) art_hbox.pack_end(art_combo, False, False) art_hbox.pack_end(orderart_label, False, False) art_hbox.set_sensitive(self.config.show_covers) art_paths = ["~/.covers/"] art_paths += ("%s/%s" % (_("SONG_DIR"), item) for item in ("cover.jpg", "album.jpg", "folder.jpg", _("custom"))) art_location = ui.combo(items=art_paths, active=self.config.art_location, changed_cb=self._art_location_changed) art_location_hbox = gtk.HBox(spacing=12) art_location_hbox.pack_end(art_location, False, False) art_location_hbox.pack_end(ui.label(text=_("Save art to:")), False, False) art_location_hbox.set_sensitive(self.config.show_covers) art.connect('toggled', cbs.art_toggled, art_hbox, art_location_hbox, stylized_hbox) playback = gtk.CheckButton(_("_Playback/volume buttons")) playback.set_active(self.config.show_playback) playback.connect('toggled', cbs.playback_toggled) progress = gtk.CheckButton(_("Pr_ogressbar")) progress.set_active(self.config.show_progress) progress.connect('toggled', cbs.progress_toggled) statusbar = gtk.CheckButton(_("_Statusbar")) statusbar.set_active(self.config.show_statusbar) statusbar.connect('toggled', cbs.statusbar_toggled) lyrics = gtk.CheckButton(_("Song Ly_rics")) lyrics.set_active(self.config.show_lyrics) savelyrics_label = ui.label(text=_("Save lyrics to:"), x=1) lyrics_location = ui.combo( items=["~/.lyrics/", _("SONG_DIR") + "/"], active=self.config.lyrics_location, changed_cb=self._lyrics_location_changed) lyrics_location_hbox = gtk.HBox(spacing=12) lyrics_location_hbox.pack_end(lyrics_location, False, False) lyrics_location_hbox.pack_end(savelyrics_label, False, False) lyrics_location_hbox.set_sensitive(self.config.show_lyrics) lyrics.connect('toggled', cbs.lyrics_toggled, lyrics_location_hbox) trayicon = gtk.CheckButton(_("System _tray icon")) self.display_trayicon = trayicon trayicon.set_active(self.config.show_trayicon) trayicon.set_sensitive(cbs.trayicon_available) widgets = (playback, progress, statusbar, trayicon, lyrics, lyrics_location_hbox, art, stylized_hbox, art_hbox, art_location_hbox) table = gtk.Table(len(widgets), 1, False) for i, widget in enumerate(widgets): table.attach(widget, 0, 1, i, i+1, gtk.FILL|gtk.EXPAND, gtk.FILL) alignment = gtk.Alignment(0.5, 0.5, 1.0, 1.0) alignment.set_padding(12, 0, 12, 0) alignment.add(table) frame.add(alignment) tab = gtk.Alignment(0.5, 0.5, 1.0, 1.0) tab.set_padding(12, 12, 12, 12) tab.add(frame) return tab def behavior_tab(self, cbs): """Construct and layout the behavior tab""" windowlabel = ui.label(markup='<b>'+_('Window Behavior')+'</b>') frame = gtk.Frame() frame.set_label_widget(windowlabel) frame.set_shadow_type(gtk.SHADOW_NONE) sticky = gtk.CheckButton(_("_Show window on all workspaces")) sticky.set_active(self.config.sticky) sticky.connect('toggled', cbs.sticky_toggled) ontop = gtk.CheckButton(_("_Keep window above other windows")) ontop.set_active(self.config.ontop) ontop.connect('toggled', cbs.ontop_toggled) decor = gtk.CheckButton(_("_Hide window titlebar")) decor.set_active(not self.config.decorated) decor.connect('toggled', cbs.decorated_toggled) minimize = gtk.CheckButton(_("_Minimize to system tray on close/escape")) minimize.set_active(self.config.minimize_to_systray) minimize.set_tooltip_text(_("If enabled, closing Sonata will minimize it to the system tray. Note that it's currently impossible to detect if there actually is a system tray, so only check this if you have one.")) minimize.connect('toggled', self._config_widget_active, 'minimize_to_systray') self.display_trayicon.connect('toggled', cbs.trayicon_toggled, minimize) minimize.set_sensitive(cbs.trayicon_in_use) widgets = (sticky, ontop, decor, minimize) table = gtk.Table(len(widgets), 1) for i, widget in enumerate(widgets): table.attach(widget, 0, 1, i, i+1, gtk.FILL|gtk.EXPAND, gtk.FILL) alignment = gtk.Alignment() alignment.set_padding(12, 0, 12, 0) alignment.add(table) frame.add(alignment) misclabel = ui.label(markup='<b>' + _('Miscellaneous') + '</b>') misc_frame = gtk.Frame() misc_frame.set_label_widget(misclabel) misc_frame.set_shadow_type(gtk.SHADOW_NONE) update_start = gtk.CheckButton(_("_Update MPD library on start")) update_start.set_active(self.config.update_on_start) update_start.set_tooltip_text(_("If enabled, Sonata will automatically update your MPD library when it starts up.")) update_start.connect('toggled', self._config_widget_active, 'update_on_start') exit_stop = gtk.CheckButton(_("S_top playback on exit")) exit_stop.set_active(self.config.stop_on_exit) exit_stop.set_tooltip_text(_("MPD allows playback even when the client is not open. If enabled, Sonata will behave like a more conventional music player and, instead, stop playback upon exit.")) exit_stop.connect('toggled', self._config_widget_active, 'stop_on_exit') infofile_usage = gtk.CheckButton(_("_Write status file:")) infofile_usage.set_active(self.config.use_infofile) infofile_usage.set_tooltip_text(_("If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)")) infopath_options = ui.entry(text=self.config.infofile_path) infopath_options.set_tooltip_text(_("If enabled, Sonata will create a xmms-infopipe like file containing information about the current song. Many applications support the xmms-info file (Instant Messengers, IRC Clients...)")) infopath_options.connect('focus_out_event', cbs.infofile_changed) infopath_options.connect('activate', cbs.infofile_changed, None) if not self.config.use_infofile: infopath_options.set_sensitive(False) infofile_usage.connect('toggled', self._infofile_toggled, infopath_options) infofilebox = gtk.HBox(spacing=6) infofilebox.pack_start(infofile_usage, False, False) infofilebox.pack_start(infopath_options, True, True) widgets = (update_start, exit_stop, infofilebox) misc_table = gtk.Table(len(widgets), 1) for i, widget in enumerate(widgets): misc_table.attach(widget, 0, 1, i, i+1, gtk.FILL|gtk.EXPAND, gtk.FILL) misc_alignment = gtk.Alignment() misc_alignment.set_padding(12, 0, 12, 0) misc_alignment.add(misc_table) misc_frame.add(misc_alignment) table = gtk.Table(2, 1) table.set_row_spacings(12) table.attach(frame, 0, 1, 0, 1, gtk.FILL|gtk.EXPAND, gtk.FILL) table.attach(misc_frame, 0, 1, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL) tab = gtk.Alignment() tab.set_padding(12, 12, 12, 12) tab.add(table) return tab def format_tab(self, cbs): """Construct and layout the format tab""" formatlabel = ui.label(markup='<b>'+_('Song Formatting')+'</b>') frame = gtk.Frame() frame.set_label_widget(formatlabel) frame.set_shadow_type(gtk.SHADOW_NONE) rows = [(_("C_urrent playlist:"), self.config.currentformat), (_("_Library:"), self.config.libraryformat), (_("_Window title:"), self.config.titleformat), (_("Current _song line 1:"), self.config.currsongformat1), (_("Current s_ong line 2:"), self.config.currsongformat2)] labels = [] entries = [] for label_text, entry_text in rows: label = ui.label(textmn=label_text) entry = ui.entry(text=entry_text) label.set_mnemonic_widget(entry) labels.append(label) entries.append(entry) entry_cbs = (cbs.currentoptions_changed, cbs.libraryoptions_changed, cbs.titleoptions_changed, cbs.currsongoptions1_changed, cbs.currsongoptions2_changed) for entry, cb, next in zip(entries, entry_cbs, entries[1:] + entries[:1]): entry.connect('focus_out_event', cb) entry.connect('activate', lambda _, n: n.grab_focus(), next) availableheading = ui.label(markup='<small>' + _('Available options') + ':</small>') availablevbox = gtk.VBox() availableformatbox = gtk.HBox() # XXX get these directly from the formatting function: formatcodes = [('A', _('Artist name')), ('B', _('Album name')), ('T', _('Track name')), ('N', _('Track number')), ('D', _('Disc number')), ('Y', _('Year')), ('G', _('Genre')), ('P', _('File path')), ('F', _('File name')), ('S', _('Stream name')), ('L', _('Song length')), ('E', _('Elapsed time (title only)'))] for codes in [formatcodes[:(len(formatcodes)+1)/2], formatcodes[(len(formatcodes)+1)/2:]]: rows = '\n'.join('<tt>%' + code + '</tt> - ' + help for code, help in codes) markup = '<small>' + rows + '</small>' formattinghelp = ui.label(markup=markup) availableformatbox.pack_start(formattinghelp) availablevbox.pack_start(availableformatbox, False, False, 0) additionalinfo = ui.label(markup='<small><tt>{ }</tt> - ' + _('Info displayed only if all enclosed tags are defined') + '\n<tt>|</tt> - ' + _('Creates columns in the current playlist') + '</small>') availablevbox.pack_start(additionalinfo, False, False, 4) num_rows = len(rows) + 2 table = gtk.Table(num_rows, 2) table.set_col_spacings(12) label_entries = enumerate(zip(labels, entries)) for i, (label, entry) in label_entries: table.attach(label, 0, 1, i, i+1, gtk.FILL) table.attach(entry, 1, 2, i, i+1) table.attach(availableheading, 0, 2, num_rows-2, num_rows-1, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 6) table.attach(availablevbox, 0, 2, num_rows-1, num_rows) alignment = gtk.Alignment(0.5, 0.5, 1.0, 1.0) alignment.set_padding(12, 0, 12, 0) alignment.add(table) frame.add(alignment) tab = gtk.Alignment(0.5, 0.5, 1.0, 1.0) tab.set_padding(12, 12, 12, 12) tab.add(frame) return tab def plugins_tab(self, cbs=None): """Construct and layout the plugins tab""" plugin_actions = ( ('plugin_about', gtk.STOCK_ABOUT, _('_About'), None, None, self.plugin_about), ('plugin_configure', gtk.STOCK_PREFERENCES, _('_Configure...'), None, None, self.plugin_configure)) uiDescription = """ <ui> <popup name="pluginmenu"> <menuitem action="plugin_configure"/> <menuitem action="plugin_about"/> </popup> </ui> """ self.plugin_UIManager = gtk.UIManager() actionGroup = gtk.ActionGroup('PluginActions') actionGroup.add_actions(plugin_actions) self.plugin_UIManager.insert_action_group(actionGroup, 0) self.plugin_UIManager.add_ui_from_string(uiDescription) self.pluginview = ui.treeview() self.pluginview.set_headers_visible(True) self.pluginselection = self.pluginview.get_selection() self.pluginselection.set_mode(gtk.SELECTION_SINGLE) self.pluginview.set_rules_hint(True) self.pluginview.set_property('can-focus', False) pluginwindow = ui.scrollwindow(add=self.pluginview) plugindata = gtk.ListStore(bool, gtk.gdk.Pixbuf, str) self.pluginview.set_model(plugindata) self.pluginview.connect('button-press-event', self.plugin_click) plugincheckcell = gtk.CellRendererToggle() plugincheckcell.set_property('activatable', True) plugincheckcell.connect('toggled', self.plugin_toggled, (plugindata, 0)) pluginpixbufcell = gtk.CellRendererPixbuf() plugintextcell = gtk.CellRendererText() plugincol0 = gtk.TreeViewColumn() self.pluginview.append_column(plugincol0) plugincol0.pack_start(plugincheckcell, True) plugincol0.set_attributes(plugincheckcell, active=0) plugincol0.set_title(" " + _("Enabled") + " ") plugincol1 = gtk.TreeViewColumn() self.pluginview.append_column(plugincol1) plugincol1.pack_start(pluginpixbufcell, False) plugincol1.pack_start(plugintextcell, True) plugincol1.set_attributes(pluginpixbufcell, pixbuf=1) plugincol1.set_attributes(plugintextcell, markup=2) plugincol1.set_title(_("Description")) plugindata.clear() for plugin in pluginsystem.get_info(): pb = self.plugin_get_icon_pixbuf(plugin) plugin_text = "<b> " + plugin.longname + "</b> " + plugin.version_string plugin_text += "\n " + plugin.description enabled = plugin.get_enabled() plugindata.append((enabled, pb, plugin_text)) return pluginwindow def _window_response(self, window, response): if response == gtk.RESPONSE_CLOSE: self.last_tab = self.prefsnotebook.get_current_page() #XXX: These two are probably never triggered if self.config.show_lyrics and self.config.lyrics_location != consts.LYRICS_LOCATION_HOME: if not os.path.isdir(misc.file_from_utf8(self.config.musicdir[self.config.profile_num])): ui.show_msg(self.window, _("To save lyrics to the music file's directory, you must specify a valid music directory."), _("Music Dir Verification"), 'musicdirVerificationError', gtk.BUTTONS_CLOSE) # Set music_dir entry focused: self.prefsnotebook.set_current_page(0) self.direntry.grab_focus() return if self.config.show_covers and self.config.art_location != consts.ART_LOCATION_HOMECOVERS: if not os.path.isdir(misc.file_from_utf8(self.config.musicdir[self.config.profile_num])): ui.show_msg(self.window, _("To save artwork to the music file's directory, you must specify a valid music directory."), _("Music Dir Verification"), 'musicdirVerificationError', gtk.BUTTONS_CLOSE) # Set music_dir entry focused: self.prefsnotebook.set_current_page(0) self.direntry.grab_focus() return if not self.using_mpd_env_vars: if self.prev_host != self.config.host[self.config.profile_num] or self.prev_port != self.config.port[self.config.profile_num] or self.prev_password != self.config.password[self.config.profile_num]: # Try to connect if mpd connection info has been updated: ui.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) self.reconnect() self.settings_save() self.populate_profiles_for_menu() ui.change_cursor(None) window.destroy() def _config_widget_active(self, widget, member): """Sets a config attribute to the widget's active value""" setattr(self.config, member, widget.get_active()) def _as_enabled_toggled(self, checkbox, *widgets): if checkbox.get_active(): self.scrobbler.import_module(True) if self.scrobbler.imported(): self.config.as_enabled = checkbox.get_active() self.scrobbler.init() for widget in widgets: widget.set_sensitive(self.config.as_enabled) elif checkbox.get_active(): checkbox.set_active(False) def _as_username_changed(self, entry): if self.scrobbler.imported(): self.config.as_username = entry.get_text() self.scrobbler.auth_changed() def _as_password_changed(self, entry): if self.scrobbler.imported(): self.config.as_password_md5 = hashlib.md5(entry.get_text()).hexdigest() self.scrobbler.auth_changed() def _nameentry_changed(self, entry, profile_combo, remove_profiles): if not self.updating_nameentry: profile_num = profile_combo.get_active() self.config.profile_names[profile_num] = entry.get_text() self._populate_profile_combo(profile_combo, profile_num, remove_profiles) def _hostentry_changed(self, entry, profile_combo): profile_num = profile_combo.get_active() self.config.host[profile_num] = entry.get_text() def _portentry_changed(self, entry, profile_combo): profile_num = profile_combo.get_active() self.config.port[profile_num] = entry.get_value_as_int() def _passwordentry_changed(self, entry, profile_combo): profile_num = profile_combo.get_active() self.config.password[profile_num] = entry.get_text() def _direntry_changed(self, entry, profile_combo): profile_num = profile_combo.get_active() self.config.musicdir[profile_num] = misc.sanitize_musicdir(entry.get_filename()) def _add_profile(self, _button, nameentry, profile_combo, remove_profiles): self.updating_nameentry = True profile_num = profile_combo.get_active() self.config.profile_names.append(_("New Profile")) nameentry.set_text(self.config.profile_names[-1]) self.updating_nameentry = False self.config.host.append(self.config.host[profile_num]) self.config.port.append(self.config.port[profile_num]) self.config.password.append(self.config.password[profile_num]) self.config.musicdir.append(self.config.musicdir[profile_num]) self._populate_profile_combo(profile_combo, len(self.config.profile_names)-1, remove_profiles) def _remove_profile(self, _button, profile_combo, remove_profiles): profile_num = profile_combo.get_active() if profile_num == self.config.profile_num: # Profile deleted, revert to first profile: self.config.profile_num = 0 self.reconnect(None) self.config.profile_names.pop(profile_num) self.config.host.pop(profile_num) self.config.port.pop(profile_num) self.config.password.pop(profile_num) self.config.musicdir.pop(profile_num) if profile_num > 0: self._populate_profile_combo(profile_combo, profile_num-1, remove_profiles) else: self._populate_profile_combo(profile_combo, 0, remove_profiles) def _profile_chosen(self, profile_combo, nameentry, hostentry, portentry, passwordentry, direntry): profile_num = profile_combo.get_active() self.updating_nameentry = True nameentry.set_text(str(self.config.profile_names[profile_num])) self.updating_nameentry = False hostentry.set_text(str(self.config.host[profile_num])) portentry.set_value(self.config.port[profile_num]) passwordentry.set_text(str(self.config.password[profile_num])) direntry.set_current_folder(misc.sanitize_musicdir(self.config.musicdir[profile_num])) def _populate_profile_combo(self, profile_combo, active_index, remove_profiles): new_model = gtk.ListStore(str) new_model.clear() profile_combo.set_model(new_model) for i, profile_name in enumerate(self.config.profile_names): combo_text = "[%s] %s" % (i+1, profile_name[:15]) if len(profile_name) > 15: combo_text += "..." profile_combo.append_text(combo_text) profile_combo.set_active(active_index) # Enable remove button if there is more than one profile remove_profiles.set_sensitive(len(self.config.profile_names) > 1) def _lyrics_location_changed(self, combobox): self.config.lyrics_location = combobox.get_active() def _art_location_changed(self, combobox): if combobox.get_active() == consts.ART_LOCATION_CUSTOM: # Prompt user for playlist name: dialog = ui.dialog(title=_("Custom Artwork"), parent=self.window, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), role='customArtwork', default=gtk.RESPONSE_ACCEPT) hbox = gtk.HBox() hbox.pack_start(ui.label(text=_('Artwork filename') + ':'), False, False, 5) entry = ui.entry() entry.set_activates_default(True) hbox.pack_start(entry, True, True, 5) dialog.vbox.pack_start(hbox) dialog.vbox.show_all() response = dialog.run() if response == gtk.RESPONSE_ACCEPT: self.config.art_location_custom_filename = entry.get_text().replace("/", "") else: # Revert to non-custom item in combobox: combobox.set_active(self.config.art_location) dialog.destroy() self.config.art_location = combobox.get_active() def _crossfadecheck_toggled(self, button, *widgets): button_active = button.get_active() for widget in widgets: widget.set_sensitive(button_active) def _notiflocation_changed(self, combobox): self.config.traytips_notifications_location = combobox.get_active() self.renotify() def _notiftime_changed(self, combobox): self.config.popup_option = combobox.get_active() self.renotify() def _infofile_toggled(self, button, infofileformatbox): self.config.use_infofile = button.get_active() infofileformatbox.set_sensitive(self.config.use_infofile) if self.config.use_infofile: self.reinfofile() def plugin_click(self, _widget, event): if event.button == 3: self.plugin_UIManager.get_widget('/pluginmenu').popup(None, None, None, event.button, event.time) def plugin_toggled(self, _renderer, path, user_data): model, column = user_data enabled = not model[path][column] plugin = pluginsystem.get_info()[int(path)] pluginsystem.set_enabled(plugin, enabled) if enabled: # test that the plugin loads or already was loaded if not plugin.force_loaded(): enabled = False pluginsystem.set_enabled(plugin, enabled) model[path][column] = enabled def plugin_about(self, _widget): plugin = self.plugin_get_selected() iconpb = self.plugin_get_icon_pixbuf(plugin) about_text = plugin.longname + "\n" + plugin.author + "\n" if len(plugin.author_email) > 0: about_text += "<" + plugin.author_email + ">" self.about_dialog = gtk.AboutDialog() self.about_dialog.set_name(plugin.longname) self.about_dialog.set_role('about') self.about_dialog.set_version(plugin.version_string) if len(plugin.description.strip()) > 0: self.about_dialog.set_comments(plugin.description) if len(plugin.author.strip()) > 0: author = plugin.author if len(plugin.author.strip()) > 0: author += ' <' + plugin.author_email + '>' self.about_dialog.set_authors([author]) if len(plugin.url.strip()) > 0: gtk.about_dialog_set_url_hook(self.plugin_show_website) self.about_dialog.set_website(plugin.url) self.about_dialog.set_logo(iconpb) self.about_dialog.connect('response', self.plugin_about_close) self.about_dialog.connect('delete_event', self.plugin_about_close) self.about_dialog.show_all() def plugin_about_close(self, _event, _data=None): self.about_dialog.hide() return True def plugin_show_website(self, _dialog, link): if not misc.browser_load(link, self.config.url_browser, self.window): ui.show_msg(self.window, _('Unable to launch a suitable browser.'), _('Launch Browser'), 'browserLoadError', gtk.BUTTONS_CLOSE) def plugin_configure(self, _widget): plugin = self.plugin_get_selected() ui.show_msg(self.prefswindow, "Nothing yet implemented.", "Configure", "pluginConfigure", gtk.BUTTONS_CLOSE) def plugin_get_selected(self): model, i = self.pluginselection.get_selected() plugin_num = model.get_path(i)[0] return pluginsystem.get_info()[plugin_num] def plugin_get_icon_pixbuf(self, plugin): pb = plugin.iconurl try: pb = gtk.gdk.pixbuf_new_from_file(pb) except: pb = self.pluginview.render_icon(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_LARGE_TOOLBAR) return pb ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/scrobbler.py������������������������������������������������������������������0000664�0000000�0000000�00000015650�11255764730�0017001�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This module makes Sonata submit the songs played to a Last.fm account. Example usage: import scrobbler self.scrobbler = scrobbler.Scrobbler(self.config) self.scrobbler.import_module() self.scrobbler.init() ... self.scrobbler.iterate() ... self.scrobbler.handle_change_status(False, self.prevsonginfo) """ import os, time, sys import threading # init, np, post start threads init_thread, do_np, do_post audioscrobbler = None # imported when first needed import mpdhelper as mpdh class Scrobbler(object): def __init__(self, config): self.config = config self.scrob = None self.scrob_post = None self.scrob_start_time = "" self.scrob_playing_duration = 0 self.scrob_last_prepared = "" self.scrob_time_now = None self.elapsed_now = None def import_module(self, _show_error=False): """Import the audioscrobbler module""" # We need to try to import audioscrobbler either when the app starts (if # as_enabled=True) or if the user enables it in prefs. global audioscrobbler if audioscrobbler is None: import audioscrobbler def imported(self): """Return True if the audioscrobbler module has been imported""" return audioscrobbler is not None def init(self): """Initialize the Audioscrobbler support if enabled and configured""" if audioscrobbler is not None and self.config.as_enabled and len(self.config.as_username) > 0 and len(self.config.as_password_md5) > 0: thread = threading.Thread(target=self.init_thread) thread.setDaemon(True) thread.start() def init_thread(self): if self.scrob is None: self.scrob = audioscrobbler.AudioScrobbler() if self.scrob_post is None: self.scrob_post = self.scrob.post(self.config.as_username, self.config.as_password_md5, verbose=True) else: if self.scrob_post.authenticated: return # We are authenticated else: self.scrob_post = self.scrob.post(self.config.as_username, self.config.as_password_md5, verbose=True) try: self.scrob_post.auth() except Exception, e: print "Error authenticating audioscrobbler", e self.scrob_post = None if self.scrob_post: self.retrieve_cache() def iterate(self): """Update the running time""" self.scrob_time_now = time.time() def handle_change_status(self, playing, prevsonginfo, songinfo=None, switched_from_stop_to_play=None, mpd_time_now=None): """Handle changes to play status, submitting info as appropriate""" if prevsonginfo and 'time' in prevsonginfo: prevsong_time = mpdh.get(prevsonginfo, 'time') else: prevsong_time = None if playing: elapsed_prev = self.elapsed_now self.elapsed_now, length = [float(c) for c in mpd_time_now.split(':')] current_file = mpdh.get(songinfo, 'file') if switched_from_stop_to_play: # Switched from stop to play, prepare current track: self.prepare(songinfo) elif (prevsong_time and (self.scrob_last_prepared != current_file or (self.scrob_last_prepared == current_file and elapsed_prev and abs(elapsed_prev-length)<=2 and self.elapsed_now<=2 and length>0))): # New song is playing, post previous track if time criteria is met. # In order to account for the situation where the same song is played twice in # a row, we will check if the previous time was the end of the song and we're # now at the beginning of the same song.. this technically isn't right in # the case where a user seeks back to the beginning, but that's an edge case. if self.scrob_playing_duration > 4 * 60 or self.scrob_playing_duration > int(prevsong_time)/2: if self.scrob_start_time != "": self.post(prevsonginfo) # Prepare current track: self.prepare(songinfo) elif self.scrob_time_now: # Keep track of the total amount of time that the current song # has been playing: self.scrob_playing_duration += time.time() - self.scrob_time_now else: # stopped: self.elapsed_now = 0 if prevsong_time: if self.scrob_playing_duration > 4 * 60 or self.scrob_playing_duration > int(prevsong_time)/2: # User stopped the client, post previous track if time # criteria is met: if self.scrob_start_time != "": self.post(prevsonginfo) def auth_changed(self): """Try to re-authenticate""" if self.scrob_post: if self.scrob_post.authenticated: self.scrob_post = None def prepare(self, songinfo): if audioscrobbler is not None: self.scrob_start_time = "" self.scrob_last_prepared = "" self.scrob_playing_duration = 0 if self.config.as_enabled and songinfo: # No need to check if the song is 30 seconds or longer, # audioscrobbler.py takes care of that. if 'time' in songinfo: self.np(songinfo) self.scrob_start_time = str(int(time.time())) self.scrob_last_prepared = mpdh.get(songinfo, 'file') def np(self, songinfo): thread = threading.Thread(target=self.do_np, args=(songinfo,)) thread.setDaemon(True) thread.start() def do_np(self, songinfo): self.init() if self.config.as_enabled and self.scrob_post and songinfo: if 'artist' in songinfo and \ 'title' in songinfo and \ 'time' in songinfo: if not 'album' in songinfo: album = u'' else: album = mpdh.get(songinfo, 'album') if not 'track' in songinfo: tracknumber = u'' else: tracknumber = mpdh.get(songinfo, 'track') try: self.scrob_post.nowplaying(mpdh.get(songinfo, 'artist'), mpdh.get(songinfo, 'title'), mpdh.get(songinfo, 'time'), tracknumber, album, self.scrob_start_time) except: print sys.exc_info()[1] time.sleep(10) def post(self, prevsonginfo): self.init() if self.config.as_enabled and self.scrob_post and prevsonginfo: if 'artist' in prevsonginfo and \ 'title' in prevsonginfo and \ 'time' in prevsonginfo: if not 'album' in prevsonginfo: album = u'' else: album = mpdh.get(prevsonginfo, 'album') if not 'track' in prevsonginfo: tracknumber = u'' else: tracknumber = mpdh.get(prevsonginfo, 'track') try: self.scrob_post.addtrack(mpdh.get(prevsonginfo, 'artist'), mpdh.get(prevsonginfo, 'title'), mpdh.get(prevsonginfo, 'time'), self.scrob_start_time, tracknumber, album) except: print sys.exc_info()[1] thread = threading.Thread(target=self.do_post) thread.setDaemon(True) thread.start() self.scrob_start_time = "" def do_post(self): for _i in range(0, 3): if not self.scrob_post: return if len(self.scrob_post.cache) == 0: return try: self.scrob_post.post() except audioscrobbler.AudioScrobblerConnectionError, e: print e time.sleep(10) def save_cache(self): """Save the cache in a file""" filename = os.path.expanduser('~/.config/sonata/ascache') if self.scrob_post: self.scrob_post.savecache(filename) def retrieve_cache(self): filename = os.path.expanduser('~/.config/sonata/ascache') if self.scrob_post: self.scrob_post.retrievecache(filename) ����������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/streams.py��������������������������������������������������������������������0000664�0000000�0000000�00000012220�11255764730�0016470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This module implements a user interface for bookmarking remote music streams. Example usage: import streams self.streams = streams.Streams(self.config, self.window, self.on_streams_button_press, self.on_add_item, self.settings_save, self.TAB_STREAMS) streamswindow, streamsevbox = self.streams.get_widgets() ... self.streams.populate() ... """ import gtk, pango import misc, ui class Streams(object): def __init__(self, config, window, on_streams_button_press, on_add_item, settings_save, TAB_STREAMS, new_tab): self.config = config self.window = window self.on_streams_button_press = on_streams_button_press self.on_add_item = on_add_item self.settings_save = settings_save # Streams tab self.streams = ui.treeview() self.streams_selection = self.streams.get_selection() self.streamswindow = ui.scrollwindow(add=self.streams) self.tab = new_tab(self.streamswindow, gtk.STOCK_NETWORK, TAB_STREAMS, self.streams) self.streams.connect('button_press_event', self.on_streams_button_press) self.streams.connect('row_activated', self.on_streams_activated) self.streams.connect('key-press-event', self.on_streams_key_press) # Initialize streams data and widget self.streamsdata = gtk.ListStore(str, str, str) self.streams.set_model(self.streamsdata) self.streams.set_search_column(1) self.streamsimg = gtk.CellRendererPixbuf() self.streamscell = gtk.CellRendererText() self.streamscell.set_property("ellipsize", pango.ELLIPSIZE_END) self.streamscolumn = gtk.TreeViewColumn() self.streamscolumn.pack_start(self.streamsimg, False) self.streamscolumn.pack_start(self.streamscell, True) self.streamscolumn.set_attributes(self.streamsimg, stock_id=0) self.streamscolumn.set_attributes(self.streamscell, markup=1) self.streams.append_column(self.streamscolumn) self.streams_selection.set_mode(gtk.SELECTION_MULTIPLE) def get_model(self): return self.streamsdata def get_widgets(self): return self.streamswindow def get_treeview(self): return self.streams def get_selection(self): return self.streams_selection def populate(self): self.streamsdata.clear() streamsinfo = [{'name' : misc.escape_html(name), 'uri' : misc.escape_html(uri)} for name, uri in zip(self.config.stream_names, self.config.stream_uris)] streamsinfo.sort(key=lambda x: x["name"].lower()) # Remove case sensitivity for item in streamsinfo: self.streamsdata.append([gtk.STOCK_NETWORK, item["name"], item["uri"]]) def on_streams_key_press(self, widget, event): if event.keyval == gtk.gdk.keyval_from_name('Return'): self.on_streams_activated(widget, widget.get_cursor()[0]) return True def on_streams_activated(self, _treeview, _path, _column=0): self.on_add_item(None) def on_streams_edit(self, action): model, selected = self.streams_selection.get_selected_rows() try: streamname = misc.unescape_html(model.get_value(model.get_iter(selected[0]), 1)) for i, name in enumerate(self.config.stream_names): if name == streamname: self.on_streams_new(action, i) return except: pass def on_streams_new(self, _action, stream_num=-1): if stream_num > -1: edit_mode = True else: edit_mode = False # Prompt user for playlist name: dialog = ui.dialog(title=None, parent=self.window, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), role="streamsNew") if edit_mode: dialog.set_title(_("Edit Stream")) else: dialog.set_title(_("New Stream")) hbox = gtk.HBox() namelabel = ui.label(text=_('Stream name') + ':') hbox.pack_start(namelabel, False, False, 5) nameentry = ui.entry() if edit_mode: nameentry.set_text(self.config.stream_names[stream_num]) hbox.pack_start(nameentry, True, True, 5) hbox2 = gtk.HBox() urllabel = ui.label(text=_('Stream URL') + ':') hbox2.pack_start(urllabel, False, False, 5) urlentry = ui.entry() if edit_mode: urlentry.set_text(self.config.stream_uris[stream_num]) hbox2.pack_start(urlentry, True, True, 5) ui.set_widths_equal([namelabel, urllabel]) dialog.vbox.pack_start(hbox) dialog.vbox.pack_start(hbox2) ui.show(dialog.vbox) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: name = nameentry.get_text() uri = urlentry.get_text() if len(name.decode('utf-8')) > 0 and len(uri.decode('utf-8')) > 0: # Make sure this stream name doesn't already exit: i = 0 for item in self.config.stream_names: # Prevent a name collision in edit_mode.. if not edit_mode or (edit_mode and i != stream_num): if item == name: dialog.destroy() if ui.show_msg(self.window, _("A stream with this name already exists. Would you like to replace it?"), _("New Stream"), 'newStreamError', gtk.BUTTONS_YES_NO) == gtk.RESPONSE_YES: # Pop existing stream: self.config.stream_names.pop(i) self.config.stream_uris.pop(i) else: return i = i + 1 if edit_mode: self.config.stream_names.pop(stream_num) self.config.stream_uris.pop(stream_num) self.config.stream_names.append(name) self.config.stream_uris.append(uri) self.populate() self.settings_save() dialog.destroy() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/svnversion.py�����������������������������������������������������������������0000664�0000000�0000000�00000001762�11255764730�0017237�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # in builds, the generated version module should be used instead import os, subprocess from xml.etree import ElementTree import sonata from consts import consts def find_svnrev(): dirname = os.path.dirname(os.path.dirname(sonata.__file__)) if not os.path.exists(os.path.join(dirname, '.svn')): return "1.6.2.1" try: output = subprocess.Popen(["svnversion", dirname], stdout=subprocess.PIPE, stderr=subprocess.PIPE ).communicate()[0] if output.strip(): return output.strip() except OSError: # svnversion fails to run pass # try next try: output = subprocess.Popen(["svn", "info", "--xml", dirname], stdout=subprocess.PIPE, stderr=subprocess.PIPE ).communicate()[0] info = ElementTree.fromstring(output) return info.find("entry").get("revision") except (OSError, # svn fails to run Exception, # no repo causes parsing svn info to fail AttributeError): # no <entry> for some reason pass # try next return None VERSION = "1.6.2.1" ��������������sonata-1.6.2.1/sonata/tagedit.py��������������������������������������������������������������������0000664�0000000�0000000�00000037424�11255764730�0016450�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ """ This module provides a user interface for editing the metadata tags of local music files. Example usage: import tagedit tageditor = tagedit.TagEditor(self.window, self.tags_mpd_update) tageditor.on_tags_edit(files, temp_mpdpaths, self.musicdir[self.profile_num]) """ import os import re import gtk, gobject tagpy = None # module loaded when needed import ui, misc class TagEditor(): """This class implements a dialog for editing music metadata tags. When the dialog closes, the callback gets the list of updates made. """ def __init__(self, window, tags_mpd_update, tags_set_use_mpdpath): self.window = window self.tags_mpd_update = tags_mpd_update self.tags_set_use_mpdpath = tags_set_use_mpdpath self.filelabel = None self.curr_mpdpath = None self.tagnum = None self.use_mpdpaths = None def _create_label_entry_button_hbox(self, label_name, track=False): """Creates a label, entry, apply all button, packing them into an hbox. This is usually one row in the tagedit dialog, for example the title. """ entry = ui.entry() button = ui.button() buttonvbox = self.tags_win_create_apply_all_button(button, entry, track) label = ui.label(text=label_name + ":", x=1) hbox = gtk.HBox() hbox.pack_start(label, False, False, 2) hbox.pack_start(entry, True, True, 2) hbox.pack_start(buttonvbox, False, False, 2) return (label, entry, button, hbox) def on_tags_edit(self, files, temp_mpdpaths, music_dir): """Display the editing dialog""" # Try loading module global tagpy if tagpy is None: try: import tagpy except ImportError: ui.show_msg(self.window, _("Taglib and/or tagpy not found, tag editing support disabled."), _("Edit Tags"), 'editTagsError', gtk.BUTTONS_CLOSE, response_cb=ui.dialog_destroy) ui.change_cursor(None) return # Set default tag encoding to utf8.. fixes some reported bugs. import tagpy.id3v2 as id3v2 id3v2.FrameFactory.instance().setDefaultTextEncoding(tagpy.StringType.UTF8) # Make sure tagpy is at least 0.91 if hasattr(tagpy.Tag.title, '__call__'): ui.show_msg(self.window, _("Tagpy version < 0.91. Please upgrade to a newer version, tag editing support disabled."), _("Edit Tags"), 'editTagsError', gtk.BUTTONS_CLOSE, response_cb=ui.dialog_destroy) ui.change_cursor(None) return if not os.path.isdir(misc.file_from_utf8(music_dir)): ui.show_msg(self.window, _("The path") + " " + music_dir + " " + _("does not exist. Please specify a valid music directory in preferences."), _("Edit Tags"), 'editTagsError', gtk.BUTTONS_CLOSE, response_cb=ui.dialog_destroy) ui.change_cursor(None) return # XXX file list was created here if len(files) == 0: ui.change_cursor(None) return # Initialize: self.tagnum = -1 tags = [{'title':'', 'artist':'', 'album':'', 'year':'', 'track':'', 'genre':'', 'comment':'', 'title-changed':False, 'artist-changed':False, 'album-changed':False, 'year-changed':False, 'track-changed':False, 'genre-changed':False, 'comment-changed':False, 'fullpath':misc.file_from_utf8(filename), 'mpdpath':path} for filename, path in zip(files, temp_mpdpaths)] if not os.path.exists(tags[0]['fullpath']): ui.change_cursor(None) ui.show_msg(self.window, _("File ") + "\"" + tags[0]['fullpath'] + "\"" + _(" not found. Please specify a valid music directory in preferences."), _("Edit Tags"), 'editTagsError', gtk.BUTTONS_CLOSE, response_cb=ui.dialog_destroy) return if not self.tags_next_tag(tags): ui.change_cursor(None) ui.show_msg(self.window, _("No music files with editable tags found."), _("Edit Tags"), 'editTagsError', gtk.BUTTONS_CLOSE, response_cb=ui.dialog_destroy) return editwindow = ui.dialog(parent=self.window, flags=gtk.DIALOG_MODAL, role='editTags', resizable=False, separator=False) editwindow.set_size_request(375, -1) table = gtk.Table(9, 2, False) table.set_row_spacings(2) self.filelabel = ui.label(select=True, wrap=True) filehbox = gtk.HBox() sonataicon = ui.image(stock='sonata', stocksize=gtk.ICON_SIZE_DND, x=1) expandbutton = ui.button(" ") self.set_expandbutton_state(expandbutton) expandvbox = gtk.VBox() expandvbox.pack_start(ui.label(), True, True) expandvbox.pack_start(expandbutton, False, False) expandvbox.pack_start(ui.label(), True, True) expandbutton.connect('clicked', self.toggle_path) blanklabel = ui.label(w=5, h=12) filehbox.pack_start(sonataicon, False, False, 2) filehbox.pack_start(self.filelabel, True, True, 2) filehbox.pack_start(expandvbox, False, False, 2) filehbox.pack_start(blanklabel, False, False, 2) titlelabel, titleentry, titlebutton, titlehbox = self._create_label_entry_button_hbox(_("Title")) artistlabel, artistentry, artistbutton, artisthbox = self._create_label_entry_button_hbox(_("Artist")) albumlabel, albumentry, albumbutton, albumhbox = self._create_label_entry_button_hbox(_("Album")) yearlabel, yearentry, yearbutton, yearhbox = self._create_label_entry_button_hbox(_("Year")) yearentry.set_size_request(50,-1) tracklabel, trackentry, trackbutton, trackhbox = self._create_label_entry_button_hbox(" " + _("Track"), True) trackentry.set_size_request(50,-1) yearandtrackhbox = gtk.HBox() yearandtrackhbox.pack_start(yearhbox, True, True, 0) yearandtrackhbox.pack_start(trackhbox, True, True, 0) yearentry.connect("insert_text", self.tags_win_entry_constraint, True) trackentry.connect("insert_text", self.tags_win_entry_constraint, False) genrelabel = ui.label(text=_("Genre") + ":", x=1) genrecombo = ui.comboentry(items=self.tags_win_genres(), wrap=2) genreentry = genrecombo.get_child() genrehbox = gtk.HBox() genrebutton = ui.button() genrebuttonvbox = self.tags_win_create_apply_all_button(genrebutton, genreentry) genrehbox.pack_start(genrelabel, False, False, 2) genrehbox.pack_start(genrecombo, True, True, 2) genrehbox.pack_start(genrebuttonvbox, False, False, 2) commentlabel, commententry, commentbutton, commenthbox = self._create_label_entry_button_hbox(_("Comment")) ui.set_widths_equal([titlelabel, artistlabel, albumlabel, yearlabel, genrelabel, commentlabel, sonataicon]) genrecombo.set_size_request(-1, titleentry.size_request()[1]) tablewidgets = [ui.label(), filehbox, ui.label(), titlehbox, artisthbox, albumhbox, yearandtrackhbox, genrehbox, commenthbox, ui.label()] for i, widget in enumerate(tablewidgets): table.attach(widget, 1, 2, i+1, i+2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 2, 0) editwindow.vbox.pack_start(table) saveall_button = None if len(files) > 1: # Only show save all button if more than one song being edited. saveall_button = ui.button(text=_("Save _All")) editwindow.action_area.pack_start(saveall_button) editwindow.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT) editwindow.add_button(gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT) editwindow.connect('delete_event', self.tags_win_hide, tags) entries = [titleentry, artistentry, albumentry, yearentry, trackentry, genreentry, commententry] buttons = [titlebutton, artistbutton, albumbutton, yearbutton, trackbutton, genrebutton, commentbutton] entries_names = ["title", "artist", "album", "year", "track", "genre", "comment"] editwindow.connect('response', self.tags_win_response, tags, entries, entries_names) if saveall_button: saveall_button.connect('clicked', self.tags_win_save_all, editwindow, tags, entries, entries_names) for button, name, entry in zip(buttons, entries_names, entries): entry.connect('changed', self.tags_win_entry_changed) button.connect('clicked', self.tags_win_apply_all, name, tags, entry) self.tags_win_update(editwindow, tags, entries, entries_names) ui.change_cursor(None) self.filelabel.set_size_request(editwindow.size_request()[0] - titlelabel.size_request()[0] - 70, -1) editwindow.show_all() def tags_next_tag(self, tags): # Returns true if next tag found (and self.tagnum is updated). # If no next tag found, returns False. while self.tagnum < len(tags)-1: self.tagnum = self.tagnum + 1 if os.path.exists(tags[self.tagnum]['fullpath']): try: fileref = tagpy.FileRef(tags[self.tagnum]['fullpath']) if not fileref.isNull(): return True except: pass return False def tags_win_entry_changed(self, editable): style = editable.get_style().copy() style.text[gtk.STATE_NORMAL] = editable.get_colormap().alloc_color("red") editable.set_style(style) def tags_win_entry_revert_color(self, editable): editable.set_style(None) def tags_win_create_apply_all_button(self, button, entry, autotrack=False): button.set_size_request(12, 12) if autotrack: button.set_tooltip_text(_("Increment each selected music file, starting at track 1 for this file.")) else: button.set_tooltip_text(_("Apply to all selected music files.")) padding = int((entry.size_request()[1] - button.size_request()[1])/2)+1 vbox = gtk.VBox(); vbox.pack_start(button, False, False, padding) return vbox def tags_win_apply_all(self, _button, item, tags, entry): for tagnum, tag in enumerate(tags): tagnum = tagnum + 1 if item in ("title", "album", "artist", "genre", "comment"): tag[item] = entry.get_text() tag[item + '-changed'] = True elif item == "year": if len(entry.get_text()) > 0: tag['year'] = int(entry.get_text()) else: tag['year'] = 0 tag['year-changed'] = True elif item == "track": if tagnum >= self.tagnum-1: # Start the current song at track 1, as opposed to the first # song in the list. tag['track'] = tagnum - self.tagnum tag['track-changed'] = True if item == "track": # Update the entry for the current song: entry.set_text(str(tags[self.tagnum]['track'])) def tags_win_update(self, window, tags, entries, entries_names): current_tag = tags[self.tagnum] tag = tagpy.FileRef(current_tag['fullpath']).tag() # Update interface: for entry, entry_name in zip(entries, entries_names): # Only retrieve info from the file if the info hasn't changed if not current_tag[entry_name + "-changed"]: current_tag[entry_name] = getattr(tag, entry_name, '') tag_value = current_tag[entry_name] if tag_value == 0: tag_value = '' entry.set_text(str(tag_value).strip()) # Revert text color if this tag wasn't changed by the user if not current_tag[entry_name + "-changed"]: self.tags_win_entry_revert_color(entry) self.curr_mpdpath = gobject.filename_display_name(current_tag['mpdpath']) filename = self.curr_mpdpath if not self.use_mpdpaths: filename = os.path.basename(filename) self.filelabel.set_text(filename) entries[0].grab_focus() window.set_title(_("Edit Tags") + " - " + str(self.tagnum+1) + " " + _("of") + " " + str(len(tags))) self.tags_win_set_sensitive(window.action_area) def tags_win_set_sensitive(self, action_area): # Hacky workaround to allow the user to click the save button again when the # mouse stays over the button (see http://bugzilla.gnome.org/show_bug.cgi?id=56070) action_area.set_sensitive(True) action_area.hide() action_area.show_all() def tags_win_save_all(self, _button, window, tags, entries, entries_names): for entry in entries: entry.set_property('editable', False) while window.get_property('visible'): self.tags_win_response(window, gtk.RESPONSE_ACCEPT, tags, entries, entries_names) def tags_win_response(self, window, response, tags, entries, entries_names): if response == gtk.RESPONSE_REJECT: self.tags_win_hide(window, None, tags) elif response == gtk.RESPONSE_ACCEPT: window.action_area.set_sensitive(False) while window.action_area.get_property("sensitive") or gtk.events_pending(): gtk.main_iteration() filetag = tagpy.FileRef(tags[self.tagnum]['fullpath']) tag = filetag.tag() # Set tag fields according to entry text for entry, field in zip(entries, entries_names): tag_value = entry.get_text().strip() if field in ('year', 'track'): if len(tag_value) == 0: tag_value = '0' tag_value = int(tag_value) if field is 'comment': if len(tag_value) == 0: tag_value = ' ' setattr(tag, field, tag_value) save_success = filetag.save() if not (save_success): # FIXME: was (save_success and self.conn and self.status): ui.show_msg(self.window, _("Unable to save tag to music file."), _("Edit Tags"), 'editTagsError', gtk.BUTTONS_CLOSE, response_cb=ui.dialog_destroy) if self.tags_next_tag(tags): # Next file: self.tags_win_update(window, tags, entries, entries_names) else: # No more (valid) files: self.tagnum = self.tagnum + 1 # To ensure we update the last file in tags_mpd_update self.tags_win_hide(window, None, tags) def tags_win_hide(self, window, _data, tags): tag_paths = (tag['mpdpath'] for tag in tags[:self.tagnum]) gobject.idle_add(self.tags_mpd_update, tag_paths) window.destroy() self.tags_set_use_mpdpath(self.use_mpdpaths) def tags_win_genres(self): return ["", "A Cappella", "Acid", "Acid Jazz", "Acid Punk", "Acoustic", "Alt. Rock", "Alternative", "Ambient", "Anime", "Avantgarde", "Ballad", "Bass", "Beat", "Bebob", "Big Band", "Black Metal", "Bluegrass", "Blues", "Booty Bass", "BritPop", "Cabaret", "Celtic", "Chamber music", "Chanson", "Chorus", "Christian Gangsta Rap", "Christian Rap", "Christian Rock", "Classic Rock", "Classical", "Club", "Club-House", "Comedy", "Contemporary Christian", "Country", "Crossover", "Cult", "Dance", "Dance Hall", "Darkwave", "Death Metal", "Disco", "Dream", "Drum & Bass", "Drum Solo", "Duet", "Easy Listening", "Electronic", "Ethnic", "Euro-House", "Euro-Techno", "Eurodance", "Fast Fusion", "Folk", "Folk-Rock", "Folklore", "Freestyle", "Funk", "Fusion", "Game", "Gangsta", "Goa", "Gospel", "Gothic", "Gothic Rock", "Grunge", "Hard Rock", "Hardcore", "Heavy Metal", "Hip-Hop", "House", "Humour", "Indie", "Industrial", "Instrumental", "Instrumental pop", "Instrumental rock", "JPop", "Jazz", "Jazz+Funk", "Jungle", "Latin", "Lo-Fi", "Meditative", "Merengue", "Metal", "Musical", "National Folk", "Native American", "Negerpunk", "New Age", "New Wave", "Noise", "Oldies", "Opera", "Other", "Polka", "Polsk Punk", "Pop", "Pop-Folk", "Pop/Funk", "Porn Groove", "Power Ballad", "Pranks", "Primus", "Progressive Rock", "Psychedelic", "Psychedelic Rock", "Punk", "Punk Rock", "R&B", "Rap", "Rave", "Reggae", "Retro", "Revival", "Rhythmic soul", "Rock", "Rock & Roll", "Salsa", "Samba", "Satire", "Showtunes", "Ska", "Slow Jam", "Slow Rock", "Sonata", "Soul", "Sound Clip", "Soundtrack", "Southern Rock", "Space", "Speech", "Swing", "Symphonic Rock", "Symphony", "Synthpop", "Tango", "Techno", "Techno-Industrial", "Terror", "Thrash Metal", "Top 40", "Trailer"] def tags_win_entry_constraint(self, entry, new_text, _new_text_length, _broken_position, isyearlabel): entry_chars = entry.get_text() pos = entry.get_position() proposed_text = entry_chars[:pos] + new_text + entry_chars[pos:] # get the correct regular expression expr = r'(0|[1-9][0-9]{0,3})$' if isyearlabel else r'(0|[1-9][0-9]*)$' expr = re.compile(expr) if not expr.match(proposed_text): # deny entry.stop_emission("insert-text") def toggle_path(self, button): self.use_mpdpaths = not self.use_mpdpaths if self.use_mpdpaths: self.filelabel.set_text(self.curr_mpdpath) else: self.filelabel.set_text(os.path.basename(self.curr_mpdpath)) self.set_expandbutton_state(button) def set_expandbutton_state(self, button): if self.use_mpdpaths: button.get_child().set_markup('<small><</small>') button.set_tooltip_text(_("Hide file path")) else: button.get_child().set_markup('<small>></small>') button.set_tooltip_text(_("Show file path")) def set_use_mpdpaths(self, use_mpdpaths): self.use_mpdpaths = use_mpdpaths ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/tray.py�����������������������������������������������������������������������0000664�0000000�0000000�00000010026�11255764730�0015773�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import gtk, gobject class TrayIconTips(gtk.Window): """Custom tooltips derived from gtk.Window() that allow for markup text and multiple widgets, e.g. a progress bar. ;)""" MARGIN = 4 def __init__(self): gtk.Window.__init__(self, gtk.WINDOW_POPUP) # from gtktooltips.c:gtk_tooltips_force_window self.set_app_paintable(True) self.set_resizable(False) self.set_name("gtk-tooltips") self.connect('expose-event', self._on__expose_event) self._show_timeout_id = -1 self.timer_tag = None self.notif_handler = None self.use_notifications_location = False self.notifications_location = 0 self.widget = None def _calculate_pos(self, widget): if widget is not None: try: x, y = widget.window.get_origin() if widget.flags() & gtk.NO_WINDOW: x += widget.allocation.x y += widget.allocation.y height = widget.allocation.height except: _icon_screen, icon_rect, _icon_orient = widget.get_geometry() x = icon_rect[0] y = icon_rect[1] height = icon_rect[3] w, h = self.size_request() screen = self.get_screen() pointer_screen, px, py, _ = screen.get_display().get_pointer() if pointer_screen != screen: px = x py = y try: # Use the monitor that the systemtray icon is on monitor_num = screen.get_monitor_at_point(x, y) except: # No systemtray icon, use the monitor that the pointer is on monitor_num = screen.get_monitor_at_point(px, py) monitor = screen.get_monitor_geometry(monitor_num) try: # If the tooltip goes off the screen horizontally, realign it so that # it all displays. if (x + w) > monitor.x + monitor.width: x = monitor.x + monitor.width - w # If the tooltip goes off the screen vertically (i.e. the system tray # icon is on the bottom of the screen), realign the icon so that it # shows above the icon. if ((y + h + height + self.MARGIN) > monitor.y + monitor.height): y = y - h - self.MARGIN else: y = y + height + self.MARGIN except: pass if not self.use_notifications_location: try: return x, y except: #Fallback to top-left: return monitor.x, monitor.y elif self.notifications_location == 0: try: return x, y except: #Fallback to top-left: return monitor.x, monitor.y elif self.notifications_location == 1: return monitor.x, monitor.y elif self.notifications_location == 2: return monitor.x + monitor.width - w, monitor.y elif self.notifications_location == 3: return monitor.x, monitor.y + monitor.height - h elif self.notifications_location == 4: return monitor.x + monitor.width - w, monitor.y + monitor.height - h elif self.notifications_location == 5: return monitor.x + (monitor.width - w)/2, monitor.y + (monitor.height - h)/2 def _event_handler (self, widget): widget.connect_after("event-after", self._motion_cb) def _motion_cb (self, widget, event): if self.notif_handler != None: return if event.type == gtk.gdk.LEAVE_NOTIFY: self._remove_timer() if event.type == gtk.gdk.ENTER_NOTIFY: self._start_delay(widget) def _start_delay (self, widget): self.timer_tag = gobject.timeout_add(500, self._tips_timeout, widget) def _tips_timeout (self, widget): self.use_notifications_location = False self._real_display(widget) def _remove_timer(self): self.hide() if self.timer_tag: gobject.source_remove(self.timer_tag) self.timer_tag = None # from gtktooltips.c:gtk_tooltips_paint_window def _on__expose_event(self, window, _event): w, h = window.size_request() window.style.paint_flat_box(window.window, gtk.STATE_NORMAL, gtk.SHADOW_OUT, None, window, "tooltip", 0, 0, w, h) return False def _real_display(self, widget): x, y = self._calculate_pos(widget) self.move(x, y) self.show() # Public API def hide(self): gtk.Window.hide(self) gobject.source_remove(self._show_timeout_id) self._show_timeout_id = -1 self.notif_handler = None def set_tip (self, widget): self.widget = widget self._event_handler (self.widget) def add_widget (self, widget_to_add): self.add(widget_to_add) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sonata-1.6.2.1/sonata/ui.py�������������������������������������������������������������������������0000664�0000000�0000000�00000015433�11255764730�0015440�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import gtk, sys, pango def label(text=None, textmn=None, markup=None, x=0, y=0.5, \ wrap=False, select=False, w=-1, h=-1): # Defaults to left-aligned, vertically centered tmplabel = gtk.Label() if text: tmplabel.set_text(text) elif markup: tmplabel.set_markup(markup) elif textmn: tmplabel.set_text_with_mnemonic(textmn) tmplabel.set_alignment(x, y) tmplabel.set_size_request(w, h) tmplabel.set_line_wrap(wrap) try: # Only recent versions of pygtk/gtk have this tmplabel.set_line_wrap_mode(pango.WRAP_WORD_CHAR) except: pass tmplabel.set_selectable(select) return tmplabel def expander(text=None, markup=None, expand=False, can_focus=True): tmpexp = gtk.Expander() if text: tmpexp.set_label(text) elif markup: tmpexp.set_label(markup) tmpexp.set_use_markup(True) tmpexp.set_expanded(expand) tmpexp.set_property('can-focus', can_focus) return tmpexp def eventbox(visible=False, add=None, w=-1, h=-1, state=None): tmpevbox = gtk.EventBox() tmpevbox.set_visible_window(visible) tmpevbox.set_size_request(w, h) if state: tmpevbox.set_state(state) if add: tmpevbox.add(add) return tmpevbox def button(text=None, stock=None, relief=None, can_focus=True, \ hidetxt=False, img=None, w=-1, h=-1): tmpbut = gtk.Button() if text: tmpbut.set_label(text) elif stock: tmpbut.set_label(stock) tmpbut.set_use_stock(True) tmpbut.set_use_underline(True) if img: tmpbut.set_image(img) if relief: tmpbut.set_relief(relief) tmpbut.set_property('can-focus', can_focus) if hidetxt: tmpbut.get_child().get_child().get_children()[1].set_text('') tmpbut.set_size_request(w, h) return tmpbut def combo(items=None, active=None, changed_cb=None, wrap=1): tmpcb = gtk.combo_box_new_text() tmpcb = _combo_common(tmpcb, items, active, changed_cb, wrap) return tmpcb def comboentry(items=None, active=None, changed_cb=None, wrap=1): tmpcbe = gtk.combo_box_entry_new_text() tmpcbe = _combo_common(tmpcbe, items, active, changed_cb, wrap) return tmpcbe def _combo_common(combobox, items, active, changed_cb, wrap): if items: for item in items: combobox.append_text(item) if active is not None: combobox.set_active(active) if changed_cb: combobox.connect('changed', changed_cb) combobox.set_wrap_width(wrap) return combobox def togglebutton(text=None, underline=False, relief=gtk.RELIEF_NORMAL, \ can_focus=True): tmptbut = gtk.ToggleButton() if text: tmptbut.set_label(text) tmptbut.set_use_underline(underline) tmptbut.set_relief(relief) tmptbut.set_property('can-focus', can_focus) return tmptbut def image(stock=None, stocksize=gtk.ICON_SIZE_MENU, w=-1, h=-1, \ x=0.5, y=0.5, pb=None): if stock: tmpimg = gtk.image_new_from_stock(stock, stocksize) elif pb: tmpimg = gtk.image_new_from_pixbuf(pb) else: tmpimg = gtk.Image() tmpimg.set_size_request(w, h) tmpimg.set_alignment(x, y) return tmpimg def progressbar(orient=None, frac=None, step=None, ellipsize=None): tmpprog = gtk.ProgressBar() if orient: tmpprog.set_orientation(orient) if frac: tmpprog.set_fraction(frac) if step: tmpprog.set_pulse_step(step) if ellipsize: tmpprog.set_ellipsize(ellipsize) return tmpprog def scrollwindow(policy_x=gtk.POLICY_AUTOMATIC, policy_y=gtk.POLICY_AUTOMATIC, \ shadow=gtk.SHADOW_IN, w=-1, h=-1, add=None, addvp=None): tmpsw = gtk.ScrolledWindow() tmpsw.set_policy(policy_x, policy_y) tmpsw.set_shadow_type(shadow) tmpsw.set_size_request(w, h) if add: tmpsw.add(add) elif addvp: tmpsw.add_with_viewport(addvp) return tmpsw def dialog(title=None, parent=None, flags=0, buttons=None, default=None, \ separator=True, resizable=True, w=-1, h=-1, role=None): tmpdialog = gtk.Dialog(title, parent, flags, buttons) if default is not None: tmpdialog.set_default_response(default) tmpdialog.set_has_separator(separator) tmpdialog.set_resizable(resizable) tmpdialog.set_size_request(w, h) if role: tmpdialog.set_role(role) return tmpdialog def entry(text=None, password=False, w=-1, h=-1, changed_cb=None): tmpentry = UnicodeEntry() if text: tmpentry.set_text(text) if password: tmpentry.set_visibility(False) tmpentry.set_size_request(w, h) if changed_cb: tmpentry.connect('changed', changed_cb) return tmpentry class UnicodeEntry(gtk.Entry): def get_text(self): try: return gtk.Entry.get_text(self).decode('utf-8') except: print sys.exc_info()[1] return gtk.Entry.get_text(self).decode('utf-8', 'replace') def treeview(hint=True, reorder=False, search=True, headers=False): tmptv = gtk.TreeView() tmptv.set_rules_hint(hint) tmptv.set_reorderable(reorder) tmptv.set_enable_search(search) tmptv.set_headers_visible(headers) return tmptv def iconview(col=None, space=None, margin=None, itemw=None, selmode=None): tmpiv = gtk.IconView() if col: tmpiv.set_columns(col) if space: tmpiv.set_spacing(space) if margin: tmpiv.set_margin(margin) if itemw: tmpiv.set_item_width(itemw) if selmode: tmpiv.set_selection_mode(selmode) return tmpiv def show_msg(owner, message, title, role, buttons, default=None, response_cb=None): is_button_list = hasattr(buttons, '__getitem__') if not is_button_list: messagedialog = gtk.MessageDialog(owner, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, buttons, message) else: messagedialog = gtk.MessageDialog(owner, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, message_format=message) i = 0 while i < len(buttons): messagedialog.add_button(buttons[i], buttons[i+1]) i += 2 messagedialog.set_title(title) messagedialog.set_role(role) if default is not None: messagedialog.set_default_response(default) if response_cb: messagedialog.connect("response", response_cb) response = messagedialog.run() value = response messagedialog.destroy() return value def dialog_destroy(dialog_widget, _response_id): dialog_widget.destroy() def show(widget): widget.set_no_show_all(False) widget.show_all() def hide(widget): widget.hide_all() widget.set_no_show_all(True) def focus(widget): widget.grab_focus() def set_widths_equal(widgets): # Assigns the same width to all passed widgets in the list, where # the width is the maximum width across widgets. max_width = 0 for widget in widgets: if widget.size_request()[0] > max_width: max_width = widget.size_request()[0] for widget in widgets: widget.set_size_request(max_width, -1) def icon(factory, icon_name, path): # Either the file or fullpath must be supplied, but not both: sonataset = gtk.IconSet() filename = [path] icons = [gtk.IconSource() for i in filename] for i, iconsource in enumerate(icons): iconsource.set_filename(filename[i]) sonataset.add_source(iconsource) factory.add(icon_name, sonataset) factory.add_default() def change_cursor(cursortype): for i in gtk.gdk.window_get_toplevels(): i.set_cursor(cursortype) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������